I2C 通信没有给我一个 ACK 位
The I2C communication is not giving me a ACK bit
我正在尝试使用 I2C 协议与气压传感器 MS5611 通信。我的微处理器是 STM32f3discovery。发送的是传感器的地址,而不是命令。代码卡在 while 循环中等待设置 TXIE 位。 TXIE 不是 "one" 的原因是因为 MS5611 的确认位没有出现。此外,I2C 状态寄存器正在设置 NACK(不确认)、STOPF(停止标志)位。
MS5611传感器的地址是11101100。这可以在页面上的数据表中看到12.In我的情况是CSB的值为零。
但是 O-scope 显示了不同的画面。我已经尝试过两种方式,CSB 0 和 CSB 1,但没有成功。
CSB 零:O-scope picture 1
CSB 一:在我评论的某处:)
...我无法粘贴图片或 link 因为我没有足够的信誉点:-/
我一直这样想:
可能是我的时间不对。我认为这是因为第 9 个 SCL 脉冲处的停止条件。在此位置应该启动 ACK 位而不是 STOP 位。
那么,为什么第 9 个脉冲是高电平?
谁在发出第 9 个脉冲,微脉冲还是传感器?
版本号uno:到目前为止,我已经尝试发送读取命令,两种组合(11101101或11101111),更改为其他 I2C 设备。此控制器有两个 I2C 模块(I2C1 和 I2C2),更改了引脚(从 PB6、PB7 到 PA9 和 PA10)。没有成功。
另一方面,我已经使用相同的引脚(PB6、PB7)和相同的代码对 st 板上的 mems 加速计传感器进行了寻址。唯一的区别是 I2C 时序寄存器和地址中的时序值。工作得很好。
我的结论显然是我的计时值或传感器 I2C 协议有问题。但是我使用了ST参考手册中的时序设置示例。
因此,我没有其他选择,只能进入调试器模式并更深入地了解 I2C 时序值。
如果能提供更多信息,我将不胜感激,感谢您的帮助:)
The address of the MS5611 sensor is 11101100. This can be seen in the datasheet on the page 12.In my case the value of CSB is zero.
CSB对应的address-bit的值是它的补码。如果 CSB 为零,则用于寻址写入的值为 11101110。
考虑到 CSB 位为负,所以如果您已将引脚接地,这意味着您应该将 CBS 设置为“1”,如@D Krueger 所述。
您也可以尝试从设备读取,在这种情况下它会确认吗?尝试使用 11101101 或 11101111 取决于 CSB 位,但使用(读取位设置),read\write 位 = 1.
根据示波器数据,您似乎没有收到微控制器发送的停止(释放 i2c 总线)确认。
很可能您正在尝试写入一个不存在的地址。同样在 i2c 中,有 7 位寻址和 10 位寻址,但没有 8 位寻址。第 8 位用于告诉设备是请求读还是写。此外,第 9 个脉冲为高电平,因为它在发送最后一个 0(表示写入信号)时被主机保持为低电平,它可以停止将该线拉低,直到下一个时钟周期。要写的信号是在上升时钟上发送的,它不能在高时钟时改变数据(开始停止信号是那些)然后当时钟再次降低时,它现在可以释放它,但通常从机应该将数据拉低这里发信号 "yes I am here" 但那里没有从站,主站不应该在这里控制它,只有那个地址的设备应该控制它。
您发送了 1110:1100
,它的最低有效位为 0,并且是对地址 1110:110 的写入。无人接听。
我正在尝试使用 I2C 协议与气压传感器 MS5611 通信。我的微处理器是 STM32f3discovery。发送的是传感器的地址,而不是命令。代码卡在 while 循环中等待设置 TXIE 位。 TXIE 不是 "one" 的原因是因为 MS5611 的确认位没有出现。此外,I2C 状态寄存器正在设置 NACK(不确认)、STOPF(停止标志)位。
MS5611传感器的地址是11101100。这可以在页面上的数据表中看到12.In我的情况是CSB的值为零。
但是 O-scope 显示了不同的画面。我已经尝试过两种方式,CSB 0 和 CSB 1,但没有成功。
CSB 零:O-scope picture 1
CSB 一:在我评论的某处:)
...我无法粘贴图片或 link 因为我没有足够的信誉点:-/
我一直这样想: 可能是我的时间不对。我认为这是因为第 9 个 SCL 脉冲处的停止条件。在此位置应该启动 ACK 位而不是 STOP 位。
那么,为什么第 9 个脉冲是高电平? 谁在发出第 9 个脉冲,微脉冲还是传感器?
版本号uno:到目前为止,我已经尝试发送读取命令,两种组合(11101101或11101111),更改为其他 I2C 设备。此控制器有两个 I2C 模块(I2C1 和 I2C2),更改了引脚(从 PB6、PB7 到 PA9 和 PA10)。没有成功。
另一方面,我已经使用相同的引脚(PB6、PB7)和相同的代码对 st 板上的 mems 加速计传感器进行了寻址。唯一的区别是 I2C 时序寄存器和地址中的时序值。工作得很好。
我的结论显然是我的计时值或传感器 I2C 协议有问题。但是我使用了ST参考手册中的时序设置示例。
因此,我没有其他选择,只能进入调试器模式并更深入地了解 I2C 时序值。
如果能提供更多信息,我将不胜感激,感谢您的帮助:)
The address of the MS5611 sensor is 11101100. This can be seen in the datasheet on the page 12.In my case the value of CSB is zero.
CSB对应的address-bit的值是它的补码。如果 CSB 为零,则用于寻址写入的值为 11101110。
考虑到 CSB 位为负,所以如果您已将引脚接地,这意味着您应该将 CBS 设置为“1”,如@D Krueger 所述。 您也可以尝试从设备读取,在这种情况下它会确认吗?尝试使用 11101101 或 11101111 取决于 CSB 位,但使用(读取位设置),read\write 位 = 1.
根据示波器数据,您似乎没有收到微控制器发送的停止(释放 i2c 总线)确认。
很可能您正在尝试写入一个不存在的地址。同样在 i2c 中,有 7 位寻址和 10 位寻址,但没有 8 位寻址。第 8 位用于告诉设备是请求读还是写。此外,第 9 个脉冲为高电平,因为它在发送最后一个 0(表示写入信号)时被主机保持为低电平,它可以停止将该线拉低,直到下一个时钟周期。要写的信号是在上升时钟上发送的,它不能在高时钟时改变数据(开始停止信号是那些)然后当时钟再次降低时,它现在可以释放它,但通常从机应该将数据拉低这里发信号 "yes I am here" 但那里没有从站,主站不应该在这里控制它,只有那个地址的设备应该控制它。
您发送了 1110:1100
,它的最低有效位为 0,并且是对地址 1110:110 的写入。无人接听。