我使用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:
请问您的问题是怎么解决的?麻烦分享一下,谢谢!