void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
Delay_Us(2);
IIC_SCL=1;
Delay_Us(2);
IIC_SCL=0;
}
我也碰到相同的问题,现已解决。
问题是出 restart的时序上。
SCL为低时,拉高SDA,
SCL再拉高,
SDA拉低,
SCL拉低。
看是否能帮到你。
ReadAddr是个16bit的数据,可分为高8bit和低8bit
两个可能:
1高8位为寄存器地址的高8位,低8位为寄存器地址的低8位。就像if里面走的
2高8位为从机地址(slave地址)的一部分,也是7位的slave地址(所以要左移一位(ReadAddr/256)<<1),而且是以0xA0为基址的从机地址,所以从机地址应该是:(0XA0+((ReadAddr/256)<<1)),低8位为寄存器地址的低8位。就像else里面的走的
以上 是我的理解 可能有所偏差
我的理解是,读数据的时候,是从机控制总线,因此必须提前把sda释放(也就是拉高)。否则从机将不能改变总线。sda为1后,主机控制scl=1,然后,从机根据自己要发送的数据选择将sda置为1或0(即在scl=1时,从机改变sda)。
而在发送数据时,主机控制总线,在scl=0时,sda被主机改变;scl=1时,sda不变,并被从机读取。(scl=0时,主机改变sda)
应答时,相当于读取一位数据,同样是在scl=1时,由从机改变sda。
而起始、结束时,是由 主机 控制sda。在scl为1时,sda的任何改变都将被视为起始、终止信号。
个人理解,如有错误请赐教!
ps 当然也可以理解为 在读取时仍然是在scl=0时,从机改变sda,不过也不影响逻辑,怎样容易怎样理解呗
以上就是关于关于STM32 IIC多字节读取的问题全部的内容,包括:关于STM32 IIC多字节读取的问题、IIC无法从RDA5820中读取数据、IIC程序问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)