I2C通信没有给我一个ACK位

时间:2015-01-06 16:14:06

标签: stm32 i2c

我正在尝试使用I2C协议与气压传感器MS5611进行通信。我的micro是STM32f3discovery。发送传感器的地址,但不发送命令。代码被挂在while循环中,等待TXIE位置1。 TXIE不是" one"的原因是因为MS5611的应答位没有出现。此外,I2C状态寄存器还将NACK(非应答),STOPF(停止标志)位置1。

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

Datasheet MS5611

但O-scope向我展示了不同的画面。我在两个方面都尝试过,CSB中的CSB为零,但没有成功。

CSB零:O-scope picture 1

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

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

我一直在想这样的方式: 可能是我的时机已关闭。我之所以这么想是因为第9个SCL脉冲处的停止条件。在这个位置,ACK位应该启动而不是STOP位。

那么,为什么第9个脉冲高? 谁给出第9个脉冲,微型或传感器?

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

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

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

因此,我没有其他选择进入调试器模式并深入挖掘I2C时序值。

我将非常感谢任何其他信息并感谢您的帮助:)

3 个答案:

答案 0 :(得分:0)

  

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

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

答案 1 :(得分:0)

考虑CSB位为负,所以如果你将引脚接地,这意味着你应该将CBS设置为" 1",如@D Krueger所述。 您也可以尝试从设备上阅读,在这种情况下它会承认吗?尝试使用11101101或11101111取决于CSB位,但使用(读取位设置),读取/写入位= 1.

答案 2 :(得分:0)

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

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

您发送了DIV,其最低有效位为0,写入地址为1110:110。没有人回答。