一年前剛學51單片機時,接觸到了IIC時序和用IIC通信讀寫AT24C02的學習歷程。那時剛剛大一,對數據線時鍾線等概念不是很清楚,也沒有分清IIC通信的底層時序和寫24c02的時序為什么不同。
借着學stm32的機會,再簡單整理一下現在對這兩種時序的認識。
---IIC時序是一種底層的通信協議,它規定了數據0,1寫入的有效性,起始終止等
---24C02的各種讀寫時序是該外設的讀寫規則,它規定了先寫XX地址,再寫XX地址,再寫XX數據……這些順序。它的各部分內容的寫入讀出都以IIC為基礎
簡單說,IIC時序時24C02時序的基礎構成,IIC時序是一種通信時序,是最底層的,類似於SPI等。而24C02作為一種外設,他有着自己的讀寫操作的規則,先寫什么,再寫什么,
我(24C02)才能正確讓你對我進行讀寫操作。而因為這款芯片用的通信方式是I2C傳輸,所以它時序里的寫器件地址,寫字地址,寫數據內容無一例外用的都是I2C傳輸過去的。
IIC時序理解起來很簡單,程序也簡單易寫。
下面簡單分析一下24C02時序中的字節寫時序和字節讀時序。
這是器件地址格式
前四位固定為1010,,A2A1A0決定了IIC通信中作為從機的24C02的地址,最后一位R/W決定是對其進行讀還是寫。
比如說當我們將24C02的A2A1A0都接地,那么從機的寫地址就是1010 0000 即0xA0,而從機的讀地址就是0xA1
以寫時序為例
可以看到依次為起始信號,期間地址,應答,字節地址,應答,數據,應答,停止信號
下面附一段代碼
//在AT24CXX指定地址寫入一個數據 //WriteAddr :寫入數據的目的地址 //DataToWrite:要寫入的數據 void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite) { IIC_Start(); if(EE_TYPE>AT24C16) { IIC_Send_Byte(0XA0); //發送寫命令 IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr>>8);//發送高地址 }else { IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //發送器件地址0XA0,寫數據 //為了兼容更大容量的芯片 } IIC_Wait_Ack(); IIC_Send_Byte(WriteAddr%256); //發送字節地址 IIC_Wait_Ack(); IIC_Send_Byte(DataToWrite); //發送字節 IIC_Wait_Ack(); IIC_Stop();//產生一個停止條件 delay_ms(10); }
這就是完全按照時序圖寫的對24C02指定字節寫數據程序。同理讀操作也一樣。
A2A1A0全部接地。
其中的WriteAddr時寫字節地址,也就是對24C02的256個字節中的哪一個進行寫操作