二、實現軟體i2c
測試總結
連線到匯流排的ic數量只受到匯流排的最大電容400pf的限制。
每個連線到匯流排的裝置都有唯一的位址
資料的傳輸遵循圖 10 所示的格式。在起始條件(s)後 傳送了乙個從機位址。 這個位址共有 7 位,緊接著的第 8 位是資料方向位(r/ w)— 『0』表示傳送(寫),『1』表示請求資料(讀)。資料傳輸一般由主機產生的停止位(p)終止
根據上述i2c匯流排規範的內容一步步實現軟體i2c通訊的**
這裡以stm32f103為例編寫實現**
主要包含引腳定義,和一些便於io操作的巨集。
#include
"stm32f10x.h"
#define i2c_gpio_port gpiob
#define i2c_gpio_clk rcc_apb2periph_gpiob
#define i2c_scl_pin gpio_pin_6
#define i2c_sda_pin gpio_pin_7
#define high ((uint32_t)1)
#define low (uint32_t)0
#define scl_output(x) if(x == 0) rda5807m_gpio_port->brr = rda5807m_scl_pin; else rda5807m_gpio_port->bsrr = rda5807m_scl_pin
#define sda_output(x) if(x == 0) rda5807m_gpio_port->brr = rda5807m_sda_pin; else rda5807m_gpio_port->bsrr = rda5807m_sda_pin
#define sda_input() rda5807m_gpio_port->idr & rda5807m_sda_pin
後面會用到的延時函式。後面可以通過更改延時時間的長短調整i2c通訊的頻率。
void
i2c_delay
(void
)
初始化用到的gpio引腳,配置為開漏輸出,並分別釋放sda匯流排和scl匯流排(即將匯流排設定為高電平)
static
void
i2c_init
(void
)
實現起始訊號:scl線是高電平時,sda線從高電平向低電平切換
void
i2c_start
(void
)
實現停止條件:scl線是高電平時,sda線從低電平向高電平切換![](https://pic.w3help.cc/8a8/389fe34dde278eea2e4ce3430e5dc.jpeg)
static
void
i2c_stop
(void
)
實現主機向從機傳送ack或nack響應的函式,當主機作為接收器時才會用到。主機作為接收器時,從機每向主機傳送乙個位元組的資料主機便需要向從機傳送乙個響應(ack/nack)。
ack:scl時鐘處於高電平期間,sda保持低電平
nack:scl時鐘處於高電平期間,sda保持高電平
static
void
i2c_ack
(void
)static
void
i2c_nack
(void
)
主機作為傳送器時,在傳送完乙個位元組的資料後需要等待從機發來的響應訊號(ack/nack)。
uint8_t i2c_waitack
(void
)
實現主機傳送乙個位元組的資料到從機。sda 線上的資料必須在時鐘的高電平週期保持穩定.資料線的高或低電平狀態只有在 scl 線的時鐘訊號是低電平時才能改變![](https://pic.w3help.cc/07a/cc537c102f3e72d76cb593f14b660.jpeg)
void
i2c_writebyte
(uint8_t byte)
else
byte <<=1;
i2c_delay()
;scl_output
(high)
;i2c_delay()
;i2c_delay()
;}scl_output
(low)
;//sda_output(high);
}
實現主機接收從機發來的乙個位元組資料。
static uint8_t i2c_readbyte
(void
)i2c_delay()
;}scl_output
(low)
;return byte;
}
通過該軟體i2c向rda5807收音機模組中寫入和讀出資料來測試該協議是否可用!
移植上面部落格中的讀寫rda5807暫存器的函式
void
rda5807_writereg
(u8 reg_addr, u16 value)
//讀寫暫存器
unsigned
intrda5807_readreg
(u8 reg_addr)
通過軟體i2c向rda5807收音機模組寫入資料:(向0x06暫存器寫入0x1111)。通過邏輯分析儀測得的寫入時序如下:
通過軟體i2c讀出之前寫入的資料:(讀取0x06暫存器的值)。通過邏輯分析儀測得的寫入時序如下:
從邏輯分析儀的分析結果可以看出,當前軟體i2c的通訊速度約為90khz(即90kbit/s,乙個時鐘週期傳輸乙個資料)
最原始的資料才是最好的資料,學習i2c認真看《i2c匯流排協議》才是王道。
一步步學習電子維修
一步步學習電子維修 第一節 電是什麼 1 電子技術,很多人感興趣,不過入門卻非常困難,我總結了下原因,1 屬於微觀,看不見摸不著 2 缺少實際動手環境 3 學校教育或培訓教育問題,填鴨式的灌輸,越來越煩,最終一點興趣也沒有了。2 針對以上問題,這裡都有絕招解決,俗話說一招鮮,吃遍天,看到這篇文章的同...
freeRTOS 一步步學習(二)
freertos 一步步學習 二 任務狀態 應用程式可以包含多個任務。如果執行應用程式的微控制器只有乙個核 core 那麼在任意給定時間,實際上只會有乙個任務被執行。這就意味著乙個任務可以有乙個或 兩個狀態,即執行狀態和非執行狀態。freertos 的排程器是能讓任務切入切出的唯一實體。任務建立 x...
freeRTOS 一步步學習(三)
freertos 一步步學習 二 任務 狀態 阻塞狀態 如果乙個任務正在等待某個事件,則稱這個任務處於 阻塞態 blocked 阻塞態是非執行態的乙個子狀態。任務可以在進入阻塞態以等待同步事件時指定乙個等待超時時間,這樣可以有效地實現阻塞狀態下同時等待兩種型別的事件。xtickstodelay 延遲...