找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2844|回复: 5
收起左侧

STM32f103RCT6驱动CS5463的代码,可用

[复制链接]
ID:511543 发表于 2020-1-15 09:16 | 显示全部楼层 |阅读模式
#ifndef  _CS5463_H
#define  _CS5463_H

#include "stm32f10x.h"
#include <stdio.h>

//获取cs5463参数结构体
typedef struct{
    uint32_t             DianYa;            //电压
    uint32_t             DianLiu;        //电流
    uint32_t             YouGGL;            //有功功率
    uint32_t             WenDu;            //温度
    uint32_t            YinShu;            //功率因数
    uint8_t             GetON_flag; //获取结束标志
}CS5463Zhi;

extern CS5463Zhi    CS5463zhi;   //定义cs5463一个变量
extern uint8_t    sta;                 //芯片状态

#define CS5463_VScale       516            //计算电压比例,220V*250mv/110mv=500V
#define CS5463_IScale       (250/10)       //计算电流比例

#define READ_MASK            0xBF        //读寄存器时的屏蔽码,与(写)地址相与
#define CMD_SYNC0        0XFE      //结束串口重新初始化
#define CMD_SYNC1        0XFF      //开始串口重新初始化
#define REG_CONFR       0x40       //配置
#define REG_CYCCONT     0x4A       //一个计算周期的A/D转换数
#define REG_STATUSR     0x5E         //状态
#define REG_MODER       0x64      //操作模式
#define REG_MASKR       0x74      //中断屏蔽
#define REG_CTRLR       0x78      //控制
#define CMD_STARTC       0XE8      //执行连续计算周期

#define REG_VRMSR       0X18      //VRMS
#define REG_IRMSR       0X16      //IRMS
#define REG_Pactive   0X14      //Pactive
/*命令定义-结尾*******************************/

//SPI接口
#define      CS5463_SPIx                        SPI1                    //SPI 号
#define      CS5463_SPI_APBxClock_FUN           RCC_APB2PeriphClockCmd  //SPI 时钟总线
#define      CS5463_SPI_CLK                     RCC_APB2Periph_SPI1     //SPI 时钟

//CS5463(1) CS(NSS)--PA2
#define      CS5463_SPI_CS_APBxClock_FUN        RCC_APB2PeriphClockCmd  //GPIO 时钟总线
#define      CS5463_1_SPI_CS_CLK                RCC_APB2Periph_GPIOA   
#define      CS5463_1_SPI_CS_PORT               GPIOA
#define      CS5463_1_SPI_CS_PIN                GPIO_Pin_2

//CS5463(1)INT ---PA1
#define      CS5463_1_INT_CLK                    RCC_APB2Periph_GPIOA   
#define      CS5463_1_INT_PORT                   GPIOA
#define      CS5463_1_INT_PIN                    GPIO_Pin_1

//CS5463(1)RESET ---PA0
#define      CS5463_1_RESET_CLK                    RCC_APB2Periph_GPIOA   
#define      CS5463_1_RESET_PORT                   GPIOA
#define      CS5463_1_RESET_PIN                    GPIO_Pin_0


//CS5463(2) CS(NSS)--PA11
#define      CS5463_2_SPI_CS_CLK                RCC_APB2Periph_GPIOA   
#define      CS5463_2_SPI_CS_PORT               GPIOA
#define      CS5463_2_SPI_CS_PIN                GPIO_Pin_11

//CS5463(2)INT ---PA12
#define      CS5463_2_INT_CLK                    RCC_APB2Periph_GPIOA   
#define      CS5463_2_INT_PORT                   GPIOA
#define      CS5463_2_INT_PIN                    GPIO_Pin_12

//CS5463(2)RESET ---PA13
#define      CS5463_2_RESET_CLK                  RCC_APB2Periph_GPIOA   
#define      CS5463_2_RESET_PORT                 GPIOA
#define      CS5463_2_RESET_PIN                  GPIO_Pin_13


