久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4043|回復(fù): 5
收起左側(cè)

STM32f103RCT6驅(qū)動(dòng)CS5463的代碼,可用

[復(fù)制鏈接]
ID:511543 發(fā)表于 2020-1-15 09:16 | 顯示全部樓層 |閱讀模式
#ifndef  _CS5463_H
#define  _CS5463_H

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

//獲取cs5463參數(shù)結(jié)構(gòu)體
typedef struct{
    uint32_t             DianYa;            //電壓
    uint32_t             DianLiu;        //電流
    uint32_t             YouGGL;            //有功功率
    uint32_t             WenDu;            //溫度
    uint32_t            YinShu;            //功率因數(shù)
    uint8_t             GetON_flag; //獲取結(jié)束標(biāo)志
}CS5463Zhi;

extern CS5463Zhi    CS5463zhi;   //定義cs5463一個(gè)變量
extern uint8_t    sta;                 //芯片狀態(tài)

#define CS5463_VScale       516            //計(jì)算電壓比例,220V*250mv/110mv=500V
#define CS5463_IScale       (250/10)       //計(jì)算電流比例

#define READ_MASK            0xBF        //讀寄存器時(shí)的屏蔽碼,與(寫)地址相與
#define CMD_SYNC0        0XFE      //結(jié)束串口重新初始化
#define CMD_SYNC1        0XFF      //開始串口重新初始化
#define REG_CONFR       0x40       //配置
#define REG_CYCCONT     0x4A       //一個(gè)計(jì)算周期的A/D轉(zhuǎn)換數(shù)
#define REG_STATUSR     0x5E         //狀態(tài)
#define REG_MODER       0x64      //操作模式
#define REG_MASKR       0x74      //中斷屏蔽
#define REG_CTRLR       0x78      //控制
#define CMD_STARTC       0XE8      //執(zhí)行連續(xù)計(jì)算周期

#define REG_VRMSR       0X18      //VRMS
#define REG_IRMSR       0X16      //IRMS
#define REG_Pactive   0X14      //Pactive
/*命令定義-結(jié)尾*******************************/

//SPI接口
#define      CS5463_SPIx                        SPI1                    //SPI 號(hào)
#define      CS5463_SPI_APBxClock_FUN           RCC_APB2PeriphClockCmd  //SPI 時(shí)鐘總線
#define      CS5463_SPI_CLK                     RCC_APB2Periph_SPI1     //SPI 時(shí)鐘

//CS5463(1) CS(NSS)--PA2
#define      CS5463_SPI_CS_APBxClock_FUN        RCC_APB2PeriphClockCmd  //GPIO 時(shí)鐘總線
#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);        //讀取功率因數(shù)值
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);                //獲取全部值

/*通訊等待時(shí)間處理*/
#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通訊錯(cuò)誤提醒


#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讀寫緩沖區(qū)
uint8_t sta;                                          //芯片狀態(tài)
CS5463Zhi    CS5463zhi;



/**
*   CS5463 初始化
*/
void SPI_CS5463_Init(void)
{
  SPI_InitTypeDef      SPI_InitStructure;    //SPI  結(jié)構(gòu)體
  GPIO_InitTypeDef     GPIO_InitStructure;   //GPIO 結(jié)構(gòu)體
   
    /* 打開SPI時(shí)鐘 */
    CS5463_SPI_APBxClock_FUN ( CS5463_SPI_CLK, ENABLE );
   
    /* 打開SPI的GPIO時(shí)鐘 */
     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;             //推挽復(fù)用
  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 設(shè)置 */
    SPI_I2S_DeInit(SPI1);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;   //雙線模式
  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                        //設(shè)置為主模式
  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位效驗(yàn)
   
  SPI_Init(CS5463_SPIx , &SPI_InitStructure);   //初始化SPI                     
  SPI_Cmd(CS5463_SPIx , ENABLE);                //使能SPI

}

#if 0
//發(fā)送個(gè)字節(jié)
short SPI_CS5463_SendHalfWord(u16 HalfWord)
{
      SPITimeout = SPIT_FLAG_TIMEOUT;
  /* 等待上次發(fā)送完成 */
  while (SPI_I2S_GetFlagStatus(SPI1 , SPI_I2S_FLAG_TXE) == RESET)
    {
            if((SPITimeout--) == 0)
            {
                 printf("SPI上次發(fā)送失敗-------\n");   
                 return SPI_TIMEOUT_UserCallback(2);
            }
  }
   
  /* 發(fā)送一個(gè)字節(jié)數(shù)據(jù) */
  SPI_I2S_SendData(SPI1 , HalfWord);
    SPITimeout = SPIT_FLAG_TIMEOUT;
   
  /* 等待本次發(fā)送數(shù)據(jù)完成 */
  while (SPI_I2S_GetFlagStatus(SPI1 , SPI_I2S_FLAG_RXNE) == RESET)
    {
      if((SPITimeout--) == 0)
            {
              printf("SPI發(fā)送數(shù)據(jù)失敗-------\n");  
              return SPI_TIMEOUT_UserCallback(3);
            }
  }
  /* 接受從設(shè)備返回?cái)?shù)據(jù)*/
  return SPI_I2S_ReceiveData(SPI1);
}


