硬件IIC读出错--已解决
本帖最后由 爱情海玩偶 于 2025-4-22 16:47 编辑stm32g030f6p6的芯片。用的LL库。
IIC写完数据后读数据。正常是不发stop,而是直接发start。但是我这个一直没有发start,不知道哪不对。
从手册里面看。当配置为RELOAD的时候,可以收到TCR中断。确实在中断里面检测到了。
查看IIC的CR2寄存器。在TCR中断前后,寄存器的值也是对的。RELOAD被清除了。RW位也变成1了。但是依旧没有起始信号出去。
如果是操作是start + write + stop +start + read + stop这样是可以的。
但是如果start + write + Repeat‑Start + read + stop。就会卡在Repeat‑Start.
主函数里面就是每1秒调用I2C2_Master_Mem_Read_IT
__STATIC_INLINE void LL_I2C_HandleTransfer(I2C_TypeDef *I2Cx, uint32_t SlaveAddr, uint32_t SlaveAddrSize,
uint32_t TransferSize, uint32_t EndMode, uint32_t Request)
{
/* Declaration of tmp to prevent undefined behavior of volatile usage */
uint32_t tmp = ((uint32_t)(((uint32_t)SlaveAddr & I2C_CR2_SADD) | \
((uint32_t)SlaveAddrSize & I2C_CR2_ADD10) | \
(((uint32_t)TransferSize << I2C_CR2_NBYTES_Pos) & I2C_CR2_NBYTES) | \
(uint32_t)EndMode | (uint32_t)Request) & (~0x80000000U));
/* update CR2 register */
MODIFY_REG(I2Cx->CR2, I2C_CR2_SADD | I2C_CR2_ADD10 |
(I2C_CR2_RD_WRN & (uint32_t)(Request >> (31U - I2C_CR2_RD_WRN_Pos))) |
I2C_CR2_START | I2C_CR2_STOP | I2C_CR2_RELOAD |
I2C_CR2_NBYTES | I2C_CR2_AUTOEND | I2C_CR2_HEAD10R,
tmp);
}
被误导了。TCR中断不能用来切换读。
手册里面写的很清楚。
TCR只能用来连续传输
The transfer is not completed after the NBYTES data transfer (NBYTES is reloaded). TCR
flag is set when NBYTES data are transferred, stretching SCL low 本帖最后由 爱情海玩偶 于 2025-4-22 16:51 编辑
改动如下;
一开始不使用硬件stop。改为软件stop,其实就是在写完数据后直接切换为读。不发送stop就好。
中断里面把TCR检测改为TC检测。
单纯写数据的时候没有使能TC中断。因此不会切换模式。
如果配置了 I2C_CR2_RELOAD,需要确认在每个中断周期内正确处理传输过程,并且正确管理每个阶段的 Start/Stop 操作。
页:
[1]