#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 0x00000000 //待机模式
#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 BIPOLAR_MODE (0x00L<<10) //极性选择双极性模式
#define UNIPOLAR_MODE (0x01L<<10) //极性选择单极性模式
#define TURN_OFF_300NA (0x00L<<9) //不激活电流源
#define TURN_ON_300NA (0x01L<<9) //激活电流源300ma
//===========================================================================================
sbit CS5530_CLK=P1^2; //时钟脚
sbit CS5530_CS=P0^0; //片选脚
sbit CS5530_SDO=P1^1; //数据输出脚
sbit CS5530_SDI=P1^0; //数据输入脚
#define cs5530_clk_h CS5530_CLK=1 //时钟线拉高
#define cs5530_clk_l CS5530_CLK=0; //时钟线拉低
#define cs5530_cs_h CS5530_CS=1 //片选拉高(禁止器件)
#define cs5530_cs_l CS5530_CS=0 //片选拉低(选中器件)
#define cs5530_in_h CS5530_SDI=1 //MOSI输出1
#define cs5530_in_l CS5530_SDI=0 //MOSI输出0
#define cs5530_out CS5530_SDO //读CS5530的输出数据位
bit b_HasGetNewADDat;
bit b_ad_err;
bit b_fangdian;
signed long idata ad_sample_dat;
union LongData {
unsigned long word ;
unsigned char byte[4];
};
//==========================================================================================
void delay_ms(unsigned int x)
{
unsigned int a, b;
for (a=0; a<x; a++)
{
for (b=0; b<300;b++)
;
}
}
static void delay1()
{
;
}
/**********************************************************
*函数名:unsigned char CS5530_Read(void)
*功 能:CS5530读8位数据
*说 明:
**********************************************************/
unsigned char CS5530_Read(void)
{
unsigned char i;
unsigned char dat=0;
CS5530_SDI=0;
for(i=0;i<8;i++)
{
dat <<= 1;
cs5530_clk_h;
delay1();
cs5530_clk_l;
delay1();
if(CS5530_SDO != 0)
dat++;
}
return dat;
}
/**********************************************************
*函数名:unsigned long CS5530_Read_Dword (void)
*功 能:CS5530读32位数据
*说 明:
**********************************************************/
unsigned long CS5530_Read_Dword(void)
{
unsigned long return_data;
return_data=CS5530_Read();
return_data<<=8;
return_data+=CS5530_Read();
return_data<<=8;
return_data+=CS5530_Read();
return_data<<=8;
return_data+=CS5530_Read();
return_data=return_data>>9;
return (return_data);
}
/**********************************************************
*函数名:void CS5530_Write(unsigned char Write_data)
*功 能:写8位数据
*说 明:unsigned char Write_data:需发送的数据
**********************************************************/
void CS5530_Write(unsigned char dat)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(dat & 0x80)
CS5530_SDI=1;
else
CS5530_SDI=0;
cs5530_clk_l;
delay1();
cs5530_clk_h;
delay1();
dat <<= 1;
}
}
/**********************************************************
*函数名:void CS5530_Write_Dword(unsigned long Write_data)
*功 能:写32位数据
*说 明:unsigned char Write_data:需发送的数据
**********************************************************/
void CS5530_Write_Dword(unsigned long dat)
{
union type1
{
unsigned char ch[4];
unsigned long lon;
}; //定义用于将32位整数转为4个字节的联合体数据结构
union type1 temp;
temp.lon= dat;
CS5530_Write (temp.ch[0]); //逐个字节发送数据
CS5530_Write (temp.ch[1]);
CS5530_Write (temp.ch[2]);
CS5530_Write (temp.ch[3]);
}
/**********************************************************
*函数名:void CS5530_Serial_Reset(void)
*功 能:
*说 明:
**********************************************************/
void CS5530_Serial_Reset(void) //1/
{
unsigned char i = 18;
while(i-- )
{
CS5530_Write(SYNC1) ;
}
CS5530_Write(SYNC0) ;
}
/**********************************************************
*函数名:void CS5530_Set(void)
*功 能:CS5530初始化
*说 明:
**********************************************************/
void CS5530_Set(void)
{
unsigned long dat;
unsigned char read_data;
unsigned char CS5530_rst;
delay_ms(100);
CS5530_Serial_Reset();
CS5530_Write(Write_CONFIG); //写配置寄存器
CS5530_Write_Dword(SYSTEM_RESET) ; //初始化 0x20000000
_nop_();
_nop_();
_nop_();
_nop_();
CS5530_Write(Write_CONFIG); //写配置寄存器
CS5530_Write_Dword(0x00000000) ; //初始化 0x20000000
CS5530_Write(Read_CONFIG);
read_data = CS5530_Read();
CS5530_rst = read_data; //配置寄存器有32位,RV在D28位上
read_data = CS5530_Read(); //后面三个字节不用管
read_data = CS5530_Read();
read_data = CS5530_Read();
disp_data_buff_write(1,1,0,16,0);
disp();
while(CS5530_rst & 0x10) //如果RV位为1表明复位成功,读配置寄存器后RV自动清0
{ //重新读取RV位确保它已经清0
CS5530_Write(Read_CONFIG); //发读配置寄存器命令
read_data = CS5530_Read();
CS5530_rst = read_data;
read_data = CS5530_Read();
read_data = CS5530_Read();
read_data = CS5530_Read();
disp_data_buff_write(2,1,0,16,0);
disp();
}
CS5530_Write(Write_CONFIG); //发"写配置寄存器"命令
CS5530_Write_Dword(NORMAL_MODE); //写配置寄存器清除RS位(CFG_REG=0x00000000),退出复位状态
_nop_();
_nop_();
disp_data_buff_write(3,1,0,16,0);
disp();
CS5530_Write(Write_CONFIG); //写配置寄存器
CS5530_Write_Dword( NORMAL_MODE + VREF_HIGH + CR_A0_0 + CR_A1_0 + SHORT_INPUTS + LINE_FREQ_60 +DATARATE_200 + BIPOLAR_MODE + TURN_OFF_300NA ) ;
CS5530_Write(START_CONTINUOUS); //开始连续转换START_SINGLE
while(CS5530_SDO == 1);
disp_data_buff_write(4,1,0,16,0);
disp();
CS5530_SDI = 0;
CS5530_Write(0x00); //写入空指令,
dat = CS5530_Read_Dword();
}
//读取cs5530模数转换结果
unsigned long CS5530_Result (void)
{
CS5530_Write(NULL_BYTE) ; //发出8个时钟信号来清除SDO标志(数据就绪标志?)
return (unsigned long)(CS5530_Read_Dword());//读取并返回32位结果(24位ADC转换结果加上1个溢出标志和7个无意义的0位)
}
以上是我根据网上的代码综合的,现在程序在CS5530_Set()函数中出不来了,我在里面加上了显示的程序,现在数码管上显示的是“3”,说明程序是卡在了while(CS5530_SDO == 1); 我不明白的是,我都已经设置了连续转换,手册中写道,当用户发送一个执行连续转换的命令时,转换器就会利用配置寄存器中字速率和极性设置参数开始进行连续转换。一旦命令已经发送,串口就会进入数据模式直到一次转换完成。转换完成后,SDO脚会变为低电平0,表明数据已经转换完成,但此处为什么SDO引脚不变低呢? 如果是我读写函数写的有问题的话,那复位那个地方就应该卡住啊,还请用过的大侠指点下小弟,感激不尽!!!
|