歡迎指出錯誤或提出問題。此例為例程解釋的一點錯誤,請以紅色說明文字為準。書上193頁說明:每一位的寫入是用時鐘上升沿同步數據,也就是說時鐘上升沿后從器件(指24C02)開始檢測輸入的數據,每一位的讀取是用時鐘下降沿同步數據,也就是說時鐘下降沿后從器件開始輸出數據。
下面是例程代碼。
//*********************************************************************
// 功能描述:主設備向從設備發送個一字節
// 返回值: 0->成功 1->失敗
//*********************************************************************/
unsigned char IIC_SendByte(unsigned char Data)
{
unsigned char i; // 位數控制
for (i=0;i<8;i++) // 寫入時是用時鐘上升沿同步數據
{
if (Data & 0x80)
SDA = 1;
else
SDA = 0;
delay(tt); // 保持0.2uS以上(TSU.DAT)
SCL = 1;
delay(tt); // 保持4.0uS以上(THIGH)
SCL = 0;
delay(tt); // 保持4.7uS以上(TLOW)
Data <<= 1;
}
return IIC_GetACK();
}
//*********************************************************************
// 功能描述:主設備向從設備讀取一個字節
// 返回值: 讀到的字節
// *********************************************************************/
unsigned char IIC_RecByte(void) // 接收單字節的數據,并返回該字節值
{
unsigned char i,rbyte=0;
SDA=1;
for(i=0;i<8;i++) // 讀出時是用時鐘下降沿同步數據
{
SCL=0;
delay(tt); // 保持4.7uS以上(TLOW)
SCL=1;
delay(tt); // 保持4.0uS以上(THIGH)
if(SDA) rbyte|=(0x80>>i);
}
SCL=0;
return rbyte;
}
|