I2C 通信没有给我一个 ACK 位

  • 本文关键字:一个 ACK 通信 I2C stm32 i2c
  • 更新时间 :
  • 英文 :


我正在尝试使用 I2C 协议与气压传感器 MS5611 通信。我的微观是STM32f3发现。发送传感器的地址,但不发送命令。代码卡在 while 循环中,等待设置 TXIE 位。TXIE 不是"一"的原因是 MS5611 的确认位未显示。此外,I2C 状态寄存器正在设置 NACK(未确认)、STOPF(停止标志)位。

MS5611 传感器的地址为 11101100。这可以在页面上的数据表中看到 12.In 在我的情况下,CSB 的值为零。

MS5611 数据表

但是O型示波器向我展示了一幅不同的画面。我已经尝试了两种方式,CSB 在 CSB 一中为零,但没有成功。

CSB 零:O 型示波器图片 1

CSB one:在我的评论:)某处

。我无法粘贴图片或链接,因为我没有足够的声誉点:-/

我一直在这样想:可能是我的时机不对。我认为这是因为第 9 个 SCL 脉冲处的停止条件。在这个地方,ACK位应该启动,而不是STOP位。

那么,为什么第9个脉冲很高?谁在提供第 9 个脉冲、微脉冲或传感器?

版本号uno :到目前为止,我尝试发送读取命令,两种组合(11101101或11101111)都更改为其他I2C设备。该控制器有两个 I2C 模块(I2C1 和 I2C2),更改了引脚(从 PB6、PB7 到 PA9 和 PA10)。没有成功。

另一方面,我已经使用相同的引脚(PB6,PB7)和相同的代码解决了st板上的memsacellometer传感器。唯一的区别是I2C时序寄存器中的时序值和地址。像魅力一样工作。

显然,我的结论是我的定时值或传感器 I2C 协议有问题。但是,我使用了ST参考手册中的时序设置示例。

因此,我没有其他选择,可以进入调试器模式并更深入地了解 I2C 时序值。

我将不胜感激任何其他信息,并感谢您的帮助:)

看起来您没有收到微控制器根据示波器数据发送的停止(释放 i2c 总线)的确认。

您很可能正在尝试写入不存在的地址。同样在 i2c 中,有 7 位寻址和 10 位寻址,但没有 8 位寻址。第 8 位用于告诉设备是请求读取还是写入。此外,第9个脉冲很高,因为它在发送最后一个0(发出写入信号)时被主机保持低电平,它可以停止将该线拉低,直到下一个时钟周期。要写入的信号是在上升时钟上发送的,它不能在高时钟下更改数据(启动停止信号是那些),然后当时钟再次降低时,它现在可以释放它,但通常从站应该将数据拉低到这里以发出信号"是的,我在这里",但那里没有从站,没有主站不应该在这里控制它,只有该地址的设备应该。

您发送1110:1100在最低有效位中具有 0,并且是写入地址 1110:110。没有人回答。

MS5611 传感器的地址为 11101100。这可以在页面上的数据表中看到 12.In 在我的情况下,CSB 的值为零。

对应于 CSB 的地址位的值是其补码。如果 CSB 为零,则用于寻址写入的值为 11101110。

考虑到CSB位为负,所以如果你已经接地了引脚,这意味着你应该将CBS设置为"1",正如@D克鲁格提到的那样。您也可以尝试从设备读取,在这种情况下它会确认吗?尝试使用 11101101 或 11101111 取决于 CSB 位,但使用(读取位设置)时,读\写位 = 1。

最新更新