你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G070 调用HAL_I2C_Mem_Read_IT测试疑问

[复制链接]
huahuahnu 提问时间:2024-12-2 17:55 / 未解决
使用两个板子,在例程I2C_TwoBoards_RestartComIT代码上进行修改:
主机调用HAL_I2C_Mem_Read_IT函数,发送内存地址16位后读10个数据;
从机调用HAL_I2C_Slave_Seq_Receive_IT接收内存地址后再调用HAL_I2C_Slave_Seq_Transmit_IT发送10个数据;

现象:
从机正常接收,给主机发送第1个数据正常,到第2~10个数据时每次第八个时钟拉低了500多个ms才拉高,也就是延时了500多ms才回ack。不知道什么原因?

现在把HAL_I2C_Mem_Read_IT替换成查询模式HAL_I2C_Mem_Read,就没有以上时钟被拉低很久的现象。

这说明HAL_I2C_Mem_Read_IT函数封装哪里有问题?求指导


主机调用代码:
  1. HAL_I2C_Mem_Read_IT(&hi2c1, (uint16_t)I2C_ADDRESS,, 0x55aa,2,(uint8_t *)aRxBuffer, 10);

  2. HAL_I2C_Mem_Read(&hi2c1, (uint16_t)I2C_ADDRESS,, 0x55aa,2,(uint8_t *)aRxBuffer, 10,1000);
复制代码


从机调用代码:
  1. if(HAL_I2C_EnableListen_IT(&hi2c1) != HAL_OK)
  2. {
  3.    Error_Handler();
  4. }

  5. while(uwTransferRequested != 1)
  6.   {
  7.   }

  8. if(HAL_I2C_Slave_Seq_Receive_IT(&hi2c1, (uint8_t *)aRxBuffer, 2, I2C_FIRST_FRAME) != HAL_OK)
  9. {
  10.    Error_Handler();
  11. }

  12. while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_LISTEN)
  13. {
  14. }

  15. while(uwTransferRequested != 1)
  16.   {
  17.   }

  18. if(HAL_I2C_Slave_Seq_Transmit_IT(&hi2c1, (uint8_t*)aTxBuffer, 10, I2C_LAST_FRAME)!= HAL_OK)
  19. {
  20.    Error_Handler();
  21. }

  22. while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY)
  23. {
  24. }
复制代码

从机回调函数:
  1. void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c,uint8_t TransferDirection, uint16_t AddrMatchCode)
  2. {
  3.    uwTransferRequested  = 1;
  4. }

  5. void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *I2cHandle)
  6. {
  7.    uwTransferRequested =0;
  8. }

  9. void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *I2cHandle)
  10. {
  11.    uwTransferRequested =0;
  12. }
复制代码







收藏 评论2 发布时间:2024-12-2 17:55

举报

2个回答
butterflyspring 回答时间:2024-12-3 14:53:16

注意到代码又改变了~~

库里面有个例程,可以参考一下。

STM32Cube_FW_G0_V1.5.0\Projects\STM32G081B-EVAL\Examples\I2C\I2C_TwoBoards_ComIT\

huahuahnu 回答时间:2024-12-3 16:39:32
butterflyspring 发表于 2024-12-3 14:53
注意到代码又改变了~~

库里面有个例程,可以参考一下。

已经找到原因,对比更新最新的G0代码时漏了开接收中断。
HAL_I2C_Mem_Read_IT函数最后调用I2C_Enable_IRQ(hi2c, I2C_XFER_TX_IT);
在I2C_Mem_ISR_IT里检测TC标志的地方需调用I2C_Disable_IRQ(hi2c, I2C_XFER_TX_IT);I2C_Enable_IRQ(hi2c, I2C_XFER_RX_IT);

主机没开接收中断,没有读RXDR就会拉低时钟线

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版