//SPI1_SCK---PA5
#define      CS5463_SPI_SCK_APBxClock_FUN       RCC_APB2PeriphClockCmd
#define      CS5463_SPI_SCK_CLK                 RCC_APB2Periph_GPIOA   
#define      CS5463_SPI_SCK_PORT                GPIOA   
#define      CS5463_SPI_SCK_PIN                 GPIO_Pin_5
//SPI1_MISO--PA6
#define      CS5463_SPI_MISO_APBxClock_FUN      RCC_APB2PeriphClockCmd
#define      CS5463_SPI_MISO_CLK                RCC_APB2Periph_GPIOA   
#define      CS5463_SPI_MISO_PORT               GPIOA
#define      CS5463_SPI_MISO_PIN                GPIO_Pin_6
//SPI1_MOSI---PA7
#define      CS5463_SPI_MOSI_APBxClock_FUN      RCC_APB2PeriphClockCmd
#define      CS5463_SPI_MOSI_CLK                RCC_APB2Periph_GPIOA   
#define      CS5463_SPI_MOSI_PORT               GPIOA
#define      CS5463_SPI_MOSI_PIN                GPIO_Pin_7



//片选引脚操作
#define          SPI_CS5463_CS_1_LOW()                         GPIO_ResetBits( CS5463_1_SPI_CS_PORT, CS5463_1_SPI_CS_PIN )  
#define          SPI_CS5463_CS_2_LOW()                         GPIO_ResetBits( CS5463_2_SPI_CS_PORT,CS5463_2_SPI_CS_PIN)

#define          SPI_CS5463_CS_1_HIGH()                        GPIO_SetBits( CS5463_1_SPI_CS_PORT, CS5463_1_SPI_CS_PIN )
#define          SPI_CS5463_CS_2_HIGH()                        GPIO_SetBits( CS5463_2_SPI_CS_PORT, CS5463_2_SPI_CS_PIN )

#define     cs5463_1_INT_0                      GPIO_ResetBits( CS5463_1_INT_PORT, CS5463_1_INT_PIN )
#define     cs5463_1_INT_1                      GPIO_SetBits( CS5463_1_INT_PORT, CS5463_1_INT_PIN )

#define     cs5463_1_RESET_0                    GPIO_ResetBits( CS5463_1_RESET_PORT, CS5463_1_RESET_PIN )
#define     cs5463_1_RESET_1                    GPIO_SetBits( CS5463_1_RESET_PORT, CS5463_1_RESET_PIN )

#define     cs5463_2_INT_0                      GPIO_ResetBits( CS5463_2_INT_PORT, CS5463_2_INT_PIN )
#define     cs5463_2_INT_1                      GPIO_SetBits( CS5463_2_INT_PORT, CS5463_2_INT_PIN )

#define     cs5463_2_RESET_0                    GPIO_ResetBits( CS5463_2_RESET_PORT, CS5463_2_RESET_PIN )
#define     cs5463_2_RESET_1                    GPIO_SetBits( CS5463_2_RESET_PORT, CS5463_2_RESET_PIN )


void SPI_CS5463_Init(void);

u8 SPI_CS5463_SendByte(u8 byte);
void CS5463Cmd(int cs_index,uint8_t cmd);
void CS5463WriteReg(int cs_index,uint8_t addr,uint8_t *p);
void CS5463ReadReg(int cs_index,uint8_t addr,uint8_t *p);
void CS5463_ResetStatusReg(int cs_index);
void CS5463_GetVoltRMS(int cs_index);                 //读取电压有效值
void CS5463_GetCurrentRMS(int cs_index);        //读取电流有效值
void CS5463_GetPactiveRMS(int cs_index);        //读取有功功率值
void CS5463_GetPowerFactor(int cs_index);        //读取功率因数值
void CS5463_GetTemperature(int cs_index);      //读取温度值
_Bool    CS5463_Init(int cs_index);
uint8_t CS5463_GetStatusReg(int cs_index);
void Get_Zhi(int cs_index);                //获取全部值

/*通讯等待时间处理*/
#define SPIT_FLAG_TIMEOUT         ((uint32_t)0x1000)                        //快速通讯
#define SPIT_LONG_TIMEOUT         ((uint32_t)(10 * SPIT_FLAG_TIMEOUT))      //慢速通讯
#define CS5463_ERROR(fmt,arg...)   printf("<<-FLASH-ERROR->> "fmt"\n",##arg)//SPI通讯错误提醒


#endif

#include "cs5463.h"
#include "bsp_usart.h"        
#include "delay.h"  

static __IO uint32_t  SPITimeout = SPIT_LONG_TIMEOUT;              
static uint16_t       SPI_TIMEOUT_UserCallback(uint8_t errorCode);

static  uint8_t RX_Buff[4];                    //CS5463读写缓冲区
uint8_t sta;                                          //芯片状态
CS5463Zhi    CS5463zhi;



