钜泉光电ATT7053C芯片STM32 SPI驱动

一、硬件(低速)光耦隔离,测试速率40Kbps较稳定,80Kbps不稳定。 

二、MX软件SPI配置

SPI读函数

void Read_ATT7053_B( uint8_t addr, uint8_t *ATTdata, uint8_t len )
{
        uint32_t i=0;
    
      ATT7053_B_CS_Low;//片选拉低
      HAL_Delay_us(10);
      SPI3_ReadWriteByte(addr|Att7053_Readflag);  //读地址 
    for(i=0;i<len;i++)
    {
         ATTdata[i]=SPI3_ReadWriteByte(0xFF);      
    }
    ATT7053_B_CS_High;//片选拉高
}

SPI写函数 

//设置ATT7053参数  
void ATT7053_Set( uint8_t addr, uint8_t *ATTdata, uint8_t len )
{
    uint8_t i=0;
    
    ATT7053_B_CS_Low;//片选拉低
    HAL_Delay_us(10);
    SPI3_ReadWriteByte(addr|Att7053_Writeflag);  //写地址 
    for(i=0;i<len;i++)
    {
         SPI3_ReadWriteByte(ATTdata[len-i-1]);      
    }
    ATT7053_B_CS_High;//片选拉高
   
}
    

通讯校验函数//可以不用
uint32_t COMCheckB(uint8_t *Rx_Data,uint8_t len)
{
    uint8_t   COMChecksum[3]={0,0,0};
    uint16_t  Rx_Checksum=0,ATT_Checksum=0,Check_OK=0,i=0;
    
    Read_ATT7053_B(COMChecksum_Add,COMChecksum,len);
  Rx_Checksum=COMChecksum[1]*256+COMChecksum[2];
    
    ATT_Checksum=COMChecksum[0];//上次通讯的命令字
    for(i=0;i<len;i++)
      ATT_Checksum+=Rx_Data[i];
    if(Rx_Checksum==ATT_Checksum)
    {
      Check_OK=1; 
    }
    else
    {      
        Check_OK=0;
    }
    return Check_OK;
}

主函数
void ATT7053_Pro(void)
{
    uint8_t        ATT_Data_A[3],ATT_Data_B[3];
    uint32_t    ATT_Rx_Data_A=0,ATT_Rx_Data_B=0,ADC_Data=0;
    
    //读芯片内部ChipID
    Read_ATT7053_B(ADDR_ChipID, ATT_Data_B,3);
    if(COMCheckB(ATT_Data_B,3)==1)//B路芯片校验通过
    {
        ATT_Rx_Data_B=(ATT_Data_B[0]<<16)|(ATT_Data_B[1]<<8)|ATT_Data_B[2];
    }
    if(ATT_Rx_Data_B != ChipID)//如果读取错误,对芯片重启
    {
        ATT7053_Err_Count++;//累计10次断电重启
        ATT7053_Rst();
    }else
    {
      ATT7053_Err_Count=0;
    }
    
    Read_ATT7053_B(Rms_U_Add,ATT_Data_B,3);//读取B路电压
    if(COMCheckB(ATT_Data_B,3)==1)//校验通过
    {
        ADC_Data=(ATT_Data_B[0]<<16)|(ATT_Data_B[1]<<8)|ATT_Data_B[2];
        AC_Voltage_B=5.2597842755*ADC_Data/10000;
    }

}

交流电压有效值寄存器 Rms_U_Add     08H 

 吐槽一下,这芯片手册校准方法写的地方太隐晦难懂,折腾我半天,实在没办法打厂家电话问出来的。 US0~US23根本不是19位ADC的LSB真实数据,是经过转换后的,乘以K后就能到得到实际电压数据。

注意:5.2597842755是K值系数,算出来写死即可。

已经把分压电阻的比例及误差也计算进去了,挺方便的。

K值校准方法(居然写在文档最下面)

电压、电流都是一样的计算方法

宏定义

#define   ChipID          0x7053B0
#define   ADDR_ChipID     0x1B 
#define   DeviceID        0x705321
#define   ADDR_DeviceID   0x1C

#define   COMChecksum_Add   0x17
#define   Rms_U_Add         0x08   

#define   Att7053_Writeflag  0x80
#define   Att7053_Readflag   0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值