/*
*  @brief  讀取cs5463數(shù)據(jù)
*  @param  :
*          cs_index :從設(shè)備號(hào)
*      int16_t *buff:保存讀取的數(shù)據(jù)
* @retval 無(wú)
*/
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);               


         //通訊結(jié)束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
   
}
#endif


/**
  * @brief  使用SPI發(fā)送一個(gè)字節(jié)的數(shù)據(jù)
  * @param  byte:要發(fā)送的數(shù)據(jù)
  * @retval 返回接收到的數(shù)據(jù)
  */
u8 SPI_CS5463_SendByte(u8 byte)
{
     SPITimeout = SPIT_FLAG_TIMEOUT;
  /* 等待發(fā)送緩沖區(qū)為空,TXE事件 */
  while (SPI_I2S_GetFlagStatus(CS5463_SPIx , SPI_I2S_FLAG_TXE) == RESET)
    {
    if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);
   }

  /* 寫入數(shù)據(jù)寄存器,把要寫入的數(shù)據(jù)寫入發(fā)送緩沖區(qū) */
  SPI_I2S_SendData(CS5463_SPIx , byte);

    SPITimeout = SPIT_FLAG_TIMEOUT;
  /* 等待接收緩沖區(qū)非空,RXNE事件 */
  while (SPI_I2S_GetFlagStatus(CS5463_SPIx , SPI_I2S_FLAG_RXNE) == RESET)
  {
    if((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
   }

  /* 讀取數(shù)據(jù)寄存器,獲取接收緩沖區(qū)數(shù)據(jù) */
  return SPI_I2S_ReceiveData(CS5463_SPIx );
}

/**
  * @brief  向CS5463發(fā)送 寫使能 命令
  * @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();
        }

     /* 發(fā)送寫使能命令*/
   SPI_CS5463_SendByte(cmd);              

         //通訊結(jié)束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
}

/*
    函數(shù)名稱:CS5463WriteReg
    函數(shù)功能:CS5463寫寄存器函數(shù)
    函數(shù)參數(shù):無(wú)
*/
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)));
   
        //通訊結(jié)束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
}


/*************************************************************
** 函數(shù)名稱:CS5463ReadReg
** 函數(shù)功能:CS5463讀寄存器函數(shù)
** 函數(shù)參數(shù):無(wú)
** 創(chuàng)建時(shí)間:2009-9-14
** 第一次修改時(shí)間:無(wú)
**************************************************************/
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;
    }
   
            //通訊結(jié)束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
    return ;
}

