cs5530代码

更新时间:2023-12-20 23:17:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

#define CS5530_GLOBALS #include \ /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:void SPI_CtrlPin_Init(void) * 函数功能:配置IO口 * 输入参数:无 * 返 回 值:无

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

void SPI_Init(void) { MCU_CSCLK_CS5530=0; //SPI_SCK_DAT(0); MCU_CS_CS5530=1; //SPI_CS_DAT(1); //取消片选 MCU_SDI_CS5530=0; //SPI_MOSI_DAT(0); } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:void SPI_WriteOneByte(INT8U dat) * 函数功能:向SPI从设备发送一个字节的数据 * 输入参数:dat:将要发送给从设备的单字节数据 * 返 回 值:无

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

void SPI_WriteOneByte(INT8U dat) { INT8U i; MCU_CSCLK_CS5530=0; for(i=0; i<8; i++) //aa {

if(dat & 0x80) { MCU_SDI_CS5530=1;//SPI_MOSI_DAT(1); } else { MCU_SDI_CS5530=0; //SPI_MOSI_DAT(0); } _nop_(); _nop_(); MCU_CSCLK_CS5530=1; //SPI_SCK_DAT(1); _nop_(); _nop_(); MCU_CSCLK_CS5530=0; //SPI_SCK_DAT(0); dat = dat<<1; } // MCU_SDI_CS5530=0; //SPI_MOSI_DAT(0); // SPI_CS_DAT(1) ; } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:INT8U SPI_ReadOneByte(void) * 函数功能:从从设备读取一个字节的数据 * 输入参数:无

* 返 回 值:返回从从设备读取的数据

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

INT8U SPI_ReadOneByte(void) {

INT8U k,i,dat = 0;

MCU_CS_CS5530=0;//SPI_CS_DAT(0); ; MCU_SDI_CS5530=0; for(i=0; i<8; i++) { MCU_CSCLK_CS5530=1; //SPI_SCK_DAT(1); _nop_(); _nop_(); k=MCU_SDO_CS5530;

if(k) //if(SPI_MISO_READ()) { dat|=(0x80>>i); } else { } MCU_CSCLK_CS5530=0; //SPI_SCK_DAT(0); _nop_(); _nop_(); }

return dat;

// SPI_CS_DAT(1) ; } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:void reset_CS5530(void) * 函数功能:初始化串口 * 输入参数:无 * 返 回 值:无

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

void Reset_CS5530(void) { INT8U i; INT32U temp; FlashWatchDog( ); CS5530StartADbit=0; MCU_CS_CS5530 = 1; MiniDelay(10000); MCU_CS_CS5530 = 0; FlashWatchDog( ); MiniDelay(10000); MCU_SDI_CS5530 = 0; MCU_SDO_CS5530 = 1; FlashWatchDog( );

MiniDelay(10); MCU_CSCLK_CS5530 = 0;

MCU_CS_CS5530=0;//SPI_CS_DAT(0); ; for(i=0;i<15;i++) // for(i=0;i<15;i++) { SPI_WriteOneByte(SYNC1); } SPI_WriteOneByte(SYNC0); // MCU_CS_CS5530=1;

FlashWatchDog( ); MiniDelay(10000);

Write_CS5530_Register(Write_CONFIG,SYSTEM_RESET); //

Write_CS5530_Register

(0x03,0x20,0x00,0x00,0x00); //写配置寄存器 写入CS5530复位命令 RS为1 MiniDelay(5000); do { temp=Read_CS5530_Register(Read_CONFIG); //Read_CS5530_Register(0x0b); } while(temp&RESET_STATUS); //while(CS5530_buf[3]&0x10); //检测RV是否为0(复位成

功后为0),如果不为0再继续读取配置寄存器 FlashWatchDog( ); } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型Void write_CS5530_register(INT8U command,INT8U one, INT8U two,INT8U three,INT8U

four) * 函数功能:向寄存器写入数据

* 输入参数:command:命令字节 one,two,three,four分别为将要写入寄存器的四个字节,依次为低字

节-高字节 * 返 回 值:无

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

void Write_CS5530_Register(INT8U command,INT32U setData) //void Write_CS5530_Register

(INT8U command,INT8U four, INT8U three, INT8U two,INT8U one)

{ MCU_CS_CS5530=0;//SPI_CS_DAT(0); ; SPI_WriteOneByte(command); SPI_WriteOneByte((INT8U)(setData>>24)); SPI_WriteOneByte((INT8U)(setData>>16)); SPI_WriteOneByte((INT8U)(setData>>8)); SPI_WriteOneByte((INT8U)(setData>>0)); // SPI_CS_DAT(1) ; //MCU_CS_CS5530=1; } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:INT32 read_CS5530_register(INT8U command)

* 函数功能:从寄存器读出数据

* 输入参数:command:命令字节 * 返 回 值:dat

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

INT32U Read_CS5530_Register(INT8U command) { //Dual temp; INT32U temp=0x00; MCU_CS_CS5530=0;//SPI_CS_DAT(0); ; SPI_WriteOneByte(command); temp=SPI_ReadOneByte(); // CS5530_buf[3]=SPI_ReadOneByte(); temp=(temp<<8)+SPI_ReadOneByte(); //CS5530_buf[2]=SPI_ReadOneByte(); temp=(temp<<8)+SPI_ReadOneByte(); //CS5530_buf[1]=SPI_ReadOneByte(); temp=(temp<<8)+SPI_ReadOneByte(); //CS5530_buf[0]=SPI_ReadOneByte(); // MCU_CS_CS5530=1;

/*temp.auc[3]=CS5530_buf[3]; temp.auc[2]=CS5530_buf[2]; temp.auc[1]=CS5530_buf[1]; temp.auc[0]=CS5530_buf[0]; return(temp.ans);*/ return temp; } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:void CS5530_init(void) * 函数功能:系统复位初始化内部逻辑,并且设置配置寄存器,通道设置寄存器,校准,并且开始转换 数据

* 输入参数:无 * 返 回 值:无

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

INT32U code ADS_Table[]=

{DATARATE_3200,DATARATE_1600,DATARATE_800,DATARATE_400,DATARATE_200,DATARATE_100,

DATARATE_50,DATARATE_25,DATARATE_12P5,DATARATE_6P25};

//输入范围:VREF+-VREF-/128 因为VRS=0,Y=2;

//开始当使用4.9152MHz或 4.096MHz的晶振时要大约20mS的启动时间 //因此建议在进行ADC的初始化代码之前先 软件延时大约20mS void CS5530_init(void) {

INT32U temp,temp1; INT8U i;

Reset_CS5530(); //初始化CS5530,串行口为

命令状态 //设置参考电压,信号极性 temp=0x00; temp|=(UNIPOLAR_MODE|LINE_FREQ_50); //0x00080400 1000 0000 0100 0000 0000

00 08 44 00 //DATARATE_3200

//设置字速度

i=Comm_2NumCharToHex_0(EEReadByte(SECTION0_ADD+ADS_ADD2+1),EEReadByte

(SECTION0_ADD+ADS_ADD2)); if(i>=(sizeof(ADS_Table)/4)) { i=(sizeof(ADS_Table)/4)-1; } temp|=ADS_Table[i]; //ADS_Table[i] DATARATE_6P25 0x00002000 Write_CS5530_Register(Write_CONFIG,temp); temp1=Read_CS5530_Register(Read_CONFIG); if(temp!=temp1) { Write_CS5530_Register(Write_CONFIG,temp); //0x00082400 } //

//写偏移寄存器

temp=EEReadByte(SECTION0_ADD+OffSetValue_ADD4+3); temp=(temp<<8)+EEReadByte(SECTION0_ADD+OffSetValue_ADD4+2); temp=(temp<<8)+EEReadByte(SECTION0_ADD+OffSetValue_ADD4+1); temp=(temp<<8)+EEReadByte(SECTION0_ADD+OffSetValue_ADD4+0);

Write_CS5530_Register(Write_OFFSET,temp); // FF DA 92 33 temp1=Read_CS5530_Register(Read_OFFSET); TestPrint('C'); TestPrint(temp1>>24); TestPrint(temp1>>16); TestPrint(temp1>>8); TestPrint(temp1>>0);

if(temp!= temp1) { Write_CS5530_Register(Write_OFFSET,temp); } //开始 Begin_Convert(START_CONTINUOUS); //START_SINGLE START_CONTINUOUS } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:void offset_adjust() * 函数功能:执行偏移校准(先校正偏移寄存器,在校正增益寄存器) * 输入参数:无 * 返 回 值:无

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

//校准时,不易采样高于240Sps 输出字速率。 #define OFFSETCNT_NUM 10 //FF D9 E2 00 //FF DA 1D 00 //FF DA 71 00 //FF DA 5D 00

void OffSet_Adjust() //默认偏移值0.0 CS5530转换器的偏移寄存器是用来设置转 这里的二

进制值为1或0(bD29是D29的二进制值)。 换器转换功能的零点值 {

//INT32U temp; INT32U Sum=0;

// INT8U HightByte;

INT8U OffSetCnt=OFFSETCNT_NUM; INT32U temp,temp1;

//重新初始化

Reset_CS5530(); //初始化CS5530,串行口为

命令状态 //设置参考电压,信号极性,设置字速度 temp=0x00; temp|=(UNIPOLAR_MODE|LINE_FREQ_50|DATARATE_200); //0x00080400 1000 0000 0100 0000

0000 00 08 44 00 //DATARATE_3200 Write_CS5530_Register(Write_CONFIG,temp); temp1=Read_CS5530_Register(Read_CONFIG); if(temp!=temp1) { Write_CS5530_Register(Write_CONFIG,temp); //0x00082400 }

//校偏移

//temp=Read_CS5530_Register(Read_OFFSET); while(OffSetCnt) { // Reset_CS5530(); MCU_CS_CS5530=0; SPI_WriteOneByte(SYSTEM_OFFSET_CAL);

//系统偏移校准,偏移校准时应该把输入端短接到地 // SPI_WriteOneByte(0x81); //自偏移校 准

while(MCU_SDO_CS5530!=0);

等待SDO变低,证明校准完成 _nop_(); Sum+=(Read_CS5530_Register(Read_OFFSET)>>8);

//读取偏移寄存器 测试用

//Sum+=(temp>>8); //(temp&0x00ffffff);

//低8位为0 OffSetCnt--; }

Sum=Sum/OFFSETCNT_NUM; //temp=(temp&0xff000000)+Sum; ClrSectionPage(SECTION0_ADD);

SmsTemp_buffer[OffSetValue_ADD4]=(INT8U)0x00;

SmsTemp_buffer[OffSetValue_ADD4+1]=(INT8U)(Sum>>0); SmsTemp_buffer[OffSetValue_ADD4+2]=(INT8U)(Sum>>8); SmsTemp_buffer[OffSetValue_ADD4+3]=(INT8U)(Sum>>16); CopySectionPage(SECTION0_ADD);

Write_CS5530_Register(Write_OFFSET,(Sum<<8)); // FF DA 92 33 temp1=Read_CS5530_Register(Read_OFFSET);

if(temp1!= (Sum<<8)) {

//

Write_CS5530_Register(Write_OFFSET,(Sum<<8)); }

Begin_Convert(START_CONTINUOUS); //START_SINGLE START_CONTINUOUS } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:INT32uuu gain_adjust() * 函数功能:执行增益校准(先校正偏移寄存器,在校正增益寄存器) * 输入参数:temp * 返 回 值:增益寄存器的值

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

//校准时,不易采样高于240Sps 输出字速率。

//对多次校准结果进行读取 再取平均值会提高校准结果精度 //系统偏移校准之后再进行系统增益校准。 //系统偏移校准之后再进行系统增益校准。

/*如果用户想通过外部来调整校准系数,他们预先要写入的信 息除以系数1.83007966,然后写入偏移寄存 器中去(假设增益为十进制1,在转换输出结 果之前,偏移寄存器的值乘以了增益寄存器 的值*/

void Gain_Adjust() //默认增益为1.0 { // Dual temp; // Reset_CS5530(); // INT32U temp; SPI_WriteOneByte(SYSTEM_GAIN_CAL);

//系统增益校准 增益校准时应该在输入端输入最大值

// SPI_WriteOneByte(0x82); //自增益校准 while(MCU_SDO_CS5530!=0); //等待SDO变低,证

明校准完成

_nop_();

temp=Read_CS5530_Register(Read_GAIN); //读取增

// 益

寄存器 测试用 } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:void begin_convert() * 函数功能:开始转换

* 输入参数:command 0xc0执行连续转换 0x80执行完全稳定的单次转换 * 返 回 值:无

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

void Begin_Convert(INT8U command) {

MiniDelay(500); SPI_WriteOneByte(command); CS5530StartADbit=1; } /*

*-----------------------------------------------------------------------------------------

-----------------------------------------------

* 函数原型:INT32U read5530adc(INT8U command)

* 函数功能:读取数据转换的结果

* 输入参数:command 0x00保持同样的设置进行连续转换,0xff为退出该转换模式 * 返 回 值:temp为转换读出的数据,数据寄存器的高3个字节,不包括低字节(标志位) *-----------------------------------------------------------------------------------------

-----------------------------------------------

*/

//读取转换数据时,要发送40个SCLK时钟。开始的8个SCLK是用来清除SDO标志位, //而且SDI要保持为低电平0。剩下的32个SCLK来读取转换结果数据

#define ADVALUE_ABNORMAL 0xff000000

INT32U ReadCS5530ADValue(INT8U command) //放在主循环,5ms左右跑一次 0xff000000 返回超范围 { // Dual temp; INT32U temp; //要加开始表示位 if(CS5530StartADbit==0) { return 0; } do{;} while(MCU_SDO_CS5530!=0); //while(SPI_MISO_READ()!=0);

//等待SDO变为0 MCU_SDI_CS5530=0; SPI_WriteOneByte(command); //清除串口标志 同时选择转

换模式(单次连续还是结束单次连续) temp=SPI_ReadOneByte(); // CS5530_buf[3]=SPI_ReadOneByte(); temp=(temp<<8)+SPI_ReadOneByte(); //CS5530_buf[2]=SPI_ReadOneByte(); temp=(temp<<8)+SPI_ReadOneByte(); //CS5530_buf[1]=SPI_ReadOneByte(); temp=(temp<<8)+SPI_ReadOneByte(); //CS5530_buf[0]=SPI_ReadOneByte(); if(temp&0x04) { //超范围 // TestPrint('A'); //return ADVALUE_ABNORMAL; } else { }

temp=temp>>8; return temp; } /*

*******************************************************************************************

**********************************************

*-----------------------------------------------------------------------------------------

-----------------------------------------------

*-----------------------------------------------------------------------------------------

-----------------------------------------------

*-----------------------------------------------------------------------------------------

-----------------------------------------------

测试函数

*-----------------------------------------------------------------------------------------

-----------------------------------------------

*-----------------------------------------------------------------------------------------

-----------------------------------------------

*-----------------------------------------------------------------------------------------

----------------------------------------------- */

void CS5530_TEST(void) {

// AD_value=0; // offset_adjust(); // gain_adjust(); #if 0 Write_CS5530_Register(Write_CONFIG,DATARATE_3200);

//write_CS5530_register(0x03,0x00,0x00,0x40,0x00); //Read_CS5530_Register(Read_CONFIG); // read_CS5530_register(0x0b); Begin_Convert(START_CONTINUOUS);

//

//while(1) //{ AD_value=ReadCS5530ADValue(0x00); //} #endif

//AD_value=ReadCS5530ADValue(0x00);

//CalWT(AD_value); }

void CalWT(INT32U AveADValue) {

//重量=(实时AD值/加载的AD值)*加载重量 NowWT=AveADValue*CSPWT/CSPAD; // 00 00 70 23 00 00 00 32 if(NowWT>=PeakWT) { PeakWT=NowWT; } } /*

43 00 00 78 BB 00 00 00 35 43 00 00 79 5C 00 00 00 36 43 00 00 79 BA 00 00 00 36 43 00 00 78 96 00 00 00 35 43 00 00 74 E3 00 00 00 34 43 00 00 73 54 00 00 00 33 43 00 00 73 07 00 00 00 33 43 00 00 74 2C 00 00 00 33 43 00 00 72 BF 00 00 00 33 43 00 00 72 A0 00 00 00 33 43 00 00 73 8C 00 00 00 33 43 00 00 74 E5 00 00 00 34 43 00 00 73 EA 00 00 00 33 43 00 00 71 F1 00 00 00 32

*/

void WTPreocess(void) { INT8U i; INT32U Temp; Temp=ReadCS5530ADValue(0x00); if(Temp!=ADVALUE_ABNORMAL) { for(i=(ADARRAY_NUM-1);i>0;i--) // { ADArray[i]=ADArray[i-1]; } ADArray[0]=ReadCS5530ADValue(0x00); AVE_AD_value=0; for(i=0;i50) { TestCnt1=0; // TestPrint('B'); } } }

/*****************.h***************/

#ifdef CS5530_GLOBALS #define CS5530_EXT #else

#define CS5530_EXT extern #endif

// Command Register

#define Write_OFFSET 0x01 //写偏移寄存器 #define Read_OFFSET 0x09 //读偏移寄存器 #define Write_GAIN 0x02 //写增益寄存器 #define Read_GAIN 0x0a //读增益寄存器 #define Write_CONFIG 0x03 //写配置寄存器 #define Read_CONFIG 0x0b //读配置寄存器 #define START_SINGLE 0x80 //单次转换 #define START_CONTINUOUS 0xc0 //连续转换

#define SYSTEM_OFFSET_CAL 0x85 //执行系统偏移校准 #define SYSTEM_GAIN_CAL 0x86 //执行系统增益校准

#define SYNC1 0xff //串行口初始化序列命令之一 #define SYNC0 0xfe //串行口初始化序列结束命令

#define NULL_BYTE 0x00 //用来清除端口标志位使得转换器保持在连续转换模式

// Configuration Register

#define STANDBY_MODE (0x00L<<31) //待机模式 #define SLEEP_MODE (0x01L<<31) //休眠模式

#define POWER_SAVE_MODE (0x01L<<30) //节电模式

#define NORMAL_MODE (0x00L<<29) //正常操作

#define SYSTEM_RESET (0x01L<<29) //激活一个复位周期 复位后自动清0

#define RESET_STATUS (0x01L<<28) //复位有效 系统已复位 只读

#define SHORT_INPUTS (0x00L<<27) //输入正常输入 个通道输入不断接

#define VREF_HIGH (0x00L<<25) //参考电压 2.5~((VA+)-(VA-))V #define VREF_LOW (0x01L<<25) //参考电压 1~2.5V

#define CR_A1_0 (0x00L<<24) #define CR_A1_1 (0x01L<<24)

#define CR_A0_0 (0x00L<<23)

#define CR_A0_1 (0x01L<<23)

#define LINE_FREQ_60 (0x00L<<19) //滤波数率选择 缺省输入字

#define LINE_FREQ_50 (0x01L<<19) //输出字数率及相应滤波器特性乘以系数5/6

#define DATARATE_100 (0x00L<<11) //字数率 不同位就不同 #define DATARATE_50 (0x01L<<11) #define DATARATE_25 (0x02L<<11) #define DATARATE_12P5 (0x03L<<11) #define DATARATE_6P25 (0x04L<<11) #define DATARATE_3200 (0x08L<<11) #define DATARATE_1600 (0x09L<<11) #define DATARATE_800 (0x0aL<<11) #define DATARATE_400 (0x0bL<<11) #define DATARATE_200 (0x0cL<<11) #define DATARATE_BIT (0x0fL<<11)

#define BIPOLAR_MODE (0x00L<<10) //极性选择双极性模式 #define UNIPOLAR_MODE (0x01L<<10) //极性选择单极性模式

#define TURN_OFF_300NA (0x00L<<9) //不激活电流源

#define TURN_ON_300NA (0x01L<<9) //激活电流源300ma

CS5530_EXT xdata INT32U AVE_AD_value;

CS5530_EXT xdata INT32U CSPAD; //加载的AD值 CS5530_EXT xdata INT32U CSPWT; //加载重量 CS5530_EXT xdata INT32U NowWT; //实时值 CS5530_EXT xdata INT32U PeakWT; //峰值

CS5530_EXT void SPI_Init(void);

CS5530_EXT void SPI_WriteOneByte(INT8U dat); CS5530_EXT INT8U SPI_ReadOneByte(void); CS5530_EXT void Reset_CS5530(void);

CS5530_EXT void Write_CS5530_Register(INT8U command,INT32U setData); CS5530_EXT INT32U Read_CS5530_Register(INT8U command); CS5530_EXT void CS5530_init(void);

CS5530_EXT void Begin_Convert(INT8U command);

CS5530_EXT INT32U ReadCS5530ADValue(INT8U command); CS5530_EXT void CS5530_TEST(void);

CS5530_EXT void OffSet_Adjust(); CS5530_EXT void Gain_Adjust(); //unsigned char cs5530_buf[4]; //

//typedef union //{

// unsigned char auc[4]; // unsigned long ans; //}Dual;

CS5530_EXT void CalWT(INT32U AveADValue); CS5530_EXT bit CS5530StartADbit; CS5530_EXT void WTPreocess(void);

#define ADARRAY_NUM 50

CS5530_EXT xdata INT32U ADArray[ADARRAY_NUM];

本文来源:https://www.bwwdw.com/article/v8b5.html

Top