首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我不能检测启动条件,什么时候到比特-读/嗅探I2C端口?stm32

为什么我不能检测启动条件,什么时候到比特-读/嗅探I2C端口?stm32
EN

Stack Overflow用户
提问于 2022-02-07 17:20:35
回答 1查看 98关注 0票数 0

我正在尝试读比特-读或者更确切地说是嗅探一个I2C端口。我有一个成功的I2C之间的I2C设备和stm32F401板之间的沟通。核心从发送使用DMA。然后,我使用两个引脚从相同的核心,试图嗅探沟通。这两个引脚都被配置为带有引线的inuput。

我这样读引脚的价值:

代码语言:javascript
复制
while (1) {

    uint8_t CLK_val = HAL_GPIO_ReadPin(GPIOB, 1);
    uint8_t SDA_val = HAL_GPIO_ReadPin(GPIOB, 2);

//And then I try to detect start condition like this:

    if (CLK_val == GPIO_PIN_RESET && SDA_val == GPIO_PIN_RESET){
        //Some code
    }

//More code

};

如果我手动拉下引脚,用一根与地面相连的电缆触碰两根引脚,条件就满足了。但是,即使事务成功,I2C事务也不会触发该条件,因此,在事务处理期间,引脚必须已被拔下。

为什么在I2C事务处理期间不满足该条件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-07 21:16:01

I2C启动条件是数据的下降边缘,而时钟保持在高位。要从GPIO中检测到它,您需要执行如下操作:

代码语言:javascript
复制
CLK_val_before = HAL_GPIO_ReadPin(GPIOB, 1);
SDA_val_before = HAL_GPIO_ReadPin(GPIOB, 2);
CLK_val_after = HAL_GPIO_ReadPin(GPIOB, 1);
SDA_val_after = HAL_GPIO_ReadPin(GPIOB, 2);

if ((CLK_val_before == GPIO_PIN_SET) 
    && (SDA_val_before == GPIO_PIN_SET) 
    && (CLK_val_after == GPIO_PIN_SET) 
    && (SDA_val_after == GPIO_PIN_RESET))
{
    // Some code
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71022672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档