//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址
//返回值 :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
IIC_Wait_Ack();
}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;
}
这里的 IIC_Wait_Ack();定义如下:
//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN(); //SDA设置为输入 主机是接收器,EEPROM为发送器
IIC_SDA=1;delay_us(1); //发送器
IIC_SCL=1;delay_us(1);
while(READ_SDA) //PB11--SD。 接收器为0,表示响应
{
ucErrTime++;
if(ucErrTime>250) //2^7<250<2^8.即8位时间已过
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//时钟输出0。清零。
return 0;
}
我的疑问是, IIC_Wait_Ack()返回0还是返回1,即应答成功还是不成功,AT24CXX_ReadOneByte()不都是往下执行,即发送数据地址吗?那这个应不应答,也没检测啊? |