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