新手入门
- 积分
- 26
- 金钱
- 26
- 注册时间
- 2015-12-25
- 在线时间
- 0 小时
|
5金钱
正点原子的iic的软件模拟驱动,为什么不对返回的有效应答进行检验,
等待应答:u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;delay_us(1); //第5行
IIC_SCL=1;delay_us(1); //第六行
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;
return 0;
读函数: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);
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));
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;
}
问题一:读函数中的等待应答,除了占用了cpu的时间,就算没有收到应答,似乎也没关系,程序也继续执行。为什么不在读函数中加上对等待应答返回值的判断呢?
问题二:等待应答函数的第5行(已经标识)是否可以删除呢?因为上一行已经把数据脚设为输入,那么第5行再对数据引脚赋值并等待1毫秒,有什么意义?
问题三:等待应答函数的第六行,等待1毫秒,是怎么确定的等待时间呢?能保证在进入if语句之前,被访问的器件能够准备好有效应答的低电平吗? |
|