stm32 iic读取一个字节,为什么左移,还有最后为什么要应答,不要应该没问题吧,高手解释一下
时间:10-02
整理:3721RD
点击:
//I2C读取一个字节
u8 I2C_Read_Byte(u8 ack)
{
u8 i=0,receive=0;
I2C_SDA_IN();
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us(2);
I2C_SCL_H;
receive<<=1;
if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
receive++;
delay_us(1);
}
if(ack==0)
I2C_NAck();
else
I2C_Ack();
return receive;
}
u8 I2C_Read_Byte(u8 ack)
{
u8 i=0,receive=0;
I2C_SDA_IN();
for(i=0;i<8;i++)
{
I2C_SCL_L;
delay_us(2);
I2C_SCL_H;
receive<<=1;
if(GPIO_ReadInputDataBit(GPIO_I2C,I2C_SDA))
receive++;
delay_us(1);
}
if(ack==0)
I2C_NAck();
else
I2C_Ack();
return receive;
}
正好刚用过iic。
1.移位是必须的,因为数据是一位一位发的,至于左移还是右移完全取决于发送时候的字节是高位在前还是低位在前。
2.我看到的iic协议里应答也是必须的,像你这样接收数据,发数据的设备如果是采取的iic协议的话那么数据位后面一定跟着一个应答位,如果不接受应答,那么这一位可能会当成数据位接收,那么数据肯定是不对的。
这个要根据IIC的协议来操作
一次接受一个位,你想用一个字节的话那肯定要左移一次接受一次,+1其实就是 | 0x01.应答是IIC的通讯协议,你也可以选择不应答
先好好看看I2C协议吧,看一句对一句代码,很好理解的。
能否给说一下,为什么要根据I2C_SDA使receive++
不是很懂你的问题?
大概是根据sda的电平去决定RECEIVE的取值?
因为SDA是数据位,所以理应如此。
谢谢。
谢谢。