/**
*   CS5463 初始化
*/
void SPI_CS5463_Init(void)
{
  SPI_InitTypeDef      SPI_InitStructure;    //SPI  结构体
  GPIO_InitTypeDef     GPIO_InitStructure;   //GPIO 结构体
   
    /* 打开SPI时钟 */
    CS5463_SPI_APBxClock_FUN ( CS5463_SPI_CLK, ENABLE );
   
    /* 打开SPI的GPIO时钟 */
     CS5463_SPI_CS_APBxClock_FUN ( CS5463_1_SPI_CS_CLK, ENABLE );
   
  //cs5463(1) ---PA2
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;          //50MZ 推挽输出
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin = CS5463_1_SPI_CS_PIN;
  GPIO_Init(CS5463_1_SPI_CS_PORT, &GPIO_InitStructure);
   
    //CS5463(1)INT ---PA1
    GPIO_InitStructure.GPIO_Pin = CS5463_1_INT_PIN;
  GPIO_Init(CS5463_1_INT_PORT, &GPIO_InitStructure);
   
    //CS5463(1)RESET ---PA0
    GPIO_InitStructure.GPIO_Pin =CS5463_1_RESET_PIN;
  GPIO_Init(CS5463_1_RESET_PORT, &GPIO_InitStructure);
   
     //cs5463(2) ---PA11
  GPIO_InitStructure.GPIO_Pin = CS5463_2_SPI_CS_PIN;
  GPIO_Init(CS5463_2_SPI_CS_PORT, &GPIO_InitStructure);
   
    //CS5463(2)INT ---PA12
    GPIO_InitStructure.GPIO_Pin = CS5463_2_INT_PIN;
  GPIO_Init(CS5463_2_INT_PORT, &GPIO_InitStructure);
   
    //CS5463(2)RESET ---PA13
    GPIO_InitStructure.GPIO_Pin = CS5463_2_RESET_PIN;
  GPIO_Init(CS5463_2_RESET_PORT, &GPIO_InitStructure);
   
   
  //SPI_CLK
  GPIO_InitStructure.GPIO_Pin = CS5463_SPI_SCK_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;             //推挽复用
  GPIO_Init(CS5463_SPI_SCK_PORT, &GPIO_InitStructure);

  //SPI_MISO
  GPIO_InitStructure.GPIO_Pin = CS5463_SPI_MISO_PIN;
  GPIO_Init(CS5463_SPI_MISO_PORT, &GPIO_InitStructure);

   //SPI_MOSI
  GPIO_InitStructure.GPIO_Pin = CS5463_SPI_MOSI_PIN;
  GPIO_Init(CS5463_SPI_MOSI_PORT, &GPIO_InitStructure);

  //初始化前,拉高所有芯片(不通讯)
  SPI_CS5463_CS_1_HIGH();
    SPI_CS5463_CS_2_HIGH();
   
  /* SPI 设置 */
    SPI_I2S_DeInit(SPI1);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //双线模式
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                        //设置为主模式
  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                   //16位格式
  SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                          //CPOL = 1
  SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                         //CPHA = 1
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                            //CS 软件控制
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;  //通讯速度
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                   //高位在前
  SPI_InitStructure.SPI_CRCPolynomial = 7;                             //7位效验
   
  SPI_Init(CS5463_SPIx , &SPI_InitStructure);   //初始化SPI                     
  SPI_Cmd(CS5463_SPIx , ENABLE);                //使能SPI

}

#if 0
//发送个字节
short SPI_CS5463_SendHalfWord(u16 HalfWord)
{
      SPITimeout = SPIT_FLAG_TIMEOUT;
  /* 等待上次发送完成 */
  while (SPI_I2S_GetFlagStatus(SPI1 , SPI_I2S_FLAG_TXE) == RESET)
    {
            if((SPITimeout--) == 0)
            {
                 printf("SPI上次发送失败-------\n");   
                 return SPI_TIMEOUT_UserCallback(2);
            }
  }
   
  /* 发送一个字节数据 */
  SPI_I2S_SendData(SPI1 , HalfWord);
    SPITimeout = SPIT_FLAG_TIMEOUT;
   
  /* 等待本次发送数据完成 */
  while (SPI_I2S_GetFlagStatus(SPI1 , SPI_I2S_FLAG_RXNE) == RESET)
    {
      if((SPITimeout--) == 0)
            {
              printf("SPI发送数据失败-------\n");  
              return SPI_TIMEOUT_UserCallback(3);
            }
  }
  /* 接受从设备返回数据*/
  return SPI_I2S_ReceiveData(SPI1);
}


