打印
[STM32G0]

硬件IIC读出错--已解决

[复制链接]
136|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 爱情海玩偶 于 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);
}





使用特权

评论回复
沙发
爱情海玩偶|  楼主 | 2025-4-22 16:50 | 只看该作者
被误导了。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:50 | 只看该作者
本帖最后由 爱情海玩偶 于 2025-4-22 16:51 编辑

改动如下;
一开始不使用硬件stop。改为软件stop,其实就是在写完数据后直接切换为读。不发送stop就好。
中断里面把TCR检测改为TC检测。
单纯写数据的时候没有使能TC中断。因此不会切换模式。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

464

帖子

1

粉丝