stm32f401重复启动后I2C不发送字节

2019-07-14 18:05发布

我在STM32F401核板上编程I2C主机,没有HAL编程,只使用寄存器。
  • 开始
  • 用R / W 0写地址
  • 写寄存器地址
  • 发送重复的开始条件
  • 用R / W 1写地址
  • 从外设读取数据
前3个步骤完全正常,但在重启条件后我无法用R / W 1发送地址。 1.png 在这里,您可以使用逻辑分析仪查看时序图。发送重启条件,但之后SCL和SDA都很低。这是我的代码
i2c_start();
    if (i2c_sendAddr(TLC2991_ADDR)) { //returns != 0 if NACK
        fault = true;
        i2c_end();
        I2C1->SR1 &= ~I2C_SR1_AF;
        return -1;
    }
    i2c_sendByte(VOLTAGE_REG_OFFS + 2 * ch);
    i2c_wfw();
    i2c_start();
    i2c_sendByte(TLC2991_ADDR | 1); //tried i2c_sendAddr too
    u8 msb = i2c_recvByte(1);
    u8 lsb = i2c_recvByte(0);

函数调用
  1. void i2c_start() {
  2.     I2C1->CR1 |= I2C_CR1_START;
  3.     while (!I2C1->SR1 & I2C_SR1_SB);
  4. }

  5. int i2c_sendAddr(u8 addr) {
  6.     I2C1->DR = addr;
  7.     while (!(I2C1->SR1 & I2C_SR1_ADDR))
  8.         if (I2C1->SR1 & I2C_SR1_AF)
  9.             return -1;
  10.     I2C1->SR2; //generates a read, clears ADDR
  11.     return 0;
  12. }

  13. int i2c_sendByte(u8 data) {
  14.     while (!(I2C1->SR1 & (I2C_SR1_TXE | I2C_SR1_AF)));
  15.     I2C1->DR = data;
  16.     return I2C1->SR1 & I2C_SR1_AF ? -1 : 0;
  17. }

  18. //wait for byte transfer
  19. void i2c_wfw() {
  20.     while (!(I2C1->SR1 & (I2C_SR1_BTF | I2C_SR1_AF)));
  21. }
复制代码在重启后设置DR之前TXE位为高,之后为低,但I2C不发送任何内容。请指出我错过了什么。我还用示波器检查了SDA线,没有毛刺或类似情况。


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。