Stm32 I2C通信没有给我一点应答

Stm32 I2C通信没有给我一点应答,stm32,i2c,Stm32,I2c,我正在尝试使用I2C协议与气压传感器MS5611通信。我的micro是STM32f3discovery。发送传感器的地址,但不发送命令。代码在while循环中阻塞,等待设置TXIE位。TXIE不是“一”的原因是MS5611的确认位没有显示。此外,I2C状态寄存器正在设置NACK(不确认)、STOPF(停止标志)位 MS5611传感器的地址为11101100。这可以在第12页的数据表中看到。在我的例子中,CSB的值为零 但是O型示波器给我展示了一幅不同的画面。我试过两种方法,CSB零在CSB一,

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

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

但是O型示波器给我展示了一幅不同的画面。我试过两种方法,CSB零在CSB一,但没有成功

CSB零:

CSB一:在我的评论中:)

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

我一直这样想: 可能是我的时间不对。我认为这是因为第9次SCL脉冲时的停止条件。在这个地方,ACK钻头应该起作用,而不是停止钻头

那么,为什么第九个脉冲高? 是谁在给第九个脉冲,微型还是传感器

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

另一方面,我用相同的引脚(PB6、PB7)和相同的代码处理了st板上的mems加速度计传感器。唯一的区别是I2C定时寄存器中的定时值和地址。工作得很有魅力

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

因此,我别无选择,只能进入调试器模式,更深入地了解I2C计时值

如果您能提供更多信息,我将不胜感激,并感谢您的帮助:)

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


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

考虑CSB位为负值,因此,如果您已将引脚接地,这意味着您应将CBS设置为“1”,如@D Krueger所述。
您也可以尝试从设备读取,在这种情况下,它会确认吗?尝试使用11101101或11101111取决于CSB位,但使用(读取位设置),读取\写入位=1。

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

最有可能的情况是,您正试图向一个不存在的地址写信。i2c中也有7位寻址和10位寻址,但没有8位寻址。第8位用于告知设备是否请求读取或写入。此外,第9个脉冲是高的,因为在发送最后一个0(表示写入)时,主脉冲将其保持在低水平,它可以停止将该行拉低,直到下一个时钟周期。写入信号是在上升的时钟上发送的,它不能在高时钟上更改数据(开始-停止信号就是这些),然后当时钟再次下降时,它现在可以释放它,但通常从机应该在这里拉低数据以发出“是的,我在这里”的信号但是那里没有从设备,也没有主设备不应该控制它,只有该地址的设备应该控制它


您发送了
1110:1100
,它的最低有效位为0,是对地址1110:110的写入。无人应答。

CSB引脚上的电压是多少?从设备读取的电压是多少?在这种情况下,它会确认吗?尝试使用11101101或11101111。CSB位的值取决于引脚上的电压。我会等待关于电压水平的确认。@RuslanGerasimov他在他的问题中已经说过:“在我的情况下,CSB的值是零。”你怎么会认为他说的不是一点引脚?@RuslanGerasimov,因为CSB是一个数字输入引脚。查看他链接到的数据表。这是CSB one的图表:它不起作用:/时间也不应该是一个问题。如果设备支持i2c快速模式,它必须在2.5微秒内响应ack。此外,如果需要,它可以通过将时钟线保持在低位直到准备就绪来阻止主机。因此,我必须得出结论,设备配置不正确,或者在您请求的时候不接受i2c命令。