高精度AD芯片CS5552驱动的实现(已在实际项目中验证)

注:本代码运行环境为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值的转换结果需要右移八位。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值