为什么我无法检测到 bitbang-read/sniff I2C 端口的启动条件? stm32

Why can't I detect start condition when to bitbang-read/sniff I2C port? stm32

我正在尝试 bitbang-read 或嗅探 I2C 端口。我在主 I2C 设备和 Nucleo stm32F401 板之间成功进行了 I2C 通信。使用 DMA 的 Nucleo slave 发送。然后我使用来自同一个 Nucleo 的 2 个引脚来尝试嗅探通信。两个引脚都配置为带上拉的输入。

我这样读取引脚的值:

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交易时条件不满足?

I2C 启动条件是时钟保持高电平时数据的下降沿。要从 GPIO 检测它,您需要执行以下操作:

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
}