#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;
}
|