stm32 iic读取一个字节,为什么左移,还有最后为什么要应答,不要应该没问题吧,高手解释一下

2019-07-14 20:47发布

//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;
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
Mr.strive
1楼-- · 2019-07-15 01:40
一次接受一个位,你想用一个字节的话那肯定要左移一次接受一次,+1其实就是 | 0x01.应答是IIC的通讯协议,你也可以选择不应答
穹鸟无痕
2楼-- · 2019-07-15 03:22
先好好看看I2C协议吧,看一句对一句代码,很好理解的。
@@mingtian
3楼-- · 2019-07-15 08:03
 精彩回答 2  元偷偷看……
zhxing001
4楼-- · 2019-07-15 08:05
@@mingtian 发表于 2016-6-23 14:33
能否给说一下,为什么要根据I2C_SDA使receive++

不是很懂你的问题?
大概是根据sda的电平去决定RECEIVE的取值?
因为SDA是数据位,所以理应如此。
@@mingtian
5楼-- · 2019-07-15 09:24
zhxing001 发表于 2016-6-25 16:28
不是很懂你的问题?
大概是根据sda的电平去决定RECEIVE的取值?
因为SDA是数据位,所以理应如此。

谢谢。。。。。
@@mingtian
6楼-- · 2019-07-15 15:07
Mr.strive 发表于 2016-6-3 14:09
一次接受一个位,你想用一个字节的话那肯定要左移一次接受一次,+1其实就是 | 0x01.应答是IIC的通讯协议,你也可以选择不应答

谢谢。。。。。

一周热门 更多>