|
ADS8361是16位的串行AD,我用SPI进行通信,根据它的datasheet,每次输出20位数据,前两位为通道号,后两位为0,中间16位为有用数据,我用SPI读3次,不过为什么只有第一次能读到数据呢?我用串口调试小助手看数据。
这是我的程序:
#include "stc12c5a.h"
sbit A0=P2^0;
sbit M0=P2^1;
sbit M1=P2^2;
sbit cs=P2^3;
/*
MISO P1.6
MOSI P1.5
SCLK P1.7
*/
unsigned char ad_data_high=0,ad_data_mid=0,ad_data_low=0;
unsigned int ad_data;
void delay(unsigned int t)
{
while(--t);
}
void read_ADS8361(void)
{
cs=0;
SPDAT=0x80; //启动AD
while(!(SPSTAT&0x80));
SPSTAT=0xc0; //清SPI标志
ad_data_high=SPDAT;
SPDAT=0x00;
while(!(SPSTAT&0x80));
SPSTAT=0xc0;
ad_data_mid=SPDAT;
SPDAT=0x00;
while(!(SPSTAT&0x80));
SPSTAT=0xc0;
ad_data_low=SPDAT;
cs=1;
ad_data=(ad_data_high<<10)+(ad_data_mid<<2)+(ad_data_low>>6);
}
void main(void)
{
// SPI初始化
SPCTL=0xd6; //SPI使能,主机模式,/SS无关,先发高
SPSTAT=0xC0; //清传输完成标志和写冲突标志
TMOD=0x20;//设置定时器1为工作方式2,8位自动重装用于产生波特率
TH1=0xfd; //波特率9600
TL1=0xfd;
TR1=1; //起动时器1
REN=1; //允许串口接收
SM0=0; //串口工作于方式1 8位
SM1=1;
M0=0; //AD工作方式选择
M1=1;
A0=0;
while(1)
{
read_ADS8361();
SBUF=ad_data_high; //串口调试小助手观察
while(!TI);
TI=0;
SBUF=ad_data_mid;
while(!TI);
TI=0;
SBUF=ad_data_low;
while(!TI);
TI=0;
delay(1000);
SPCTL=0xd6; //SPI使能,主机模式,/SS无关,先发高
SPSTAT=0xC0; //清传输完成标志和写冲突标志
}
}
(原文件名:2011-07-27_202310.jpg) |
|