zhao5352 发表于 2023-3-7 10:20:52

模拟IIC改为模拟SMBUS,并读取BQ40Z50

本帖最后由 zhao5352 于 2023-3-7 15:18 编辑

1、速率不同,将IIC的速率降至BQ40Z50要求的速率
2、"Clock stretching"问题,SMBUS下,从机可以拉住SCL信号,让其保持低电平,原IIC协议不处理这问题,就会导致通信失败,
IIC协议里面需在主机将SCL电平拉高后,再判断是否拉高:
#define I2Cx_SCL_H do {\
    HAL_GPIO_WritePin(I2Cx_PORT, I2Cx_SCL_PIN, GPIO_PIN_SET); \
    /*use for smbus, wait until the slave to release iic bus*/ \
    uint32_t timeout = 1000; \
    while(timeout && (HAL_GPIO_ReadPin(I2Cx_PORT, I2Cx_SCL_PIN) != GPIO_PIN_SET)) timeout--; } while(0)


"Clock stretching"问题详见下图:

3、可选的PEC校验

/******************************************************************************
* Name:    CRC-8/SMBUS               
* Poly:    0x07
* Init:    0x00
* Refin:   False
* Refout:False
* Xorout:0x00
* Note:    x8+x2+x+1
*****************************************************************************/

static uint8_t CRC8_Accumulate(uint8_t *buf, uint32_t len)
{
    uint8_t crc8 =0;
    uint8_t i;

    while(len--)
    {
      crc8 ^= *buf++;
      for (i=0; i<8; i++)
      {
            if (crc8 & 0x80)
                crc8 = (crc8 << 1) ^ 0x07;
            else
                crc8 <<= 1;
      }
    }
    return crc8;      
}




eric2013 发表于 2023-3-7 12:28:16

谢谢楼主分享。

yunqi 发表于 2023-3-7 14:24:29

本帖最后由 yunqi 于 2023-3-7 17:42 编辑

谢谢楼主,辛苦!

硬件I2C你也试试,开启PEC、SMBUS,会省好多事

xxxmty 发表于 2023-4-25 10:52:55

楼主你好,我最近在用模拟IIC调试BQ40Z50-R1,发现有时候读到的高位数据为FF是什么原因导致的呢?

Lsh777 发表于 2023-5-11 17:00:59

为什么要用软模拟I2C,是51单片机?

h1ru 发表于 2024-3-27 19:43:05

这个宏,编译不通过
页: [1]
查看完整版本: 模拟IIC改为模拟SMBUS,并读取BQ40Z50