/*
*  @brief  读取cs5463数据
*  @param  :
*          cs_index :从设备号
*      int16_t *buff:保存读取的数据
* @retval 无
*/
void Cs5463Read(int cs_index ,int16_t *buff )
{
        //通讯开始
        if( cs_index == 1){
                SPI_CS5463_CS_1_LOW();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_LOW();
        }


        SPI_CS5463_SendHalfWord(0x0000);               


         //通讯结束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
   
}
#endif


/**
  * @brief  使用SPI发送一个字节的数据
  * @param  byte:要发送的数据
  * @retval 返回接收到的数据
  */
u8 SPI_CS5463_SendByte(u8 byte)
{
     SPITimeout = SPIT_FLAG_TIMEOUT;
  /* 等待发送缓冲区为空,TXE事件 */
  while (SPI_I2S_GetFlagStatus(CS5463_SPIx , SPI_I2S_FLAG_TXE) == RESET)
    {
    if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
   }

  /* 写入数据寄存器,把要写入的数据写入发送缓冲区 */
  SPI_I2S_SendData(CS5463_SPIx , byte);

    SPITimeout = SPIT_FLAG_TIMEOUT;
  /* 等待接收缓冲区非空,RXNE事件 */
  while (SPI_I2S_GetFlagStatus(CS5463_SPIx , SPI_I2S_FLAG_RXNE) == RESET)
  {
    if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
   }

  /* 读取数据寄存器,获取接收缓冲区数据 */
  return SPI_I2S_ReceiveData(CS5463_SPIx );
}

/**
  * @brief  向CS5463发送 写使能 命令
  * @param  none
  * @retval none
  */
void CS5463Cmd(int cs_index,uint8_t cmd)
{
     //通讯开始
        if( cs_index == 1){
                SPI_CS5463_CS_1_LOW();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_LOW();
        }

     /* 发送写使能命令*/
   SPI_CS5463_SendByte(cmd);              

         //通讯结束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
}

/*
    函数名称:CS5463WriteReg
    函数功能:CS5463写寄存器函数
    函数参数:无
*/
void CS5463WriteReg(int cs_index,uint8_t addr,uint8_t *p)
{
    char i;
   
         //通讯开始
        if( cs_index == 1){
                SPI_CS5463_CS_1_LOW();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_LOW();
        }
        
    SPI_CS5463_SendByte(addr);
    for(i = 0; i < 3; i++)
    SPI_CS5463_SendByte((*(p + i)));
   
        //通讯结束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
}


/*************************************************************
** 函数名称:CS5463ReadReg
** 函数功能:CS5463读寄存器函数
** 函数参数:无
** 创建时间:2009-9-14
** 第一次修改时间:无
**************************************************************/
void CS5463ReadReg(int cs_index,uint8_t addr,uint8_t *p)
{
    char i;
    unsigned char data;

             //通讯开始
        if( cs_index == 1){
                SPI_CS5463_CS_1_LOW();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_LOW();
        }
        
    SPI_CS5463_SendByte(addr);
    for(i = 0; i < 3; i++)
    {
        data=SPI_CS5463_SendByte(0xff);
     (*(p + i)) = data;
    }
   
            //通讯结束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
    return ;
}

