近期调试过的tla2528采样芯片,以下为相关驱动代码记录:
1 c文件
/*******************************************************************************

  • Function Name : sTla2528Init
  • Description : 初始化TLA2528,TLA2528默认均为模拟输入,该函数可能不需要调用
  • Input : None.
  • Output : None.
  • Return : None.
    *******************************************************************************/
    void sTla2528Init(uint8_t i2cAddress)
    {

}

/*******************************************************************************

  • Function Name : sTLA2528_ReadChannels

  • Description : TLA2528所有channels读取采样值

  • Input : None.

  • Output : None.

  • Return : None.
    *******************************************************************************/
    uint16_t sTLA2528_ReadChannels(uint8_t i2cAddress,uint8_t channel)
    {
    uint16_t adc_value;

    uint8_t reg_value = channel & MANUAL_CHID_MASK;

    sTLA2528_WriteReg_WithOpc(i2cAddress,0x08,MANUAL_CH_SEL_ADDRESS,reg_value);

    sIIC_DlyUs(500);

    adc_value = sTLA2528_SigleAdcRead(i2cAddress);

    return adc_value;
    }

/*******************************************************************************

  • Function Name : sTLA2528_SingleRegRead

  • Description: sTLA2528读ADC

  • Parameters:

  • Returns: None
    *******************************************************************************/
    uint16_t sTLA2528_SigleAdcRead(uint8_t i2cAddress)
    {
    uint16_t temp = 0;

    sIIC_Start();
    sIIC_Send_Byte((i2cAddress<<1)+1);
    sIIC_Wait_Ack();

    temp = sIIC_Read_Byte(1); //读取高8位
    temp = temp << 8;
    temp += sIIC_Read_Byte(0); //读取低8位 + 高8位 构成一个字
    sIIC_Stop();
    return temp;
    }

/*******************************************************************************

  • Function Name : sTLA2528_SingleRegRead

  • Description: sTLA2528从寄存器读一个字节,注意与读ADC区分开

  • Parameters:

  • Returns: None
    *******************************************************************************/
    uint8_t sTLA2528_ReadReg_WithOpC(uint8_t i2cAddress,uint8_t i2cCmd,uint8_t RegAddress)
    {
    uint8_t temp = 0;

    sIIC_Start();
    sIIC_Send_Byte(i2cAddress << 1);
    sIIC_Wait_Ack();

    sIIC_Send_Byte(i2cCmd);
    sIIC_Wait_Ack();
    sIIC_Send_Byte(RegAddress);
    sIIC_Wait_Ack();
    sIIC_Stop();

    sIIC_Start();
    sIIC_Send_Byte((i2cAddress<<1)+1);
    sIIC_Wait_Ack();
    temp = sIIC_Read_Byte(1); //读取高8位
    sIIC_Stop();
    return temp;
    }

/*******************************************************************************

  • Function Name : sTLA2528_WriteReg_WithOpc
  • Description: sTLA2528写单一寄存器(手册图31)
  • Parameters:
  • Returns: None
    *******************************************************************************/
    void sTLA2528_WriteReg_WithOpc(uint8_t i2cAddress,uint8_t i2cCmd,uint8_t RegAddress,uint8_t RegData)
    {
    sIIC_Start();
    sIIC_Send_Byte(i2cAddress << 1);
    sIIC_Wait_Ack();
    sIIC_Send_Byte(i2cCmd);
    sIIC_Wait_Ack();
    sIIC_Send_Byte(RegAddress);
    sIIC_Wait_Ack();
    sIIC_Send_Byte(RegData);
    sIIC_Wait_Ack();
    sIIC_Stop();
    }

/*******************************************************************************

  • Function Name : sTLA2528_WriteReg
  • Description: sTLA2528不通过opc code
  • Parameters:
  • Returns: None
    *******************************************************************************/
    void sTLA2528_WriteReg(uint8_t i2cAddress,uint8_t RegAddress,uint8_t RegData)
    {
    sIIC_Start();
    sIIC_Send_Byte(i2cAddress << 1);
    sIIC_Wait_Ack();
    sIIC_Send_Byte(RegAddress);
    sIIC_Wait_Ack();
    sIIC_Send_Byte(RegData);
    sIIC_Wait_Ack();
    sIIC_Stop();
    }

/*******************************************************************************

  • Function Name : sReadReg

  • Description: 读取寄存器值

  • Parameters:

  • Returns: None
    *******************************************************************************/
    uint8_t sReadReg(uint8_t i2cAddress,uint8_t RegAddress)
    {
    uint8_t temp = 0;

    temp = sTLA2528_ReadReg_WithOpC(i2cAddress,0x10,RegAddress);

    return temp;
    }

2 头文件
//I2C总线2地址0x17

define TLA2528_I2C2_ADDR 0x17 //TLA2528 I2C地址

//I2C总线1地址0x14

define TLA2528_I2C1_ADDR 0x14 //TLA2528 I2C地址

/* MANUAL_CH_SEL register */
#define MANUAL_CH_SEL_ADDRESS ((uint8_t) 0x11)
#define MANUAL_CH_SEL_DEFAULT ((uint8_t) 0x00)

/* MANUAL_CHID field */
#define MANUAL_CHID_MASK												((uint8_t) 0x0F)
#define MANUAL_CHID_AIN0												((uint8_t) 0x00)    // DEFAULT
#define MANUAL_CHID_AIN1												((uint8_t) 0x01)
#define MANUAL_CHID_AIN2												((uint8_t) 0x02)
#define MANUAL_CHID_AIN3												((uint8_t) 0x03)
#define MANUAL_CHID_AIN4												((uint8_t) 0x04)
#define MANUAL_CHID_AIN5												((uint8_t) 0x05)
#define MANUAL_CHID_AIN6												((uint8_t) 0x06)
#define MANUAL_CHID_AIN7												((uint8_t) 0x07)

3 应用层调用
应用层代码调用简略如下:

     ….
     sIIC_Init();

    while(1)
    {
        //定时任务100ms进来一次
        //adc  0~4095
        OpVolt24_1Adc = sTLA2528_ReadChannels(TLA2528_I2C1_ADDR,2)>>4;
        sIIC_DlyUs(500); //延时

        OpCurr24_1Adc = sTLA2528_ReadChannels(TLA2528_I2C1_ADDR,3)>>4;
        sIIC_DlyUs(500); //延时

        ThermalAdc = sTLA2528_ReadChannels(TLA2528_I2C2_ADDR,6)>>4;
        sIIC_DlyUs(500); //延时
        
       //adc  0~4095
        IpVoltAdc = sTLA2528_ReadChannels(TLA2528_I2C2_ADDR,2)>>4;
        sIIC_DlyUs(500); //延时
        
        IpCurrAdc = sTLA2528_ReadChannels(TLA2528_I2C2_ADDR,3)>>4;
        sIIC_DlyUs(500); //延时
        
        OpVolt24_2Adc = sTLA2528_ReadChannels(TLA2528_I2C2_ADDR,4)>>4;
        sIIC_DlyUs(500); //延时
        
        OpCurr24_2Adc = sTLA2528_ReadChannels(TLA2528_I2C2_ADDR,5)>>4;
        sIIC_DlyUs(500); //延时
  ….

    仅供参考。