/*
    函數(shù)名稱:CS5463Init
    函數(shù)功能:CS5463復(fù)位和初始化函數(shù)
    函數(shù)參數(shù):無(wú)
*/
_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);
            //通訊結(jié)束
        if( cs_index == 1){
                SPI_CS5463_CS_1_HIGH();
        }
        if( cs_index == 2){
                SPI_CS5463_CS_2_HIGH();
        }
    Delay_ms(100);
   
    //發(fā)送同步序列
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      //開始串口重新初始化        
//----------------------
//初始化--配置寄存器
//相位補(bǔ)償為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      //操作模式
//----------------------
//初始化--電流 交流偏置 校準(zhǔn)寄存器
// RW24XX(RX_Buff,3,EE_IACBIAS,0xA1);
// CS5463WriteReg(REG_IACOFF,RX_Buff);   
//----------------------
//初始化--電流 增益校準(zhǔn)寄存器
// RW24XX(RX_Buff,3,EE_IACGAIN,0xA1);
// CS5463WriteReg(REG_IGN,RX_Buff);        
//----------------------
//初始化--電壓 交流偏置 校準(zhǔn)寄存器
// RW24XX(RX_Buff,3,EE_VACBIAS,0xA1);
// CS5463WriteReg(REG_VACOFF,RX_Buff);   
//----------------------
//初始化--電壓 增益校準(zhǔn)寄存器
// 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       //一個(gè)計(jì)算周期的A/D轉(zhuǎn)換數(shù)
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);    //初始化--狀態(tài)寄存器  #define REG_STATUSR     0x5E     //狀態(tài)
//----------------------
RX_Buff[0] = 0x80;                        //開電流、電壓、功率測(cè)量完畢中斷
RX_Buff[1] = 0x00;
RX_Buff[2] = 0x80;                        //開溫度測(cè)量完畢中斷
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);                       //啟動(dòng)連續(xù)轉(zhuǎn)換        #define CMD_STARTC       0XE8      //執(zhí)行連續(xù)計(jì)算周期

    Delay_ms(500);
    return 1;
}   
/*************************************************************
** 函數(shù)名稱:CS5463_ResetStatusReg
** 函數(shù)功能:復(fù)位狀態(tài)寄存器函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
void CS5463_ResetStatusReg(int cs_index)
{
RX_Buff[0] = 0xFF;
RX_Buff[1] = 0xFF;
RX_Buff[2] = 0xFF;
CS5463WriteReg(cs_index,0x5E,RX_Buff);        //復(fù)位狀態(tài)寄存器    #define REG_STATUSR     0x5E     //狀態(tài)  
}

/*************************************************************
** 函數(shù)名稱:CS5463_GetVoltRMS
** 函數(shù)功能:讀取電壓有效值函數(shù)
**************************************************************/
void CS5463_GetVoltRMS(int cs_index)         //這個(gè)函數(shù)啥意思?     PT2017-2-12 電壓顯示OK
{
float G = 0.5,result;        //typedef float          fp32;      就是浮點(diǎn)類型
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時(shí)取樣電壓為78mv
result = result*CS5463_VScale;//V_Coff;                //計(jì)算電壓值220V*250mv/(110mv/1.414)=704.8V        可以暫時(shí)不用  
// if(result<=100)return;                    //如果測(cè)量讀出電壓小于100V,確認(rèn)讀數(shù)錯(cuò)誤
result *= 1000;                        //單位為mV(毫伏) 12345mv  5位你怎么顯示
CS5463zhi.DianYa = (uint32_t)result;
if(CS5463zhi.DianYa<10000)
{
    CS5463zhi.DianYa=0;
}
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetCurrentRMS
** 函數(shù)功能:讀取電流有效值函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
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;                        //計(jì)算電流值 暫時(shí)不用
result *= 1000;                                //單位mA(毫安)  12345ma
CS5463zhi.DianLiu =(uint32_t) result;
if(CS5463zhi.DianLiu <5)
{
    CS5463zhi.DianLiu =0;
}
     
}

/*************************************************************
** 函數(shù)名稱:CS5463_GetPactiveRMS
** 函數(shù)功能:讀取有功功率函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
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)                              //如果為負(fù)數(shù),計(jì)算原碼
{
      RX_Buff[0] = ~RX_Buff[0];            //本來(lái)為取反+1,這里因?yàn)榫鹊脑,?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;                //計(jì)算功率,單位W(瓦特)
// result = Vrms*Irms;                    ////////直接計(jì)算功率
  result = result*13125;
    CS5463zhi.YouGGL = (uint32_t)result;
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetPowerFactor
** 函數(shù)功能:讀取功率因數(shù)函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
void CS5463_GetPowerFactor(int cs_index)
{
float G = 1.0,result;
uint8_t temp,i,j;
CS5463ReadReg(cs_index,0x32,RX_Buff);           //讀取功率因數(shù)
//SndCom1Data(RX_Buff,3);
temp = RX_Buff[0];
if(temp&0x80)                              //如果為負(fù)數(shù),計(jì)算原碼
{
      RX_Buff[0] = ~RX_Buff[0];            //本來(lái)為取反+1,這里因?yàn)榫鹊脑,?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;
}
/*************************************************************
** 函數(shù)名稱:CS5463_GetTemperature
** 函數(shù)功能:讀取溫度函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
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)                              //如果為負(fù)數(shù),計(jì)算原碼
// {
//      pn = 1;                                //負(fù)數(shù)標(biāo)志
//    RX_Buff[0] = ~RX_Buff[0];            //本來(lái)為取反+1,這里因?yàn)榫鹊脑,?1
//    RX_Buff[1] = ~RX_Buff[1];
//    RX_Buff[2] = ~RX_Buff[2];            
// }
i = 0;
result = 0;    //這個(gè)值是浮點(diǎn)數(shù) 先清零 再逐個(gè)把0.5的權(quán) 數(shù)據(jù)加進(jìn)來(lái)
while(i<3)
{
      temp = RX_Buff[i];    //雖然這個(gè)數(shù)組定義了4個(gè)字節(jié) 實(shí)際就用了 Buff[0]  Buff[1]  RX_Buff[2]                  
    j = 0;
    while(j<8)
    {
         if(temp&0x80)
        {
             result += G;    //把0.5的權(quán)數(shù)據(jù)加進(jìn)來(lái)         
        }
        temp <<= 1;
        j++;
        G = G/2;   
    }
    i++;
}
if(result<128)              //是的這個(gè)result 是 -127,128   這里已經(jīng)獲取了溫度浮點(diǎn)值 最多是一個(gè)3位數(shù)? 還有小數(shù)點(diǎn)
{
    CS5463zhi.WenDu = (uint32_t)result;      //是的 這里就是 例如12523  -----> 125.23  怎么去顯示? 如何分離 從8A開始顯示
}
}


/*************************************************************
** 函數(shù)名稱:CS5463_GetStatusReg
** 函數(shù)功能:讀取狀態(tài)寄存器函數(shù)
** 函數(shù)參數(shù):無(wú)
**************************************************************/
uint8_t CS5463_GetStatusReg(int cs_index)
{
uint8_t sta=0;
CS5463ReadReg(cs_index,0x1E,RX_Buff);       //1E 是什么?   狀態(tài)寄存器
if(RX_Buff[0]&0x80)                       //檢測(cè):電流、電壓、功率測(cè)量是否完畢
{
    //檢測(cè)電流/電壓是否超出范圍
    //檢測(cè)電流有效值/電壓有效值/電能是否超出范圍
    if((RX_Buff[0]&0x03)||(RX_Buff[1]&0x70))
    {
         CS5463_ResetStatusReg(cs_index);        //復(fù)位狀態(tài)寄存器
    }
    else
    {
        sta |= 0x01;//B0000_0001;    //這什么意思 還可以這樣寫嗎? PT2017-2-8   分隔符嗎?
    }
}

if(RX_Buff[2]&0x80)                   //檢測(cè):溫度測(cè)量是否完畢
{
      sta |=0x02; //B0000_0010;
}
return(sta);   
}  