/*
    函数名称:CS5463Init
    函数功能:CS5463复位和初始化函数
    函数参数:无
*/
_Bool    CS5463_Init(int cs_index)
{
                 //通讯开始
        if( cs_index == 1){
                SPI_CS5463_CS_1_LOW();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_LOW();
        }
    Delay_ms(200);
            //通讯结束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
    Delay_ms(100);
   
    //发送同步序列
RX_Buff[0] = CMD_SYNC1;
RX_Buff[1] = CMD_SYNC1;
RX_Buff[2] = CMD_SYNC0;
CS5463WriteReg(cs_index,CMD_SYNC1,RX_Buff);      //#define CMD_SYNC1        0XFF      //开始串口重新初始化        
//----------------------
//初始化--配置寄存器
//相位补偿为PC[6:0]=[0000000];
//电流通道增益为Igain=10;
//EWA=0;
//INT中断为低电平有效IMODE:IINV=[00]
//iCPU=0
//K[3:0]=[0001]
RX_Buff[0] = 0x00;                        
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x01;
CS5463WriteReg(cs_index,REG_CONFR,RX_Buff);     //    #define REG_CONFR       0x40       //配置
//----------------------
//初始化--操作寄存器
RX_Buff[0] = 0x00; //B0000_0000;  //这是什么鬼 可以这样吗?                          
RX_Buff[1] = 0x00;//B0000_0000;
RX_Buff[2] = 0x60;//B0110_0000;
CS5463WriteReg(cs_index,REG_MODER,RX_Buff);      //#define REG_MODER       0x64      //操作模式
//----------------------
//初始化--电流 交流偏置 校准寄存器
// RW24XX(RX_Buff,3,EE_IACBIAS,0xA1);
// CS5463WriteReg(REG_IACOFF,RX_Buff);   
//----------------------
//初始化--电流 增益校准寄存器
// RW24XX(RX_Buff,3,EE_IACGAIN,0xA1);
// CS5463WriteReg(REG_IGN,RX_Buff);        
//----------------------
//初始化--电压 交流偏置 校准寄存器
// RW24XX(RX_Buff,3,EE_VACBIAS,0xA1);
// CS5463WriteReg(REG_VACOFF,RX_Buff);   
//----------------------
//初始化--电压 增益校准寄存器
// RW24XX(RX_Buff,3,EE_VACGAIN,0xA1);
// CS5463WriteReg(REG_VGN,RX_Buff);        
//----------------------
RX_Buff[0] = 0x00;
RX_Buff[1] = 0x0F;
RX_Buff[2] = 0xA0;                        //#define REG_CYCCONT     0x4A       //一个计算周期的A/D转换数
CS5463WriteReg(cs_index,REG_CYCCONT,RX_Buff);    //初始化--CYCLE COUNT 寄存器,4000
//----------------------
//初始化--脉冲速率寄存器
// RX_Buff[0] = 0x00;
// RX_Buff[1] = 0x34;
// RX_Buff[2] = 0x9C;
// CS5463WriteReg(REG_PULRATE,RX_Buff);   
//----------------------
RX_Buff[0] = 0xFF;
RX_Buff[1] = 0xFF;
RX_Buff[2] = 0xFF;
CS5463WriteReg(cs_index,REG_STATUSR,RX_Buff);    //初始化--状态寄存器  #define REG_STATUSR     0x5E     //状态
//----------------------
RX_Buff[0] = 0x80;                        //开电流、电压、功率测量完毕中断
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x80;                        //开温度测量完毕中断
CS5463WriteReg(cs_index,REG_MASKR,RX_Buff);        //初始化--中断屏蔽寄存器    #define REG_MASKR       0x74      //中断屏蔽
//----------------------
RX_Buff[0] = 0x00;
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x00;
CS5463WriteReg(cs_index,REG_CTRLR,RX_Buff);        //初始化--控制寄存器   #define REG_CTRLR       0x78      //控制  
//----------------------
CS5463Cmd(cs_index,CMD_STARTC);                       //启动连续转换        #define CMD_STARTC       0XE8      //执行连续计算周期

    Delay_ms(500);
    return 1;
}   
/*************************************************************
** 函数名称:CS5463_ResetStatusReg
** 函数功能:复位状态寄存器函数
** 函数参数:无
**************************************************************/
void CS5463_ResetStatusReg(int cs_index)
{
RX_Buff[0] = 0xFF;
RX_Buff[1] = 0xFF;
RX_Buff[2] = 0xFF;
CS5463WriteReg(cs_index,0x5E,RX_Buff);        //复位状态寄存器    #define REG_STATUSR     0x5E     //状态  
}

