一、寫數據
unsigned char I2CWriteByte(unsigned int mem_addr,unsigned char*DDATAp,unsigned int count) { u8 i = 0;unsigned int Timer_1ms; for(i=0;i<count;i++) { I2cStart2(); I2cSend2(0xA0); //發送寫命令 WaitAck2(); I2cSend2(mem_addr+i); //發送寫入的地址 WaitAck2(); I2cSend2(DDATAp[i]); WaitAck2(); I2cStop2(); //發送停止信號 Timer_1ms=0xFFFF; while(Timer_1ms--) { __NOP(); } } }
以上是IIC寫數據命令,注意,如果count超過8個,每次寫一個字節都需要從I2cStart2()開始,如果從寫Address開始循環,數據會出錯,因為AT24C02每頁有8個字節;
寫數據代碼技巧,這是看一個開發板的例子
const unsigned char cucBit2[] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
void I2cSend2(unsigned char ucData2) { unsigned char IIC_i; SDA_Out();//設置為輸出 CLR_SCL2(); for (IIC_i=0;IIC_i<8;IIC_i++) { if ( (ucData2 & cucBit2[IIC_i]) != 0) { SET_SDA2(); } else { CLR_SDA2(); } DelayIntr2(2); SET_SCL2(); DelayIntr2(2); CLR_SCL2(); DelayIntr2(2); }; }
注意ucData2 & cucBit2[IIC_i]一行,這種方式可以代替移位。
二、讀數據
需要注意,需要兩個START信號
參考http://www.eefocus.com/stm3222/blog/16-10/393817_4e6f0.html
關於應答與非應答
非應答就是SDA為高電平.
i2c傳輸的要點就是: 傳輸一個字節 后面必然緊跟一個"響應"信號.這個響應信號可能來自主機,或者是從機,具體是誰,就要看傳輸方向。
下文中按照我的個人習慣稱呼為 "無應答":傳輸方向分兩種情況(每種情況又有兩種可能: A無應答和 B有應答): 1.主機->從機,主機對從機發一個字節之后,主機要讀取從機的響應信號(主機讀SDA線) A) 主機讀SDA為高電平,說明從機無應答
B) 主機讀SDA為低電平,說明從機有應答。2.從機->主機, 主機讀取從機一個字節之后,主機要向從機發送一個響應信號(主機寫SDA線) A) 主機寫SDA為高電平,從機收到主機的無應答信號之后,從機停止傳輸,等待主機的停止信號。
B) 主機寫SDA為低電平,從機收到主機的應答信號之后,從機繼續輸出下一字節。