注:本代码运行环境为32位单片机
C语言代码如下:
u32 ADvalue;
u8 RH_DATA=0,RM_DATA=0,RL_DATA=0,RS_DATA=0;
u32 AD_H,AD_M,AD_L,AD_S;
u8 Rdata;
void delay(u16 de)
{
System_Delay_us(de+10);
}
/*****************************************************************************************************************************************/
void SDI_WRITE_BIT(u8 BitValue)
{
GPIO_WriteBit(AD_SDI_GPIO, AD_SDI_PIN, (BitAction)BitValue); //根据BitValue,设置MOSI引脚的电平,BitValue要实现非0即1的特性
}
u8 Read_WriteByte(u8 TxData)
{
u8 i, ByteReceive = 0x00; //定义接收的数据,并赋初值0x00,此处必须赋初值0x00,后面会用到
for (i = 0; i < 8; i ++) //循环8次,依次交换每一位数据
{
SDI_WRITE_BIT(TxData & (0x80 >> i)); //使用掩码的方式取出ByteSend的指定一位数据并写入到MOSI线
ACLK_SET_HIGH(); //拉高SCK,上升沿移入数据
if (DATA_STATUS())
{
ByteReceive |= (0x80 >> i);
} //读取MISO数据,并存储到Byte变量
//当MISO为1时,置变量指定位为1,当MISO为0时,不做处理,指定位为默认的初值0
ACLK_SET_LOW(); //拉低SCK,下降沿移出数据
}
return ByteReceive; //返回接收到的一个字节数据
}
/*****************************************************************************************************************************************/
void Write_Register(u8 COMMAND,u8 H_DATA,u8 M_DATA,u8 L_DATA,u8 S_DATA)
{
u8 i;
ACLK_SET_LOW();
CS_SET_LOW();
delay(5);
for(i=8;i>0;i--)
{
if((COMMAND&0x80)==0)
SDI_SET_LOW();
else
SDI_SET_HIGH();
delay(1);
ACLK_SET_HIGH();
delay(1);
ACLK_SET_LOW();
COMMAND<<=1;
}
for(i=8;i>0;i--){if((H_DATA &0x80)==0){SDI_SET_LOW();}else{SDI_SET_HIGH();} delay(1); ACLK_SET_HIGH(); delay(1); ACLK_SET_LOW(); H_DATA <<=1;}
for(i=8;i>0;i--){if((M_DATA &0x80)==0){SDI_SET_LOW();}else{SDI_SET_HIGH();} delay(1); ACLK_SET_HIGH(); delay(1); ACLK_SET_LOW(); M_DATA <<=1;}
for(i=8;i>0;i--){if((L_DATA &0x80)==0){SDI_SET_LOW();}else{SDI_SET_HIGH();} delay(1); ACLK_SET_HIGH(); delay(1); ACLK_SET_LOW(); L_DATA <<=1;}
for(i=8;i>0;i--){if((S_DATA &0x80)==0){SDI_SET_LOW();}else{SDI_SET_HIGH();} delay(1); ACLK_SET_HIGH(); delay(1); ACLK_SET_LOW(); S_DATA <<=1;}
CS_SET_HIGH();
delay(5);
}
/*****************************************************************************************************************************************/
void MySPI_W_MOSI(uint8_t BitValue)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_5, (BitAction)BitValue); //根据BitValue,设置MOSI引脚的电平,BitValue要实现非0即1的特性
}
/*****************************************************************************************************************************************/
void Read_Register(u8 COMMAND)
{
u8 i;
ACLK_SET_LOW();
CS_SET_LOW();
delay(5);
for(i=8;i>0;i--){if((COMMAND&0x80)==0){SDI_SET_LOW();}else{SDI_SET_HIGH();} delay(1); ACLK_SET_HIGH(); delay(1); ACLK_SET_LOW(); COMMAND<<=1;}
RH_DATA=Read_WriteByte(0xFF);
RM_DATA=Read_WriteByte(0xFF);
RL_DATA=Read_WriteByte(0xFF);
RS_DATA=Read_WriteByte(0xFF);
CS_SET_HIGH();
delay(5);
}
/*****************************************************************************************************************************************/
void Reset_SPI(void)
{
CS_SET_LOW();
delay(5);
Read_WriteByte(0x00);
Read_WriteByte(0xA5);
Read_WriteByte(0xFF);
Read_WriteByte(0x5A);
CS_SET_HIGH();
delay(5);
}
/*************************************************/
void Read_Convert(void)
{
Read_WriteByte(0xFF);
Read_WriteByte(0xFF);
Read_WriteByte(0xFF);
Read_WriteByte(0xFF);
}
void Init_CS5552(void)
{
CS_SET_HIGH();
System_Delay_us(100000);
Reset_SPI();
CS_SET_HIGH();
System_Delay_us(100000);
Write_Register(0x30,0x80,0x00,0x00,0x00);//SYS_CONF0系统相关的配置寄存器/W/单一寄存器/校验位0(00110000) DATA: 系统全局复位(10000000|00000000|00000000|00000000)
CS_SET_HIGH();
System_Delay_us(100000);
Write_Register(0x21,0x00,0x00,0x00,0xF6); // CONV_CONF0 //PGA=1 DATA RATE=6.25Hz
Write_Register(0x39,0x20,0x01,0x02,0x10); // SYS_CONF1 //***PGA=1*******FR_SEL=0;
Write_Register(0x41,0x00,0x02,0x00,0x00); // SYS_CONF2
CS_SET_LOW();
delay(5);
Read_WriteByte(0x82); //转换命令帧 使用 CONV_CONF00 作为转换设置参数寄存器/正常连续转换模式
delay(1);
return;
}
/*************************************************/
void Read_AD_CH0(void)
{
ADvalue=0;
Read_WriteByte(0xFF);
delay(10);
AD_H=Read_WriteByte(0xFF);
AD_M=Read_WriteByte(0xFF);
AD_L=Read_WriteByte(0xFF);
AD_S=Read_WriteByte(0xFF);
ADvalue=ADvalue+AD_H; ADvalue=ADvalue<<8;
ADvalue=ADvalue+AD_M; ADvalue=ADvalue<<8;
ADvalue=ADvalue+AD_L; ADvalue=ADvalue<<8;
ADvalue=ADvalue+AD_S;
delay(200);
}
/*************************************************/
s32 Read_AD_Value(void)
{
s32 AdcValue;
Read_AD_CH0();
AdcValue = ADvalue;
AdcValue>>=8;
return AdcValue;
}
void Init_AD(void)
{
Init_CS5552();
}
/*************************************************/
注:由于CS5552的实际最高精度为24位有效位,故最后AD值的转换结果需要右移八位。