📄 cs5532.c
字号:
#define _CS5532_C
#include <iom169v.h>
#include <macros.h>
#include <stdio.h>
#include "main.h"
#include "cs5532.h"
const unsigned char ADInitData[35]=
{0x41,
0xfe,0x00,0x00,0x00, //通道0
0xfe,0x00,0x00,0x00, //通道1
0xfe,0x00,0x00,0x00, //通道2
0xfe,0x00,0x00,0x00, //通道3
0x45, //设置所有通道设置寄存器
0x31,0xc0,0x31,0xc0, //0x31:12.5Hz,通道1(1、2脚)
0x31,0xc0,0x31,0xc0, //0x71,通道2(19、20脚)
0x31,0xc0,0x31,0xc0,
0x31,0xc0,0x31,0xc0,
0xc0}; //执行多路连续转换
const unsigned char ADResetData[6]=
{0xfe,0x03,0x20,0x00,0x00,0x00}; //配置寄存器RS位置1,AD复位
//cs5532操作IO延时
void AD_delay(void)
{
}
//cs5532写寄存器
void AD_write(unsigned char byte)
{
unsigned char i,temp;
temp = byte;
for(i=0;i<8;i++)
{
if(temp&0x80)
SET_SDI; //数据送到SPI的SDI口
else
CLR_SDI;
delay_loop(2);
SET_SCK; //时钟高
delay_loop(2);
CLR_SCK; //时钟低
delay_loop(2);
temp<<=1;
}
CLR_SDI;
}
//cs5532读寄存器
unsigned char AD_read(void)
{
unsigned char i,data=0;
CLR_SCK;//sclk=0
delay_loop(2);
for(i=0;i<8;i++)
{
SET_SCK; //时钟高
delay_loop(2);
data<<=1;
if(SDO)
data|=0x01;
else
data &= 0xfe;
delay_loop(2);
CLR_SCK; //时钟低
delay_loop(2);
}
return(data);
}
//初始化cs5532
void Init5532(void)
{
unsigned char i,data=0;
SET_CS;
delay_loop(2);
CLR_CS; //片选使能
delay_loop(2);
CLR_SDI;
SET_SDO;
CLR_SCK;
for(i=0;i<15;i++) AD_write(0xff); //初始化序列
// AD_write(0xfe);
for(i=0;i<6;i++) AD_write(ADResetData[i]); //复位cs5532
while(data!=0x10) //等待AD复位
{
AD_write(0x0b); //读配置寄存器
data=AD_read();
AD_read();
AD_read();
AD_read();
}
for(i=0;i<35;i++)
{
AD_write(ADInitData[i]);
}
}
//cs5532采样
void AD_sample(void)
{
unsigned char data[4];
AD_write(0x0c);
data[3]=0;
data[2]=AD_read();
data[1]=AD_read();
data[0]=AD_read();
AD_read();//状态字节(溢出位和通道指示),没有用到,丢弃.............
}
void CS5532_Txd(unsigned char dat)//向CS5532写一字节数据
{
unsigned char i;
CLR_SCK;//时钟低
CLR_CS;
delay_loop(1);
for(i=0;i<8;i++)
{
if((dat<<i)&0x80)
SET_SDI; //数据送到SPI的SDI口
else
CLR_SDI;
delay_loop(2);
SET_SCK; //时钟高
delay_loop(2);
CLR_SCK; //时钟低
delay_loop(2);
}
CLR_SDI;
}
unsigned long CS5532_RXD(void)
{
unsigned long c;
unsigned char RxdTxd4b[4];
unsigned char i,j;
c=0;
CLR_SDI;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
SET_SCK; //时钟高
delay_loop(2);
RxdTxd4b[j]<<=1;
if(SDO)
RxdTxd4b[j]|=0x01; //从SDO读取数据
else
RxdTxd4b[j]|=0x00; //从SDO读取数据
delay_loop(2);
CLR_SCK; //时钟低
delay_loop(2);
}
}
c |= RxdTxd4b[0];
c<<=8;
c |= RxdTxd4b[1];
c<<=8;
c |= RxdTxd4b[2];
c<<=8;
c |= RxdTxd4b[3];
// c=c>>8;//去掉最低位
return(c);
}
void CS5532_init(void)
{
//串口初始化
unsigned char i;
SET_CS;
delay_loop(2);
CLR_CS; //片选使能
delay_loop(2);
CLR_SDI;
SET_SDO;
CLR_SCK;
for(i=0;i<15;i++)
{
CS5532_Txd(0xFF);//发送命令
}
CS5532_Txd(0xFE);
//配置寄存器
CS5532_Txd(0x43);
CS5532_Txd(0x02);
CS5532_Txd(0x40);
CS5532_Txd(0x00);
CS5532_Txd(0x00);
CS5532_Txd(0x02);
CS5532_Txd(0x40);
CS5532_Txd(0x00);
CS5532_Txd(0x00);
CS5532_Txd(0x02);
CS5532_Txd(0x40);
CS5532_Txd(0x00);
CS5532_Txd(0x00);
CS5532_Txd(0x02);
CS5532_Txd(0x40);
CS5532_Txd(0x00);
CS5532_Txd(0x00);
/* //通道寄存器
CS5532_Txd(0x05);
CS5532_Txd(0x32);
CS5532_Txd(0x40);
CS5532_Txd(0x32);
CS5532_Txd(0x40);*/
//---------------------------
}
unsigned long CS5532_RW(unsigned int chunnel)
{
unsigned char Conversion_r,l,j,i;
unsigned char AD_data[4];
switch(chunnel)
{
case 0:
CLR_4052A;
CLR_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
case 1:
SET_4052A;
CLR_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
case 2:
CLR_4052A;
SET_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
case 3:
SET_4052A;
SET_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
case 4:
CLR_4052A;
CLR_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b01110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
case 5:
SET_4052A;
CLR_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b01110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
case 6:
CLR_4052A;
SET_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b01110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
case 7:
SET_4052A;
SET_4052B;
CS5532_Txd(0x05);
CS5532_Txd(0b01110110);
CS5532_Txd(0x40);
CS5532_Txd(0b00110110);
CS5532_Txd(0x40);
break;
default:break;
}
CS5532_Txd(0x80); //启动稳定的单次转换
while(SDO!=0) //等待转换结束
{;}
// 读取数据
CLR_SCK;//时钟低
CLR_SDI;
delay_loop(1);
for(i=0;i<8;i++)
{
SET_SCK; //时钟高
delay_loop(1);
CLR_SCK; //时钟低
delay_loop(1);
}
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
SET_SCK; //时钟高
AD_data[j]<<=1;
if(SDO)
AD_data[j]|=0x01; //从SDO读取数据
CLR_SCK; //时钟低
delay_loop(1);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -