求助!STC8A8K单片机读取CS5550AD转换的数据程序
只能观察到SDO出现周期性的单脉冲;void initialize(void);
void spiwrite_com(unsigned int);
void write_to_register(unsigned int command,unsigned int low,unsigned int mid,unsigned int high);
void write_to_register_int(unsigned int command,unsigned int low,unsigned int mid,unsigned int high);
void read_to_register(unsigned int command,unsigned int low,unsigned int mid,unsigned int high);
void transfer_byte(unsigned int);
void transfer_byte_int(unsigned int);
void Init_Com(void);
unsigned char CS5550_RECEIVE_TABLE[3]= {0,0,0};
//从设备SPI设置
sbit CS5550_INT=P3^7; //外部中断接收位
sbit CS5550_SCLK=P1^5; //串行时钟输入引脚,确定SDI与SDO的输入输出速率
sbit CS5550_SDO=P2^1; //串行数据输出引脚
sbit CS5550_CS=P2^3; //片选位,应在SCLK处于低电平时改变状态
sbit CS5550_SDI=P1^1; //串行数据输入引脚
void write_to_register(unsigned int command,unsigned int high,unsigned int mid,unsigned int low) //写寄存器
{
CS5550_SCLK=0;
CS5550_CS=0;
delay();
transfer_byte_int(command);
transfer_byte_int(high);
transfer_byte_int(mid);
transfer_byte_int(low);
CS5550_SCLK=0;
CS5550_CS=1;
}
void write_to_register_int(unsigned int command,unsigned int high,unsigned int mid,unsigned int low) //防止数据覆盖
{
CS5550_SCLK=0;
CS5550_CS=0;
delay();
transfer_byte_int(command);
transfer_byte_int(high);
transfer_byte_int(mid);
transfer_byte_int(low);
CS5550_SCLK=0;
CS5550_CS=1;
}
void read_to_register(unsigned int command,unsigned int high,unsigned int mid,unsigned int low) //读寄存器
{
CS5550_SCLK=0;
CS5550_CS=0;
delay();
transfer_byte(command);
transfer_byte(high);
transfer_byte(mid);
transfer_byte(low);
CS5550_SCLK=0;
CS5550_CS=1;
}
void transfer_byte_int(unsigned int dat) //CS5550 SPI接收一个字节数据
{
unsigned char i;
CS5550_CS=0;
delay();
for(i=0; i<8; i++)
{
CS5550_SCLK=0;
if((dat&0x80)==0)
{
CS5550_SDI=0;
}
else
{
CS5550_SDI=1;
}
CS5550_SCLK=1;
delay();
CS5550_SCLK=0;
dat<<=1;
}
}
void transfer_byte(unsigned int dat) //CS5550 SPI发送一个字节数据
{
unsigned char i;
unsigned char tdata;
CS5550_CS=0;
delay();
for(i=0; i<8; i++)
{
CS5550_SCLK=0;
if( CS5550_SDO == 1)
{
tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
}
else
{
tdata = tdata&0xfe; // 否则数据的最后一位置0
}
CS5550_SCLK=1;
delay();
CS5550_SCLK=0;
dat<<=1;
}
}
//复位
void initialize()
{
unsigned char i=0;
CS5550_CS=0;
delay();
delay();
spiwrite_com(0xff);
spiwrite_com(0xff);
spiwrite_com(0xff);
spiwrite_com(0xfe); //串口复位
spiwrite_com(0x80); //软件复位
CS5550_SDI=0;
CS5550_SDO=1;
CS5550_SCLK=0;
}
//串口初始化
void Init_Com()
{
TMOD=0X20;
TH1=0xfd;
TL1=0xfd;
PCON=0x00; //波特率不增倍
TR1=1; //启动定时器
SCON=0x50; //串行口1工作方式为方式1,允许串行接收
S2CON=0x40; //串行口2工作方式0,允许接收
}
//寄存器写命令
void spiwrite_com(unsigned int Input)
{
CS5550_SCLK=0;
CS5550_CS=0;
delay();
transfer_byte_int(Input);
CS5550_SCLK=0;
CS5550_CS=1;
}
void result() //模拟转换量读取
{
unsigned char a,b,n;
CS5550_SCLK=0;
CS5550_CS=0;
write_to_register(0x5e,0xff,0xff,0xfe); //清状态寄存器
transfer_byte_int(0x07); //读输出寄存器1
// transfer_byte_int(0x08); //读输出寄存器2
for(a=0; a<3; a++)
{
for(b=0; b<8; b++) //经过8个周期的if&else循环判断处理,CS5550_RECEIVE_TABLE[]最后存储了主机sbuff的一字节数据
{
CS5550_RECEIVE_TABLE[a]<<=1;
if(CS5550_SDO)
CS5550_RECEIVE_TABLE[a]|=0x01;
else
CS5550_RECEIVE_TABLE[a]&=0xfe;
CS5550_SCLK=1;
delay();
CS5550_SCLK=0;
if((b+1)%8==0)
{
CS5550_SDI=0;
}
else
{
CS5550_SDI=1;
}
delay();
}
transfer_byte(CS5550_RECEIVE_TABLE[a]); //向单片机发送8位数据,3个a周期下来便是发送3字节共24位数据
CS5550_SCLK=0;
CS5550_CS=1;
for(n=0; n<100; n++);
}
}
void main()
{
initialize(); //复位
write_to_register(0x40,0x00,0x00,0x1f);//写配置寄存器(增益为10,中断信号INT方式为低电平有效,AIN1、2通道高速滤波器被禁止,CPUCLK驱动上升沿逻辑时,使噪声最小,内部时钟频率DCLK=MCLK,K=1
write_to_register(0x5e,0xff,0xff,0xfe);//清状态寄存器(向状态寄存器24位宽全部写入1使所有位都变成0,最后一位IC位的设置对整个芯片的工作影响不大,所以可改可不改)
write_to_register(0x74,0x80,0x00,0x00);//写屏蔽寄存器(首位置1表示数据就绪,校准序列已经完成,其他置零)
write_to_register(0x4a,0x00,0x00,0x10);//写周期计数寄存器(N=2^4=16)
Init_Com(); //初始化串口
spiwrite_com(0xc8); //校准
transfer_byte(0xe0); //开始转换(0xE8:连续转换;0xE0:单转换)
result(); //模拟转换量读取
oled(); //外部oled显示
}