欢迎指出错误或提出问题。此例为例程解释的一点错误,请以红色说明文字为准。书上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;
}
|