问题1:在等待应答信号到来的函数中,既然设置了SDA_IN();为输入,为何还使用IIC_SDA=1,设置sda输出1呢?
u8 IIC_Wait_Ack(void)
{ 。。。。
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
。。。。。。
}
问题2:在指定地址读出一个字节的数据函数中,原子为什么用 IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); 和 IIC_Send_Byte(ReadAddr%256);来表示从器件地址和它想读取的字节数据的地址呢(为什么字节数据的地址要除以256取余数),写成IIC_Send_Byte(0XA0); 和 IIC_Send_Byte(ReadAddr);对不对?
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
。。。。。。
else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址 0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
}
问题3:如果我用一个24C04,A2,A1,A0 全部接地,adAddr=375,那么按照上面的的代码从器件地址是不是该写成IIC_Send_Byte(0XA0+0X020) ,字节数据的地址该写成IIC_Send_Byte(375%256)
以上三个问题,困扰了我一下午,请原子给我解释一下,谢谢了。
|