/*************************************************************
** 函数名称:CS5463_GetVoltRMS
** 函数功能:读取电压有效值函数
**************************************************************/
void CS5463_GetVoltRMS(int cs_index)         //这个函数啥意思?     PT2017-2-12 电压显示OK
{
float G = 0.5,result;        //typedef float          fp32;      就是浮点类型
uint8_t temp,i,j;          //  byte
CS5463ReadReg(cs_index,REG_VRMSR,RX_Buff);           //读取电压有效值        这里就读到了吗?  是
//SndCom1Data(RX_Buff,3);                    //#define REG_VRMSR       0x58    //电压有效值  电压有效值0x58吗?是写
i = 0;
result = 0;
while(i<3)
{
      temp = RX_Buff[i];                       
    j = 0;
    while(j<8)
    {
         if(temp&0x80)
        {
             result += G;   
        }
        temp <<= 1;
        j++;
        G = G/2;   
    }
    i++;                                
}                                        //电压在220时取样电压为78mv
result = result*CS5463_VScale;//V_Coff;                //计算电压值220V*250mv/(110mv/1.414)=704.8V        可以暂时不用  
// if(result<=100)return;                    //如果测量读出电压小于100V,确认读数错误
result *= 1000;                        //单位为mV(毫伏) 12345mv  5位你怎么显示
CS5463zhi.DianYa = (uint32_t)result;
if(CS5463zhi.DianYa<10000)
{
    CS5463zhi.DianYa=0;
}
}
/*************************************************************
** 函数名称:CS5463_GetCurrentRMS
** 函数功能:读取电流有效值函数
** 函数参数:无
**************************************************************/
void CS5463_GetCurrentRMS(int cs_index)
{
float G = 0.5,result;
uint8_t temp,i,j;
CS5463ReadReg(cs_index,REG_IRMSR,RX_Buff);           //读取电流有效值
//SndCom1Data(RX_Buff,3);
i = 0;
result = 0;
while(i<3)
{
      temp = RX_Buff[i];                       
    j = 0;
    while(j<8)
    {
         if(temp&0x80)
        {
             result += G;   
        }
        temp <<= 1;
        j++;
        G = G/2;   
    }
    i++;
}
result = result*CS5463_IScale;//I_Coff;                        //计算电流值 暂时不用
result *= 1000;                                //单位mA(毫安)  12345ma
CS5463zhi.DianLiu =(uint32_t) result;
if(CS5463zhi.DianLiu <5)
{
    CS5463zhi.DianLiu =0;
}
     
}

/*************************************************************
** 函数名称:CS5463_GetPactiveRMS
** 函数功能:读取有功功率函数
** 函数参数:无
**************************************************************/
void CS5463_GetPactiveRMS(int cs_index)
{
float G = 1.0,result;
uint8_t temp,i,j;
CS5463ReadReg(cs_index,0x14,RX_Buff);       //读取有功功率REG_Pactive
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
if(temp&0x80)                              //如果为负数,计算原码
{
      RX_Buff[0] = ~RX_Buff[0];            //本来为取反+1,这里因为精度的原因,不+1
    RX_Buff[1] = ~RX_Buff[1];
    RX_Buff[2] = ~RX_Buff[2];            
}
i = 0;
result = 0;
while(i<3)
{
      temp = RX_Buff[i];                       
    j = 0;
    while(j<8)
    {
         if(temp&0x80)
        {
             result += G;   
        }
        temp <<= 1;
        j++;
        G = G/2;   
    }
    i++;
}
// result = result*P_Coff;                //计算功率,单位W(瓦特)
// result = Vrms*Irms;                    ////////直接计算功率
  result = result*13125;
    CS5463zhi.YouGGL = (uint32_t)result;
}
/*************************************************************
** 函数名称:CS5463_GetPowerFactor
** 函数功能:读取功率因数函数
** 函数参数:无
**************************************************************/
void CS5463_GetPowerFactor(int cs_index)
{
float G = 1.0,result;
uint8_t temp,i,j;
CS5463ReadReg(cs_index,0x32,RX_Buff);           //读取功率因数
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
if(temp&0x80)                              //如果为负数,计算原码
{
      RX_Buff[0] = ~RX_Buff[0];            //本来为取反+1,这里因为精度的原因,不+1
    RX_Buff[1] = ~RX_Buff[1];
    RX_Buff[2] = ~RX_Buff[2];            
}
i = 0;
result = 0;
while(i<3)
{
      temp = RX_Buff[i];                       
    j = 0;
    while(j<8)
    {
         if(temp&0x80)
        {
             result += G;   
        }
        temp <<= 1;
        j++;
        G = G/2;   
    }
    i++;
}
result *= 100;
CS5463zhi.YinShu = (uint32_t)result;
}
/*************************************************************
** 函数名称:CS5463_GetTemperature
** 函数功能:读取温度函数
** 函数参数:无
**************************************************************/
void CS5463_GetTemperature(int cs_index)      //温度能显示了 PT2017-2-12
{
float G = 128,result;
uint8_t temp,i,j;//pn=0;
CS5463ReadReg(cs_index,0x26,RX_Buff);           //读取温度    是的在这里就读到了温度
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
// if(temp&0x80)                              //如果为负数,计算原码
// {
//      pn = 1;                                //负数标志
//    RX_Buff[0] = ~RX_Buff[0];            //本来为取反+1,这里因为精度的原因,不+1
//    RX_Buff[1] = ~RX_Buff[1];
//    RX_Buff[2] = ~RX_Buff[2];            
// }
i = 0;
result = 0;    //这个值是浮点数 先清零 再逐个把0.5的权 数据加进来
while(i<3)
{
      temp = RX_Buff[i];    //虽然这个数组定义了4个字节 实际就用了 Buff[0]  Buff[1]  RX_Buff[2]                  
    j = 0;
    while(j<8)
    {
         if(temp&0x80)
        {
             result += G;    //把0.5的权数据加进来         
        }
        temp <<= 1;
        j++;
        G = G/2;   
    }
    i++;
}
if(result<128)              //是的这个result 是 -127,128   这里已经获取了温度浮点值 最多是一个3位数? 还有小数点
{
    CS5463zhi.WenDu = (uint32_t)result;      //是的 这里就是 例如12523  -----> 125.23  怎么去显示? 如何分离 从8A开始显示
}
}


