使用STM32模拟I2C读取bq34z100的数据,读取失败

我使用stm32模拟i2c读取其他i2c接口芯片没问题,是可以正常通信的,读bq34z100的时候没成功,发送aa也有ack但是我用逻辑分析仪发现一堆ff不清楚 什么情况,请求支援,如果有个代码参考更好了。


void i2c_Start(void)
{
    /* 当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 */
    I2C_SDA_1();
    i2c_Delay();
    I2C_SCL_1();
    i2c_Delay();
    I2C_SDA_0();
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
}

void i2c_Repeated_Start(void)
{
  i2c_Start();
}

void i2c_Stop(void)
{
    /* 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 */
    I2C_SDA_0();
  i2c_DelayN(1);
    I2C_SCL_1();
    i2c_Delay();
    I2C_SDA_1();
  i2c_Delay();
}

void i2c_SendByte(uint8_t _ucByte)
{
    uint8_t i;

    /* 先发送字节的高位bit7 */
    for (i = 0; i < 8; i++)
    {
        if (_ucByte & 0x80)
        {
            I2C_SDA_1();
        }
        else
        {
            I2C_SDA_0();
        }
        i2c_Delay();
        I2C_SCL_1();
        i2c_Delay();
        I2C_SCL_0();
        if (i == 7)
        {
             I2C_SDA_1(); // 释放总线
        }
        _ucByte <<= 1;    /* 左移一个bit */
        i2c_Delay();
    }
}

uint8_t i2c_ReadByte(void)
{
    uint8_t i;
    uint8_t value;

    /* 读到第1个bit为数据的bit7 */
    value = 0;
    for (i = 0; i < 8; i++)
    {
        value <<= 1;
        I2C_SCL_1();
        i2c_Delay();
        if (I2C_SDA_READ())
        {
            value++;
        }
        I2C_SCL_0();
        i2c_Delay();
    }
    return value;
}

uint8_t i2c_WaitAck(void)
{
    uint8_t re;

    I2C_SDA_1();    /* CPU释放SDA总线 */
    i2c_Delay();
    I2C_SCL_1();    /* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
    i2c_Delay();
    if (I2C_SDA_READ())    /* CPU读取SDA口线状态 */
    {
        re = 1;
    }
    else
    {
        re = 0;
    }
    I2C_SCL_0();
    i2c_Delay();
    return re;
}

void i2c_Ack(void)
{
    I2C_SDA_0();    /* CPU驱动SDA = 0 */
    i2c_Delay();
    I2C_SCL_1();    /* CPU产生1个时钟 */
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
    I2C_SDA_1();    /* CPU释放SDA总线 */
}

void i2c_NAck(void)
{
    I2C_SDA_1();    /* CPU驱动SDA = 1 */
    i2c_Delay();
    I2C_SCL_1();    /* CPU产生1个时钟 */
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
}

uint8_t i2c_CheckDevice(uint8_t _Address)
{
    uint8_t ucAck;

    if (I2C_SDA_READ() && I2C_SCL_READ())
    {
        i2c_Start();        /* 发送启动信号 */

        /* 发送设备地址+读写控制bit(0 = w, 1 = r) bit7 先传 */
        i2c_SendByte(_Address | I2C_WR);
        ucAck = i2c_WaitAck();    /* 检测设备的ACK应答 */

        i2c_Stop();            /* 发送停止信号 */

        return ucAck;
    }
    return 1;    /* I2C总线异常 */
}

    i2c_Start();
    i2c_SendByte(BQ34Z100_SLAVE_ADDRESS);
    i2c_WaitAck();
 
    i2c_SendByte(0x0C);
    i2c_WaitAck();

    i2c_Start();
    i2c_SendByte(BQ34Z100_SLAVE_ADDRESS + 1);
    i2c_WaitAck();

  ucReadBuf[2] = i2c_ReadByte();
  i2c_WaitAck();

    ucReadBuf[3] = i2c_ReadByte();
    i2c_NAck();

    i2c_Stop();

3 个回复