前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Stm32_hal库IIC时钟拉伸的漏洞

Stm32_hal库IIC时钟拉伸的漏洞

作者头像
用户9736681
发布2023-11-20 14:47:08
1530
发布2023-11-20 14:47:08
举报
文章被收录于专栏:嵌入式随笔嵌入式随笔

iic可以开启时钟拉伸功能,这种功能可以让主机决定什么时候继续发送时钟,此功能作用时会将从机SCL拉低。

针对主机多读或者多写的情况(比如主机收10个字节,从机发送5个字节),hal库并未作处理,会导致从机一直拉低SCL。Hal库原来的程序是这样:

代码语言:javascript
复制
static void
I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
{
 if
(hi2c->XferCount != 0U)
 {
/* Write data to DR */
hi2c->Instance->DR = *hi2c->pBuffPtr;
/* Increment Buffer pointer */
hi2c->pBuffPtr++;
/* Update counter */
hi2c->XferCount--;
 }
}
static void
I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
{
 if
(hi2c->XferCount != 0U)
 {
/* Read data from DR */
*hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
/* Increment Buffer pointer */
hi2c->pBuffPtr++;
/* Update counter */
hi2c->XferCount--;
 }
}

这个是原来的库函数,多读或者多写后,会触发btf中断进入这个函数,同时hi2c->XferCount为0(原计划的数据量读写已经完成),导致btf中断函数什么也没做,SCL持续拉低.

可以做如下修改解决此问题

代码语言:javascript
复制
static void I2C_SlaveTransmit_BTF(I2C_HandleTypeDef *hi2c)
{
   if (hi2c->XferCount != 0U)
    {
      /* Write data to DR */
      hi2c->Instance->DR = *hi2c->pBuffPtr;
      /* Increment Buffer pointer */
      hi2c->pBuffPtr++;
      /* Update counter */
      hi2c->XferCount--;
   }
    else
    {
       hi2c->Instance->CR1&= ~(1<<0);
       hi2c->Instance->CR1|= (1<<0);
    }
}
static void I2C_SlaveReceive_BTF(I2C_HandleTypeDef *hi2c)
{
   if (hi2c->XferCount != 0U)
   {
      /* Read data from DR */
      *hi2c->pBuffPtr = (uint8_t)hi2c->Instance->DR;
      /* Increment Buffer pointer */
      hi2c->pBuffPtr++;
      /* Update counter */
      hi2c->XferCount--;
   }
  else
  {
       hi2c->Instance->CR1&= ~(1<<0);
       hi2c->Instance->CR1|= (1<<0);
  }
}

这样清除btf标志位,结束此次通信。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档