当时调这电池的时候,遇到这样的问题,在TI论坛留言的自己的QQ,所以很多人会加我,询问这个问题如何解决。这里给大家统一解答一下。
规格书的时序有点问题,规格书上说clk sda延时1us或者2us这样。其实有问题。如果你发了0xaa有应答。说明你软件模拟的I2C没有问题,问题是在时序身上。大家只要把你们延时写的1us或者2us全部改成1MS(或者加时钟拉伸)。电池的I2C就通了。
下面附上我的软件代码:
void Bq34z100_G1_IIC_Init(void)
{
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
HTCFG_OUTPUT_SCL_CLK(CKCUClock) = 1;
HTCFG_OUTPUT_SDA_CLK(CKCUClock) = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
AFIO_GPxConfig(HTCFG_OUTPUT_SCL_ID, HTCFG_OUTPUT_SCL_AFIO_PIN, AFIO_MODE_DEFAULT);
AFIO_GPxConfig(HTCFG_OUTPUT_SDA_ID, HTCFG_OUTPUT_SDA_AFIO_PIN, AFIO_MODE_DEFAULT);
GPIO_DirectionConfig(HTCFG_SDA, HTCFG_OUTPUT_SCL_GPIO_PIN, GPIO_DIR_OUT);
GPIO_DirectionConfig(HTCFG_SCL, HTCFG_OUTPUT_SDA_GPIO_PIN, GPIO_DIR_OUT);
GPIO_PullResistorConfig(HTCFG_SCL,HTCFG_OUTPUT_SCL_GPIO_PIN,GPIO_PR_DISABLE);
GPIO_PullResistorConfig(HTCFG_SDA,HTCFG_OUTPUT_SDA_GPIO_PIN,GPIO_PR_DISABLE);
GPIO_OpenDrainConfig(HTCFG_SDA,HTCFG_OUTPUT_SDA_GPIO_PIN,DISABLE);
GPIO_OpenDrainConfig(HTCFG_SCL,HTCFG_OUTPUT_SCL_GPIO_PIN,DISABLE);
SCL_H();
SDA_H();
}
void Bq34z100_G1_SDA_OUT(void)
{
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
HTCFG_OUTPUT_SDA_CLK(CKCUClock) = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
AFIO_GPxConfig(HTCFG_OUTPUT_SDA_ID, HTCFG_OUTPUT_SDA_AFIO_PIN, AFIO_MODE_DEFAULT);
GPIO_InputConfig(HTCFG_SDA,HTCFG_OUTPUT_SDA_AFIO_PIN,DISABLE);
GPIO_OpenDrainConfig(HTCFG_SDA,HTCFG_OUTPUT_SDA_GPIO_PIN,ENABLE);
GPIO_DirectionConfig(HTCFG_SDA, HTCFG_OUTPUT_SDA_AFIO_PIN, GPIO_DIR_OUT);
}
void Bq34z100_G1_SDA_IN(void)
{
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
HTCFG_OUTPUT_SDA_CLK(CKCUClock) = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE);
AFIO_GPxConfig(HTCFG_OUTPUT_SDA_ID, HTCFG_OUTPUT_SDA_AFIO_PIN, AFIO_MODE_DEFAULT);
GPIO_InputConfig(HTCFG_SDA,HTCFG_OUTPUT_SDA_AFIO_PIN,ENABLE);
GPIO_DirectionConfig(HTCFG_SDA, HTCFG_OUTPUT_SDA_AFIO_PIN, GPIO_DIR_IN);
}
/********************* IIC?e??D?o?oe?y ***************************/
void IIC_Start(void)
{
Bq34z100_G1_SDA_OUT();
SDA_H();
SCL_H();
delay_ms(1);
SDA_L();
delay_ms(1);
SCL_L();
}
/********************* IIC?a?1D?o?oe?y ***************************/
void IIC_Stop(void)
{
Bq34z100_G1_SDA_OUT();
SCL_L();
SDA_L();
delay_ms(2);
SCL_H();
SDA_H();
delay_ms(1);
}
/********************* IICd????|¤eoe?y ***************************/
void IIC_Send_ACK(void)
{
SCL_L();
Bq34z100_G1_SDA_OUT();
SDA_L();
delay_ms(2);
SCL_H();
delay_ms(1);
SCL_L();
}
/********************* IICd???d??|¤eoe?y ***************************/
void IIC_Send_NoACK(void)
{
SCL_L();
Bq34z100_G1_SDA_OUT();
SDA_H();
delay_ms(2);
SCL_H();
delay_ms(1);
SCL_L();
delay_ms(2);
}
/********************* IIC??2a?|¤eoe?y **************************
d?????ao1ao??2a??d??|¤eD?o?a?0ao??2a???|¤eD?o?
****************************************************************/
u8 IIC_Get_ACK(void)
{
u8 ErrorTime = 0; //3???????
Bq34z100_G1_SDA_IN();
SCL_L();
delay_ms(2);
SCL_H();
delay_ms(2);
while(READ_SDA())
{
ErrorTime++;
if(ErrorTime > 250)
{
printf("3??? ");
SCL_L();
return 1;
}
}
SCL_L();
return 0;
}
/********************* IICD¤????oe?y **************************
2??yao
dataaoD??ad??????y?Y
****************************************************************/
void IIC_Write_Byte(u8 data)
{
u8 i;
u8 tmp_data = data;
Bq34z100_G1_SDA_OUT();
SCL_L();
for(i=0;i<8;i++)
{
if(tmp_data & 0x80){
SDA_H();
}else{
SDA_L();
}
SCL_H();
delay_ms(2);
SCL_L();
delay_ms(2);
tmp_data <<= 1;
}
}
/********************* IIC??????oe?y **************************
2??yao
ackao?|¤eD?o? 0ao?|¤ea?1aod??|¤e
d?????aod????????????y?Y
****************************************************************/
u8 IIC_Read_Byte(u8 ack)
{
unsigned char i,receive=0;
Bq34z100_G1_SDA_IN();//SDA?????a????
for(i=0;i<8;i++ )
{
SCL_L();
delay_ms(2);
SCL_H();
receive<<=1;
if(READ_SDA())receive++;
delay_ms(1);
}
if (!ack)
IIC_Send_NoACK();//d???nACK
else
IIC_Send_ACK(); //d???ACK
return receive;
}
/****************** AT24C02D¤????oe?y ********************
2??yao
Dev_adderao?g?????d(4+3+1) --- ???-D¤
Wor_adderao1¨?????d --- D¤??????
Dataao ???Y --- D¤?2?¤
*********************************************************/
void AT24C02_Write_Byte(u8 Dev_adder, u8 Wor_adder, u8 Data)
{
IIC_Start(); //IIC?e??D?o?
IIC_Write_Byte(Dev_adder); //d????g?????d
if( IIC_Get_ACK() ) //??2a?|¤e
{
goto WR_End;
}
IIC_Write_Byte(Wor_adder); //d???1¨?????d
if( IIC_Get_ACK() ) //??2a?|¤e
{
goto WR_End;
}
IIC_Write_Byte(Data); //d???1???????y?Y
if( IIC_Get_ACK() ) //??2a?|¤e
{
goto WR_End;
}
WR_End:
IIC_Stop(); //2????a?1D?o?
delay_ms(5);
}
u8 AT24C02_Read_Byte(u8 Dev_adder, u8 Wor_adder)
{
u8 rec = 0;
IIC_Start(); //2????e??D?o?
IIC_Write_Byte(Dev_adder); //d????g?????d
if( IIC_Get_ACK() ) //??2a?|¤e
{
printf("???d2??|¤e ");
goto WR_End;
}
IIC_Write_Byte(Wor_adder); //d???1¨?????d
if( IIC_Get_ACK() ) //??2a?|¤e
{
printf("????2??|¤e ");
goto WR_End;
}
// IIC_Stop();
/****************** ????????D¤ ***************************/
IIC_Start(); //2????e??D?o?
IIC_Write_Byte(Dev_adder|0x01); //d????g?????da?????????1a???D¤????
if( IIC_Get_ACK() ) //??2a?|¤e
{
printf("????2??|¤e ");
goto WR_End;
}
tmep_flag[0] = IIC_Read_Byte(1); //????1???????y?Ya?2?d???????d??|¤eD?o?
tmep_flag[1] = IIC_Read_Byte(0); //????1???????y?Ya?2?d???????d??|¤eD?o?
WR_End:
IIC_Stop(); //2????a?1D?o?
return rec;
}