/*************************************************************
** 函数名称:CS5463_GetStatusReg
** 函数功能:读取状态寄存器函数
** 函数参数:无
**************************************************************/
uint8_t CS5463_GetStatusReg(int cs_index)
{
uint8_t sta=0;
CS5463ReadReg(cs_index,0x1E,RX_Buff);       //1E 是什么?   状态寄存器
if(RX_Buff[0]&0x80)                       //检测:电流、电压、功率测量是否完毕
{
    //检测电流/电压是否超出范围
    //检测电流有效值/电压有效值/电能是否超出范围
    if((RX_Buff[0]&0x03)||(RX_Buff[1]&0x70))
    {
         CS5463_ResetStatusReg(cs_index);        //复位状态寄存器
    }
    else
    {
        sta |= 0x01;//B0000_0001;    //这什么意思 还可以这样写吗? PT2017-2-8   分隔符吗?
    }
}

if(RX_Buff[2]&0x80)                   //检测:温度测量是否完毕
{
      sta |=0x02; //B0000_0010;
}
return(sta);   
}  

void Get_Zhi(int cs_index)
{
    sta    = CS5463_GetStatusReg(cs_index);         //检测中断产生的原因        
        if(0x01==(sta&0x01))                       //读取电流电压
        {   
            CS5463_ResetStatusReg(cs_index);            //清除标志
            CS5463_GetVoltRMS(cs_index);                    //获取电压
            CS5463_GetCurrentRMS(cs_index);                //获取电流
            CS5463_GetPactiveRMS(cs_index);                //获取功率
            CS5463_GetPowerFactor(cs_index);            //获取功率因数
            if(0x02==(sta&0x02))                    //读取温度
            {   
                CS5463_GetVoltRMS(cs_index);                //获取电压                                
//                CS5463_GetTemperature();        //温度读取不需要太频繁,所以跟电流电压一起读取
             }   
            else
            {
                    CS5463_Init(cs_index);                        //重新初始化芯片
            }
            
     }
}


static  uint16_t SPI_TIMEOUT_UserCallback(uint8_t errorCode)
{
        CS5463_ERROR("SPI!errorCode = %d",errorCode);
        return 0;
}




回复

使用道具 举报

ID:503152 发表于 2020-1-22 21:12 | 显示全部楼层
分享就好!
回复

使用道具 举报

ID:696302 发表于 2020-3-15 10:02 | 显示全部楼层
感谢分享~~~学习
回复

使用道具 举报

ID:605975 发表于 2020-4-21 11:33 | 显示全部楼层
我也在学习CS5463,为什么我用万用表测量输入端电压,CS5463就不测量了,发现CRDY位始终为0,这是为什么呢,希望高手指导!
回复

使用道具 举报

ID:605975 发表于 2020-4-21 11:36 | 显示全部楼层
我的CS5463用万用表测量输入电压,CS5463就不工作了,发现状态寄存器的CRDY位一直为0,希望高手指导!
回复

使用道具 举报

ID:731155 发表于 2020-4-21 19:37 | 显示全部楼层
感谢分享,学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表