IIC通信---EEPROM24C02---STMF4
IIC通信協議
IIC是同步半雙工通信,一個數據線SDA和一個時鐘SCL線,可以接受和發送數據。在CPU與被控IC之間、IC與IC之間進行雙向傳送。
空閑狀態
IIC總線的SDA和SCL兩條信號線同時處于高電平時,規定為總線的空閑狀態。
起始信號
當SCL為高期間,SDA由高到低的跳轉
代碼實現為:
停止信號
當SCL為高期間,SDA由低到高的跳轉
代碼實現:
應答信號
發送器每發送一個字節,就在時鐘脈沖9期間釋放數據線,由接收器反饋一個應答信號。應答信號為低電平時,規定為有效應答位,表示接收器已經成功接收到了該字節。應答信號為高電平時,規定為非應答位,一般表示接收器接收該字節沒有成功。
對于反饋有效應答位ACK的要求是,接收器第9個時鐘脈沖之前的低電平將SDA線拉低,并且確保在該時鐘的高電平期間為穩定的低電壓。
代碼實現為:
數據的有效性
IIC總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平才允許變化。即數據在SCL的上升沿到來之前就需要準備好,并且在下降沿到來之前必須保持穩定。
數據的傳送
在IIC總線上傳送的每一位數據都有一個時鐘脈沖相對應(同步控制),即在SCL串行時鐘的配合下,在SDA上逐位串行傳送每一位數據,數據位的傳輸是邊沿觸發。
發送一字節代碼實現為:
//IIC發送一個字節 //返回從機有無應答 //1,有應答 //0,無應答 void IIC_Send_Byte(u8 txd) { u8 t; SDA_OUT(); IIC_SCL=0;//拉低時鐘開始數據傳輸for(t=0;t<8;t++){ IIC_SDA=(txd&0x80)>>7;txd<<=1; delay_us(2); //對TEA5767這三個延時都是必須的IIC_SCL=1;delay_us(2); IIC_SCL=0; delay_us(2);} }數據傳輸之前IIC_SCL必須等于0,即時信號為低電平,然后準備一位數據,準備好之后,IIC_SCL=1,即時鐘信號為高電平,數據就傳輸過去了
對于下面的代碼:
無符號類型左移丟棄最高位,低位補0,無符號類型右移丟棄最低位,低位補0,txd&0x80讓txd第8位數據不變,其他為變成0(txd的值不受影響),左移7位,將最高位的數據賦值給IIC_SDA,當IIC_SCL=1時,第八位數據就傳輸過去了,txd<<=1讓第7位數據變成第8位數據,下次循環就傳輸原來第7位數據了。循環8次將一字節數據傳輸完畢。
讀取數據代碼實現:
//讀1個字節,ack=1時,發送ACK,ack=0,發送nACK u8 IIC_Read_Byte(unsigned char ack) {unsigned char i,receive=0;SDA_IN();//SDA設置為輸入for(i=0;i<8;i++ ){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive++; delay_us(1); } if (!ack)IIC_NAck();//發送nACKelseIIC_Ack(); //發送ACK return receive; }對于下面的代碼:
receive<<=1;if(READ_SDA)receive++;READ_SDA是獲取SDA線上的電壓,高電壓說明說明傳送過來的數據是1,receive++,下一次的時候, receive<<=1,receive先右移一位,然后接受數據,這樣循環8次,就能保證接受的數據在原來的位置上了。
與EEPROM通信
硬件連接
EEPROM是一種掉電后數據不丟失的存儲芯片,可以在電腦上或專用設備上擦除已有信息,重新編程。
24C02的總容量是256個字節,接口是IIC
模式選擇
硬件連接中,A2=A1=A0=0(接地),所以,我們讀數據時,只需寫入0xA1,表示讀模式,寫數據時,只需寫入0xA0,表示寫模式
寫時序
下面是寫入一個字節數據的過程
具體代碼如下
讀數據
下面是讀一個字節數據的過程
實現代碼如下:
總結
以上是生活随笔為你收集整理的IIC通信---EEPROM24C02---STMF4的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 独立看门狗---STM32----HAL
- 下一篇: LCD显示实验----STM32f4--