之前工作中使用了一些常見的介面協議,為了防止遺忘和加深記憶,後續會陸陸續續講解分析各種常見的介面協議(如:i2c、spi、usart等)。由於最近專案需求,需要使用ht16c22液晶驅動晶元,而這款晶元和mcu通訊使用的是i2c介面,所以本文首先以ht16c22入手,分析i2c介面協議。
對於初學者你是不是也有這種疑惑,這些常見介面協議看那些協議的資料總是雲裡霧裡,不知所云,看了就忘。本人剛學也有這種困惑,為了解決這種現狀你必須得實際動手去實踐,在實踐中摸索分析才能真正理解。
你可能需要的兩個最基本的概念:
起始訊號:當 scl 線是高電平時 sda 線從高電平向低電平切換。
停止訊號:當 scl 線是高電平時 sda 線由低電平向高電平切換。
2.1 起始訊號**
//產生iic起始訊號
void iic_start(void)
2.2 停止訊號**
//產生iic停止訊號
void iic_stop(void)
2.3 cpu產生乙個ack訊號
//等待應答訊號到來
//返回值:1,接收應答失敗
// 0,接收應答成功
uint8_t iic_wait_ack(void)
} iic_scl=0;//時鐘輸出0
return 0;
}
2.4 cpu向i2c匯流排裝置傳送乙個位元組(8bit)資料
//iic傳送乙個位元組
//返回從機有無應答
//1,有應答
//0,無應答
void iic_send_byte(uint8_t txd)
else iic_sda=0;
txd<<=1;
delay_us(2);
iic_scl=1;
delay_us(2);
iic_scl=0;
delay_us(2);
} }
除了以上幾個基本函式外,還有幾個常用函式在這裡由於不參與分析就不列舉了。 在以上幾個函式的基礎上,我們再來具體分析ht16c22的初始化過程。
首先用示波器抓取ht16c22初始化過程的波形曲線:
//ht16c22初始化
void ht16c22_init(void)
我們可以把上面這個過程拆分為10個階段 。
① 起始空閒階段。
這個階段中scl和sda都處於高電平;
②起始訊號(mcu開始往ht16c22傳送資料)
這個階段中,scl保持高電平不變,而sda由高電平跳變至低電平;
③傳送ht16c22的器件位址和i2c寫資料指令
在這個階段中,scl每次跳變至高電平時,會將sda資料傳送給ht16c22。從圖中可以看出發給ht16c22的資料為01111110。其中第一位至七位為ht16c22器件位址(0x7e),第一位為0表示:寫資料指令。
④等待返回ack
這個階段中,mcu等待ht16c22返回低電平表示資料接收成功。
⑤傳送0x8c
這個階段將資料0x8c傳送給ht16c22,至於為什麼是0x8c感興趣可以翻看ht16c22手冊。
⑥等待返回ack
同第④⑦傳送0xc0
這個階段將資料0xc0傳送給ht16c22,至於為什麼是0xc0感興趣可以翻看ht16c22手冊。
⑧等待返回ack
同第④⑨結束訊號
這個階段中,scl保持高電平不變,而sda由低電平跳變至高電平;
⑩空閒階段
此階段同起始空閒階段;
自此,ht16c22初始化資料成功被mcu傳送給ht16c22。
協議理解之I2C協議
協議我們參考 eeprom 24c64的datasheet 速度 標準模式下可以達到100kbit s 快速模式下可以達到400kbit s 高速模式下可以達到3.4mbit s i2c匯流排術語 傳送器 傳送資料到匯流排的器件 接收器 從匯流排接收資料的器件 主機 初始化傳送 產生時鐘訊號和終止傳...
I2C協議解析
1 基本概念 主機 初始化傳送,產生時鐘訊號和終止傳送的器件 從機 被主機定址的器件 傳送器 傳送資料到匯流排的器件 接收器 從匯流排接收資料的器件 多主機 同時有多於乙個主機嘗試控制匯流排 但不破壞報文 仲裁 是乙個在有多個主機同時嘗試控制匯流排,但只允許其中乙個控制匯流排並使報文不被破壞的過程 ...
i2c 協議解析
1 基本概念 主機 初始化傳送,產生時鐘訊號和終止傳送的器件 從機 被主機定址的器件 傳送器 傳送資料到匯流排的器件 接收器 從匯流排接收資料的器件 多主機 同時有多於乙個主機嘗試控制匯流排 但不破壞報文 仲裁 是乙個在有多個主機同時嘗試控制匯流排,但只允許其中乙個控制匯流排並使報文不被破壞的過程 ...