帮助TI的电池例如bq34z100或者BQ27541发了地址0xaa有应答,发命令0x08就没应答的问题。

  当时调这电池的时候,遇到这样的问题,在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;
}

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值