我在STM32F401核板上编程I2C主机,没有HAL编程,只使用寄存器。- 开始
- 用R / W 0写地址
- 写寄存器地址
- 发送重复的开始条件
- 用R / W 1写地址
- 从外设读取数据
前3个步骤完全正常,但在重启条件后我无法用R / W 1发送地址。
在这里,您可以使用逻辑分析仪查看时序图。发送重启条件,但之后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);
函数调用
- void i2c_start() {
- I2C1->CR1 |= I2C_CR1_START;
- while (!I2C1->SR1 & I2C_SR1_SB);
- }
- int i2c_sendAddr(u8 addr) {
- I2C1->DR = addr;
- while (!(I2C1->SR1 & I2C_SR1_ADDR))
- if (I2C1->SR1 & I2C_SR1_AF)
- return -1;
- I2C1->SR2; //generates a read, clears ADDR
- return 0;
- }
- int i2c_sendByte(u8 data) {
- while (!(I2C1->SR1 & (I2C_SR1_TXE | I2C_SR1_AF)));
- I2C1->DR = data;
- return I2C1->SR1 & I2C_SR1_AF ? -1 : 0;
- }
- //wait for byte transfer
- void i2c_wfw() {
- while (!(I2C1->SR1 & (I2C_SR1_BTF | I2C_SR1_AF)));
- }
复制代码在重启后设置DR之前TXE位为高,之后为低,但I2C不发送任何内容。请指出我错过了什么。我还用示波器检查了SDA线,没有毛刺或类似情况。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>