void ADS8345_start(void)
{
DCLK = 0;
CS = 1; DIN1 = 1;
// DOUT = 0;
DCLK =1 ;
CS = 0;
// BUSY = 0;}
void ADS8345_WR(uchar dat)
{
uchar count;
DCLK = 0; for(count = 0; count < 8; count++)
{
dat <<= 1;
DIN1 = CY;
DCLK = 0;
_nop_();
_nop_();
_nop_();
DCLK = 1;
_nop_();
_nop_();
_nop_();
}
}
uint ADS8345_RD(void)
{
uchar count = 0;
uint dat = 0;
for(count = 0; count < 17; count++)
{
dat <<= 1;
DCLK = 1;
_nop_();
_nop_();
_nop_();
DCLK = 0;
_nop_();
_nop_();
_nop_();
if(DOUT == 1)
{
dat++;
}
}
return (dat);
}
void main()
{while(1)
{
ADS8345_start();
delay(2);
ADS8345_WR(0x87);
DIN1 = 0;
// delay(2);
DCLK = 0;
_nop_();
_nop_();
_nop_();
_nop_();
DCLK = 1;
_nop_();
_nop_();
_nop_();
_nop_();
//while(BUSY == 1);
result = ADS8345_RD();
CS = 1;
AD_result = (double)result * 5 / 65535;
}
}
bin yang3:
他转换完的结果都是错的 但是时序用示波器看到都是正确的
Decapton Wang:
回复 bin yang3:
上传一下你的电路图和用示波器抓到的SPI时序图,以方便分析。
bin yang3:
回复 Decapton Wang:
谢谢您的回复 ADS8345抓到的时序图和电路图为以下内容:
bin yang3:
回复 Decapton Wang:
求解答哈。。。。
Decapton Wang:
回复 bin yang3:
模拟部分,检查各个输入的绝对电压是不是在(-0.2,VCC+0.2)这个范围。检查VREF是不是在(0.5,2.5)这个范围。
数字部分,可以参考图8或图9来检查波形是不是和手册一致。
bin yang3:
回复 Decapton Wang:
都测试过 模拟部分都是正确的 那些时序和PDF里面的时序图都是正确的
Decapton Wang:
回复 bin yang3:
AD_result = (double)result * 5 / 65535;为什么是*5?手册15页左边那个表格,是数字编码和输入信号的关系,你检查一下你的程序和这个表格是不是吻合的。
bin yang3:
回复 Decapton Wang:
谢谢您的回复 现在测量GND的时候AD返回的数据是00024 测量5V的时候是56458 测量基准电压2.5V的时候 返回来的数据也是65534 现在返回数据都不正确 算出来的结果一定是错的。。。
Decapton Wang:
回复 bin yang3:
怎么可能算出来56458和65534?!按手册15页的data format,输出应该在-32768~32767之间啊。你是不是把2的补码搞成二进制偏移码了?
bin yang3:
回复 Decapton Wang:
也就是说他虽说是十六位的AD 实际上是十五位么? 可以这样理解么?