I2C 不发送重复开始

问题描述 投票:0回答:1

我遇到了一个问题。我有一个 STM32F103C8T6 控制器,我正在尝试使用中断实现 I2C 通信。问题是,当我需要发送重复开始时,它不会发生。 ITBUFEN 中断被禁用,我只使用 ITEVFEN 中断。顺序如下:开始——发送地址——发送寄存器地址(从中读取)——发送重复开始。 (破折号代表进入中断)。因此,在发送第二个开始后,什么也没有发生。但是,如果我在发送重复开始之前阅读了DR,它就会被发送。

(void)I2C2->DR;
I2C2->CR1|=I2C_CR1_START;

是的,还有另一种选择。设置启动条件后,可以向DR寄存器写入一些垃圾数据,启动条件就会发生。垃圾数据不会被传输

I2C2->CR1|=I2C_CR1_START;
I2C2->DR=0x55;

还有一种方案:当我发送寄存器地址的最后一个字节时,如果我立即写一个start,然后当我进入中断发送start并再次发送时,发送start。可能是什么问题呢?我究竟做错了什么?感觉有些标志没有被重置,这会阻止发送开始。但是,当时我用调试器检查了一下,没有看到类似的东西。我还尝试在发送重复开始之间添加一个暂停,但没有帮助。发送start的中断被执行,但是没有产生start。

我用调试器读取负责 I2C 的寄存器,但是当我读取调试器时一切正常,但是当我在执行时运行它时它停止了

stm32 interrupt i2c
1个回答
0
投票

您发现只有在读取或写入数据寄存器 (DR) 后才会发出 RESTART 条件。 这是可行的,因为需要读取或写入 DR 才能清除 BTF 健康)状况。 无论如何都应清除 BTF 条件以避免额外的 BTF 中断。

参考手册 RM0008 指定如何清除 I2C_SR1 中的 BTF 标志:

通过读取 SR1 的软件清零,然后是 读取或写入 DR 寄存器或之后由硬件 传输中或 PE=0 时的开始或停止条件。”

在SR1中测试flag后清除BTF flag,确实可以用下面的语句读取DR。

  (void)I2C1->DR;  // Clear BTF by reading DR.

清除 BTF 后设置 CR1.START 时,发送 RESTART。

当您使用调试器检查状态时它起作用的事实 寄存器的原因是调试器读取了数据寄存器 DR.

© www.soinside.com 2019 - 2024. All rights reserved.