TI中文支持网
TI专业的中文技术问题搜集分享网站

使用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();

user5284978:

得到这样的波形,,,

i2c_Start(); i2c_SendByte(BQ34Z100_SLAVE_ADDRESS);i2c_WaitAck();i2c_SendByte(0x08); i2c_WaitAck();i2c_Start(); i2c_SendByte(BQ34Z100_SLAVE_ADDRESS + 1);i2c_WaitAck();ucReadBuf[0] = i2c_ReadByte();i2c_Ack();ucReadBuf[1] = i2c_ReadByte();i2c_NAck();i2c_Stop();

Johnsin Tao:

回复 user5284978:

Hi确认接口时序。

du dudu:

回复 user5284978:

请问您的问题是怎么解决的?麻烦分享一下,谢谢!

赞(0)
未经允许不得转载:TI中文支持网 » 使用STM32模拟I2C读取bq34z100的数据,读取失败
分享到: 更多 (0)