分享到:
做CS5530的驱动的时候,发现好多网上的代码不全,这个底层驱动基本都是自己写的,可以完美驱动CS5530,常用的寄存器配置都做了宏的定义。可以完美移植到其他MCU中。
#ifndef __CS5530_H #define __CS5530_H #include "config.h" #include <intrins.h> #include "delay.h" #include "uart.h" //引脚的定义 sbit CS5530_SDI = P1^3; sbit CS5530_SDO = P1^4; sbit CS5530_SCK = P1^5; #define CS5532_SCK_RESET() CS5530_SCK = 0 #define CS5532_SCK_SET() CS5530_SCK = 1 #define CS5532_SDI_RESET() CS5530_SDI = 0 #define CS5532_SDI_SET() CS5530_SDI = 1 #define TEST_CS5532_SDO() (CS5530_SDO) #define CS5532_CS_RESET() //CS5530_CS = 0 #define CS5532_CS_SET() //CS5530_CS = 1 // Command Register命令寄存器的定义 #define SYNC1 0xff #define SYNC0 0xfe #define NULL_BYTE 0x00 #define CMD_WRITE (0x00<<3)//写指令 #define CMD_READ (0x01<<3)//读指令 #define REG_OFFSET 0x01 //偏移寄存器 #define REG_GAIN 0x02 //增益寄存器 #define REG_CONFIG 0x03 //配置寄存器 #define START_SINGLE (0x00<<6) //单次转换 #define START_CONTINUOUS (0x01<<6)//连续转换 #define NORMAL_CONVERSION (0x80+0x00)//转换命令,格式为转换命令+单次转换,转换命令+连续转换 #define SYSTEM_OFFSET_CAL (0x80+0x05)//执行偏移校准 #define SYSTEM_GAIN_CAL (0x80+0x06)// 执行增益校准 // 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) //激活一个复位周期,复位后自动清零 #define RESET_STATUS (0x01L<<28) //复位指令 #define NORMAL_INPUTS (0x00L<<27) //正常输入 #define SHORT_INPUTS (0x01L<<27) //短路输入 #define VREF_HIGH (0x00L<<25) //参考电压大于2.5V #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 BIPOLAR_MODE (0x00L<<10) //双极性模式 #define UNIPOLAR_MODE (0x01L<<10)//单极性模式 #define TURN_OFF_300NA (0x00L<<9) // #define TURN_ON_300NA (0x01L<<9) // //增益寄存器 #define GAIN_32 (0x01L<<29) #define GAIN_16 (0x01L<<28) #define GAIN_8 (0x01L<<27) #define GAIN_4 (0x01L<<26) #define GAIN_2 (0x01L<<25) #define GAIN_1 (0x01L<<24) #define GAIN_20 GAIN_16+GAIN_4 #define GAIN_10 GAIN_8+GAIN_2 void cs5530_init(void); extern int32_t ReadCs5530AD(void); uint8_t ReadCs5530Byte(void); void WriteCs5530Byte(uint8_t da); void WriteCs5530Dword(uint32_t da); #endif
#include "cs5530.h" /********************************************************************************************** // 函数: static void WriteCs5530Byte(uint8_t da) // 描述: 给CS5530写1个字节的数据 // 参数: 给CS5530写入的数据,1个字节 // 返回: non // 说明: non // 版本: V1.0, 2018-08-16 ************************************************************************************************/ void WriteCs5530Byte(uint8_t da) { uint8_t loop; CS5532_SCK_RESET(); for(loop=0;loop<8;loop++) { if(da&0x80) { CS5532_SDI_SET();//00100000 } else { CS5532_SDI_RESET(); } da=da<<1; CS5532_SCK_SET(); _nop_(); _nop_(); CS5532_SCK_RESET(); _nop_(); _nop_(); } } /********************************************************************************************** // 函数: static uint8_t ReadCs5530Byte(void) // 描述: CS5530读出一个字节的数据 // 参数: non // 返回: CS5530读出的一个字节数据 // 说明: non // 版本: V1.0, 2018-08-16 ************************************************************************************************/ uint8_t ReadCs5530Byte(void) { uint8_t loop,da; CS5532_SCK_RESET(); for(loop=0;loop<8;loop++) { da=da<<1; da=da|TEST_CS5532_SDO(); CS5532_SCK_SET(); _nop_(); _nop_(); CS5532_SCK_RESET(); _nop_(); _nop_(); } return da; } /********************************************************************************************** // 函数: static void WriteCs5530Dword(uint32_t da) // 描述: 给CS5530写4个字节的数据 // 参数: 给CS5530写入的数据,long类型,32位数据 // 返回: non // 说明: non // 版本: V1.0, 2018-08-16 ************************************************************************************************/ void WriteCs5530Dword(uint32_t da) { union type1 { uint8_t ch[4]; uint32_t lon; }; union type1 temp; temp.lon= da; WriteCs5530Byte(temp.ch[0]); WriteCs5530Byte(temp.ch[1]); WriteCs5530Byte(temp.ch[2]); WriteCs5530Byte(temp.ch[3]); } /********************************************************************************************** // 函数: static uint32_t ReadCs5530(void) // 描述: 读取CS5530的数据 // 参数: 32位的寄存器数据 // 返回: non // 说明: non // 版本: V1.0, 2018-08-16 ************************************************************************************************/ int32_t ReadCs5530AD(void) { uint8_t loop; uint32_t da; CS5532_SCK_RESET(); _nop_(); _nop_(); // WriteCs5530Byte(NORMAL_CONVERSION+START_SINGLE);//单次转换 while(TEST_CS5532_SDO() == 1);//SDO为0的时候表示转换完成 WriteCs5530Byte(NULL_BYTE);//发送8个NULL数据清到SDI引脚清SDO数据 for(loop=0;loop<32;loop++) { da=da<<1; da=da|TEST_CS5532_SDO(); CS5532_SCK_SET(); _nop_(); _nop_(); CS5532_SCK_RESET(); _nop_(); _nop_(); } da = da>>14;//取18位有效数字 return(da); } /********************************************************************************************** // 函数: static void cs5532_init(void) // 描述: CS5530的初始化,固定速度为15sps // 参数: non // 返回: non // 说明: non // 版本: V1.0, 2018-08-16 ************************************************************************************************/ void cs5530_init(void) { uint8_t loop; //延时20ms,等待晶振启动 delay_ms(20); CS5532_SDI_RESET(); CS5532_SCK_RESET(); //发送ADC串口复位指令,初始化ADC到可访问状态 //发送SYNC1命令字,至少15个,这里发送30个 for (loop=0;loop<30;loop++) { WriteCs5530Byte(SYNC1); } //发送一个SYNC0命令字 WriteCs5530Byte(SYNC0); //启动系统复位 WriteCs5530Byte(CMD_WRITE+REG_CONFIG);//写配置寄存器 WriteCs5530Dword(SYSTEM_RESET);//写复位指令 delay_ms(20); //直接延时,不进行复位成功的循环检测 // 复位后读取配置寄存器的时候需要连续读两次,第一次RV为1,第二次RV为0 // WriteCs5530Byte(CMD_READ+REG_CONFIG);//读配置寄存器 // SendByte(ReadCs5530Byte()); // SendByte(ReadCs5530Byte()); // SendByte(ReadCs5530Byte()); // SendByte(ReadCs5530Byte()); WriteCs5530Byte(CMD_WRITE+REG_CONFIG);//写配置寄存器 WriteCs5530Dword(NORMAL_MODE|DATARATE_12P5|UNIPOLAR_MODE);//正常操作,FRS=0,速度15sps,单极性模式 // WriteCs5530Dword(SHORT_INPUTS|DATARATE_12P5|UNIPOLAR_MODE);//正常操作,FRS=0,速度15sps,单极性模式 WriteCs5530Byte(NORMAL_CONVERSION+START_CONTINUOUS);//连续转换 }
(0 )
(0 )
回复
举报
发表回复
块
导
航
举报
请选择举报类别
- 广告垃圾
- 违规内容
- 恶意灌水
- 重复发帖