下面一段关于ADS1247的驱动程序,不知道是否正确,还请各位大神指点一下,,,
void ADS_WriteByte(unsigned char WriteData) //写一个字节数据
{
unsigned char i; ADS_CS_0;
ADS_SCLK_0;
Delay(10);
for(i = 0 ; i < 8 ;i++) { if (WriteData & 0x80)
ADS_Din_1; else ADS_Din_0; ADS_SCLK_1; Delay(1);
WriteData = WriteData << 1 ; ADS_SCLK_0;
} ADS_CS_1;}
void ADS_Reset() //复位ADS1247
{
ADS_WriteByte(Reset);
delay_AD(30000);//延时大于0.6ms
}
void ADS_Init(void) //AD初始化
{
ADS_Reset(); //首先复位AD,其次向指定寄存器写操作命令
//Multiplexer Control Register 0
WriteReg_S(Reg_MUX0 | 0x40 , 0x00 , 0x01); // 设置AD0(9脚)为+,AD1(10脚)为-
//Bias Voltage Register
WriteReg_S(Reg_VBias | 0x40 , 0x00 , 0x00); //默认值
//Multiplexer Control Register 1
WriteReg_S(Reg_MUX1 | 0x40 , 0x00 , 0x00); // //Bit7:启用内部晶振,Bit6-5:外部基准2.5V,Bit2-0:普通模式
//System Control Register 0
WriteReg_S(Reg_SYS0 | 0x40 , 0x00 ,0x09); // //Bit7:必须设置为0,Bit6-4:选择1倍增益,Bit3-0:选择2000SPS测量速度
//IDAC Control Register 0
WriteReg_S(Reg_IDAC0 | 0x40 , 0x00 , 0x08); //Bit7-4:只读,Bit3:DRDY/DOUT功能复用Dout线 ,Bit2-0:关闭内部恒流源
}
signed long ReadAds1247Data(void) //读AD数据
{ unsigned char i;
unsigned char WriteData=0x12;//读一次数据命令
unsigned long r=0;
signed long rr=0;
while ((rP2_IN & ADS_Dout) == 0x02);
ADS_CS_0;
ADS_SCLK_0;
for(i = 0 ; i < 8 ;i++) //发送读一次数据命令(发送读数据命令) { if (WriteData & 0x80)
ADS_Din_1; else ADS_Din_0; ADS_SCLK_1; Delay(1); //延时1uS
WriteData = WriteData << 1 ; ADS_SCLK_0;
} ADS_Din_1; for(i=0;i<24;i++)//在24个工作时钟的作用下,DOUT输出24位数据高位在前,即读取DOUT数据,同时对DIN进行空操作(拉高)
{ ADS_SCLK_1;
Delay(1);//延时1uS
r=r<<1;
if (rP2_IN&ADS_Dout) r++; ADS_SCLK_0;
} ADS_CS_1;
// 转换输出格式为直接二进制,有符号位
if(r & 0x800000) //判断是正数还是负数 {
r =(r-0x000001)^ 0xffffff;
fushu=1;
}
else
{
fushu=0;
} rr=r;
return rr;//返回数据
}
void ADC_initPort() //AD端口初始化 CS:P2^4片选(4脚) DIN:P2^3向AD发送数据(5脚), SCK:P2^2时钟口(6脚), DOUT:P2^1来自AD的数据(7脚)
{
rP2_CFG = P21_IO|P22_IO|P23_IO|P24_IO;//端口配置成I/o模式
rP2_DIR = P22_OUT|P23_OUT|P24_OUT;//P2^2输出,P2^3输出,P2^4输出 ,P2^1输入(默认)
rP2_OUT = BIT2|BIT3|BIT4;//第2位,第3位,第4位置1
}
user151383853:
写得挺规范, 建议找 bug 还是请你的调试器帮忙吧
Martin:
回复 user151383853:
有去实验过么? 建议用示波器观察接口时序跟数据手册里面的想比较
hang yang:
回复 Martin:
我用示波器看了,没有采样开始到采样结束的时间间隔不是很固定
还有我想问ADS1247可以连续读取数据的,如何实现,,,
Martin:
回复 hang yang:
肯定可以连续读取数据的,具体实现请参考数据手册 Figure 76. Read Data Continuously 示意图
Martin:
回复 hang yang:
可以酌情参考以下链接中的例程:
http://www.deyisupport.com/question_answer/analog/data_converters/f/58/t/68454.aspx
hang yang:
回复 Martin:
恩,我就是参考数据手册的,搞了半天都没有搞出来
hang yang:
回复 Martin:
这个例程早些时候我就下载过了。里面写的很全面,就是太多了,看不过来!!!