本帖最后由 爱情海玩偶 于 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);
}
|