void Get_Zhi(int cs_index)
{
    sta    = CS5463_GetStatusReg(cs_index);         //檢測(cè)中斷產(chǎn)生的原因        
        if(0x01==(sta&0x01))                       //讀取電流電壓
        {   
            CS5463_ResetStatusReg(cs_index);            //清除標(biāo)志
            CS5463_GetVoltRMS(cs_index);                    //獲取電壓
            CS5463_GetCurrentRMS(cs_index);                //獲取電流
            CS5463_GetPactiveRMS(cs_index);                //獲取功率
            CS5463_GetPowerFactor(cs_index);            //獲取功率因數(shù)
            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;
}




回復(fù)

使用道具 舉報(bào)

ID:503152 發(fā)表于 2020-1-22 21:12 | 顯示全部樓層
分享就好!
回復(fù)

使用道具 舉報(bào)

ID:696302 發(fā)表于 2020-3-15 10:02 | 顯示全部樓層
感謝分享~~~學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:605975 發(fā)表于 2020-4-21 11:33 | 顯示全部樓層
我也在學(xué)習(xí)CS5463,為什么我用萬(wàn)用表測(cè)量輸入端電壓,CS5463就不測(cè)量了,發(fā)現(xiàn)CRDY位始終為0,這是為什么呢,希望高手指導(dǎo)!
回復(fù)

使用道具 舉報(bào)

ID:605975 發(fā)表于 2020-4-21 11:36 | 顯示全部樓層
我的CS5463用萬(wàn)用表測(cè)量輸入電壓,CS5463就不工作了,發(fā)現(xiàn)狀態(tài)寄存器的CRDY位一直為0,希望高手指導(dǎo)!
回復(fù)

使用道具 舉報(bào)

ID:731155 發(fā)表于 2020-4-21 19:37 | 顯示全部樓層
感謝分享,學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费在线黄色av | 日本高清视频在线播放 | 亚洲国产一区二区视频 | 欧美午夜精品理论片a级按摩 | 97免费视频在线观看 | 亚洲一二三区精品 | 青青久久久 | 欧美视频二区 | 四虎永久在线精品免费一区二 | 午夜爽爽爽男女免费观看 | 中文字幕 在线观看 | 亚洲成人精品久久 | 成人在线观看免费视频 | 亚洲成人精选 | 久久精品视频9 | av资源网站 | 精品视频在线观看 | 久久国 | 亚洲欧美日韩一区二区 | 国产精品国产a级 | 午夜影院免费体验区 | 99视频免费在线 | 精品国产一级 | julia中文字幕久久一区二区 | 久久男女视频 | 午夜精品一区二区三区在线 | 久久国产精品一区二区三区 | 久久精品视频一区二区 | 国产精品免费大片 | 91色视频在线观看 | 欧美成人一区二区三区 | 巨大荫蒂视频欧美另类大 | 国产91一区二区三区 | 一区二区三区免费在线观看 | 国产精品视频网站 | 欧美精品1区2区 | 国产成人a亚洲精品 | 亚洲高清在线 | 国产xxxx在线 | 亚洲精品欧美一区二区三区 | 国产精品欧美一区二区三区 |