//-------本文件为通过spi口存取AD7280A的所有函数封装---------------------//
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "GlobalVar.h"
#include "AD7280A.h"
// global variables to store AD7280A read-back data, located in internal RAM
unsigned char AD7280A_ReadDevAdr2;
unsigned char AD7280A_ReadRegAdr2;
unsigned char AD7280A_ReadRegData2;
unsigned char AD7280A_ReadConvData_H2;
unsigned char AD7280A_ReadConvData_L2;
unsigned char AD7280A_ConvChannel2=0x1;
unsigned char AD7280A_ConvAverage2=0x1;
unsigned char AD7280A_AcqTime2=0x1;
unsigned char AD7280A_OVThreshold2=0xFF;
unsigned char AD7280A_UVThreshold2=0x0;
unsigned char AD7280A_OTThreshold2=0xFF;
unsigned char AD7280A_UTThreshold2=0x0;
unsigned char AD7280A_RegALERT2[AD7280A_DevNumber2]={0,0,0};
unsigned char AD7280A_CB2[AD7280A_DevNumber2]={0,0,0}; //device 1 channel 1 set on
unsigned char AD7280A_STADC2[AD7280A_DevNumber2][2]={0,0,0,0};
unsigned char AD7280A_VADC2[AD7280A_DevNumber2][12]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char AD7280A_TADC2[AD7280A_DevNumber2][12]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char AD7280A_StackV2=0x0;
float CellVoltage2[AD7280A_DevNumber2][6]={0,0,0,0,0,0,0,0,0,0,0,0};//实际电压的乘以1000
unsigned int CellTemp2[AD7280A_DevNumber2][6]={0,0,0,0,0,0,0,0,0,0,0,0};//实际温度的乘以10
unsigned char CBSetFlag2=0;
unsigned int TimeAD2;
float CellVoltageAll2;
unsigned int cellbit2;
// float CellTemperature2;
extern const float Thermistor_IPM3_Table[19][2];
extern float Temperature_Calc(float TempAD, const float Table[19][2]);
TEMPBIT BitTemp82;
void BitToPHY2()
{
// unsigned int temp1,temp2;
unsigned long temp3,temp1,temp2;
unsigned char i,j;
float temp,temp5,temp6;
temp6=0;
for(i=0;i<AD7280A_DevNumber2;i++)
{
for(j=0;j<6;j++)
{
temp1=AD7280A_VADC2[i][j*2];
temp2=AD7280A_VADC2[i][j*2+1];
temp3=((((temp1<<8)+(temp2 & 0x00ff))&0x0000FFFF)*125)/128+1000; //显示电压为实际电压的1000倍
temp5=temp3;
if(j==5)
{
CellVoltage2[i][3]=temp5/1000;
temp6=temp6+CellVoltage2[i][3];
}else
{
CellVoltage2[i][j]=temp5/1000;
if(j<=2)
{
temp6=temp6+CellVoltage2[i][j];
}
}
// CellVoltage[i][j]=(((temp1<<8)+(temp2 & 0x00ff))*10)/1024+10; //显示电压为实际电压的10倍
temp1=AD7280A_TADC2[i][j*2];
temp2=AD7280A_TADC2[i][j*2+1];
CellTemp2[i][j]=(((temp1<<8)+(temp2 & 0x00ff))&0x0000FFFF);
}
CellVoltage2[i][4]=0;
CellVoltage2[i][5]=0;
}
// temp=CellTemp2[0][2];
// tempfl2=temp*0.1+tempfl2*0.9;
CellVoltageAll2=temp6;
// CellTemperature2=Temperature_Calc(tempfl2,Thermistor_IPM3_Table);
// if()
}
void CBset2(unsigned char regedit,unsigned char num) //regeit为需要开启平衡的通道设置值,num为第几个芯片
{
if((num>0)&&(num<=AD7280A_DevNumber2))
{
AD7280A_CB2[num-1]=regedit<<2;
}
}
extern TEMPBIT BitTemp82;
void AD7280A_ReverseDevAdr2(unsigned char DevAdr)
{
BitTemp82.all=DevAdr;
BitTemp82.bit.bit7=BitTemp82.bit.bit0;
BitTemp82.bit.bit0=BitTemp82.bit.bit4;
BitTemp82.bit.bit4=BitTemp82.bit.bit7;
BitTemp82.bit.bit7=BitTemp82.bit.bit1;
BitTemp82.bit.bit1=BitTemp82.bit.bit3;
BitTemp82.bit.bit3=BitTemp82.bit.bit7;
BitTemp82.bit.bit7=0;
BitTemp82.bit.bit6=0;
BitTemp82.bit.bit5=0; //reverse D4~D0
}
// Calculate AD7280A Write/Read CRC
void AD7280A_CRC2 (unsigned char CRCbit, unsigned char CRCinput1, unsigned char CRCinput2,unsigned char CRCinput3)
{
TEMPBIT XORtemp;
unsigned char i,temp1;
BitTemp82.all=0;
for (i=CRCbit;i>0;i--)
{
if (i==CRCbit) temp1=CRCinput1;
if (i==CRCbit-8) temp1=CRCinput2;
if (i==CRCbit-16) temp1=CRCinput3;
if ((temp1&0x80)==0)
XORtemp.bit.bit7=0;
else
XORtemp.bit.bit7=1;
XORtemp.bit.bit5=BitTemp82.bit.bit4^BitTemp82.bit.bit7;
XORtemp.bit.bit4=BitTemp82.bit.bit2^BitTemp82.bit.bit7;
XORtemp.bit.bit3=BitTemp82.bit.bit1^BitTemp82.bit.bit7;
XORtemp.bit.bit2=BitTemp82.bit.bit0^BitTemp82.bit.bit7;
XORtemp.bit.bit1=XORtemp.bit.bit7^BitTemp82.bit.bit7;
BitTemp82.bit.bit7=BitTemp82.bit.bit6;
BitTemp82.bit.bit6=BitTemp82.bit.bit5;
BitTemp82.bit.bit5=XORtemp.bit.bit5;
BitTemp82.bit.bit4=BitTemp82.bit.bit3;
BitTemp82.bit.bit3=XORtemp.bit.bit4;
BitTemp82.bit.bit2=XORtemp.bit.bit3;
BitTemp82.bit.bit1=XORtemp.bit.bit2;
BitTemp82.bit.bit0=XORtemp.bit.bit1;
temp1<<=1;
}
}
// Bring AD7280A out of hardware powerdown mode
void AD7280A_HWPowerUp2(void)
{
AD7280A2_PD_1;
AD7280A2_CNVST_1;
AD7280A2_CS_1;
DELAY_US(10000); //delay >5.5ms for 1uF VREG cap
}
// Put AD7280A into hardware powerdown mode
void AD7280A_HWPowerDown2(void)
{
unsigned int temp;
// SPI_Tx(0); //AD7280_SDI=0;
// SpiaRegs.SPITXBUF=0;
// SpiaRegs.SPITXBUF=0;
// SpiaRegs.SPITXBUF=0;
// SpiaRegs.SPITXBUF=0;
// while(SpiaRegs.SPIFFRX.bit.RXFFST<4){} //接收FIFO
// temp=SpiaRegs.SPIRXBUF;
// temp=SpiaRegs.SPIRXBUF;
// temp=SpiaRegs.SPIRXBUF;
// temp=SpiaRegs.SPIRXBUF;
temp = Mcbspa_xmit(0x00000000);
AD7280A2_PD_0;
AD7280A2_CNVST_0;
AD7280A2_CS_0;
DELAY_US(5000); //delay >2ms for 1uF VREG cap
}
// Start AD7280A conversion
void AD7280A_Conversion2(void)
{
AD7280A2_CNVST_0;
DELAY_US(2); //0.4us < CNVST width < total conversion time
AD7280A2_CNVST_1;
DELAY_US(250); //Tconv=248.02us (12ch & Tacq=1.89us & Average=8 & Device=8), Twait=5us
}
// Re-synchronize AD7280A serial interface
void AD7280A_ReSync2(void)
{
int i=0;
// unsigned char count=0;
unsigned int temp;
AD7280A2_CS_1;
while(i<4) //delay >10ns
{
i++;
}
// while(count<4)
// {
// SpiaRegs.SPITXBUF=0; //pop out 32x SCLK with CS=1 & SDI=0;
// count++;
// }
// SpiaRegs.SPITXBUF=0;
// SpiaRegs.SPITXBUF=0;
// SpiaRegs.SPITXBUF=0;
// SpiaRegs.SPITXBUF=0;
// while(SpiaRegs.SPIFFRX.bit.RXFFST<4){} //接收FIFO
// temp=SpiaRegs.SPIRXBUF;
// temp=SpiaRegs.SPIRXBUF;
// temp=SpiaRegs.SPIRXBUF;
// temp=SpiaRegs.SPIRXBUF;
temp = Mcbspa_xmit(0x00000000);
}
void AD7280A_Write2(unsigned char Dev_Adr, unsigned char Reg_Adr, unsigned char Reg_Data, unsigned char WriteAll)
{
unsigned int temp1,temp2,temp3,temp4;
unsigned long temp;
int i=0;
AD7280A_ReverseDevAdr2(Dev_Adr); //Dev_Adr in D31:D27
temp1=BitTemp82.all<<3;
temp1+=Reg_Adr>>3; //Reg_Adr in D26:D21
temp2=Reg_Adr<<5;
temp2+=Reg_Data>>3; //Reg_Data in D20:D13
temp3=Reg_Data<<5;
temp3+=WriteAll<<4; //Write_All in D12, D11=0
AD7280A_CRC2(21,temp1,temp2,temp3); //calculate CRC for D31:D11
temp4=BitTemp82.all;
temp3+=temp4>>5; //CRC in D10:D3
temp4<<=3;
temp4+=0x02; //D2:D0=010
AD7280A2_CS_0;
while(i<2) //delay >10ns
{
i++;
}
//delay >10ns
// SpiaRegs.SPITXBUF=(temp1<<8);
// SpiaRegs.SPITXBUF=(temp2<<8);
// SpiaRegs.SPITXBUF=(temp3<<8);
// SpiaRegs.SPITXBUF=(temp4<<8);
// while(SpiaRegs.SPIFFRX.bit.RXFFST<4){} //接收FIFO
//temp=SpiaRegs.SPIRXBUF;
// temp=SpiaRegs.SPIRXBUF;
//temp=SpiaRegs.SPIRXBUF;
//temp=SpiaRegs.SPIRXBUF;
temp = 0;
temp = (temp1 & 0xff);
temp <<= 8;
temp |= (temp2 & 0xff);
temp <<= 8;
temp |= (temp3 & 0xff);
temp <<= 8;
temp |= (temp4 & 0xff);
temp = Mcbspa_xmit(temp);
// DELAY_US(100);
AD7280A2_CS_1;
DELAY_US(5);//CS MUST be high for >3us between two 32-bit frames
}
unsigned char AD7280A_DaisyRead2(unsigned char ReadType)
{
unsigned long temp;
unsigned int temp0,temp1,temp2,temp3,temp4,temp5,temp6;
int i=0;
unsigned int Temp_L = 0;
unsigned int Temp_H = 0;
temp0=ReadType;
AD7280A2_CS_0;
while(i<2) //delay >10ns
{
i++;
} //delay >10ns
// SpiaRegs.SPITXBUF=0xF800;
// SpiaRegs.SPI
基于TMS320F28335的AD7280驱动代码
需积分: 2 40 浏览量
2023-12-05
15:54:00
上传
评论
收藏 5KB 7Z 举报
weixin_43015338
- 粉丝: 83
- 资源: 21
最新资源
- 基于thinkphp5/weui/layui的简易投票系统,适用于社团/班级投票选举
- 基于Spring +mybatis的投票系统 支持单选多选,统计信息等
- 基于pandas、Scikit-Learn、matplotlib、PyQt5的二手房价分析与预测系统
- 基于 yolov5 和 PyQt5 开发工具搭建了实时违法检测区域入侵软件,支持自定义检测区域、多种对象检测以及事件信息统计
- ZG202220101014胡雪梅.zip
- 姥娘家菜单修改最新再做500张.cdr
- 基于Python实现的英雄联盟知识图谱的问答
- 密码学算法之SHA-1
- 基于Python实现联邦学习框架下基于Memae的异常检测架构
- 密码学之DES加密算法
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