本帖最后由 HUA_WIND 于 2015-9-11 20:07 编辑
我想请大侠帮忙看一下我的ad转换软件过程有没有错误,急等。谢谢。
硬件说明:用的是AIN0,1差分,参考是内部2.5V,同步DSYNC及DRDY引脚悬空用软件控制。
软件读写寄存器正确,AD转换读出来的数据随机,不正确。(差分输入端短路时读出的数据也是随机的)
void AD_Convert(void)
{
BYTE temp;
SPI_CSN_CLR;
DrvSYS_Delay(3000);//选择ADS1216Y
SpiTxRxByte(0xfe);
DrvSYS_Delay(100);//复位ADS1216寄存器
SpiTxRxByte(0x50);
SpiTxRxByte(0x02);
SpiTxRxByte(0x0e);//配置SETUP寄存器,内部参考2.5V,允许BUFFER
SpiTxRxByte(0x01);//差分AIN0+,AIN1-
SpiTxRxByte(0x00);//动态范围5V(增益设置)
DrvSYS_Delay(100);
//test 读寄存器ok
// SpiTxRxByte(0x19);
// SpiTxRxByte(0x00);
// AD0_VALUE[0] = SpiTxRxByte(0);
//test
SpiTxRxByte(0x58);
SpiTxRxByte(0x01);
SpiTxRxByte(0x80);//设置采样频率0x780
SpiTxRxByte(0x07);
DrvSYS_Delay(100);
SpiTxRxByte(0x57);//配置IO全为输出
SpiTxRxByte(0x00);
SpiTxRxByte(0x00);
DrvSYS_Delay(100);
SpiTxRxByte(0x5D);//配置满刻度寄存器
SpiTxRxByte(0x02);
SpiTxRxByte(0xFF);
SpiTxRxByte(0xFF);
SpiTxRxByte(0xFF);
DrvSYS_Delay(100);
SpiTxRxByte(0x59);
SpiTxRxByte(0x00);
SpiTxRxByte(0x37);//选择SINC3滤波器,双极性输出
DrvSYS_Delay(100);
SpiTxRxByte(0x56);
SpiTxRxByte(0x00);
SpiTxRxByte(0x08);//08h选择外部输入(硬件上选择差分对)
DrvSYS_Delay(1000);
SpiTxRxByte(0xfc);//发DSYNC命令
DrvSYS_Delay(500);
wait: SpiTxRxByte(0x19);//读DRDY标志
SpiTxRxByte(0x00);
temp=SpiTxRxByte(0);
temp=temp&0x80;
if(temp)goto wait;//等待转换数据准备好
SpiTxRxByte(0x01);//发RDATA命令
DrvSYS_Delay(100);
SpiTxRx3Byte(0);//连续读三字节子程序(读寄存器的子程序读一字节)
SPI_CSN_SET;
}
以下是连续读3字节子程序(看TI的RDATA过程好像每读一个字节要发一个虚拟命令0xff,但看手册没这个要求,晕了)
void SpiTxRx3Byte(BYTE dat)
{
BYTE i,j,temp;
temp = 0;
SPI_SCK_CLR;
for(j=0;j<3;j++)
{
for(i=0; i<8; i++)
{
if(dat & 0x80)
{
SPI_DIN_SET;
}
else
{
SPI_DIN_CLR;
}
dat <<= 1;
SPI_SCK_SET;
Spi_nop();
Spi_nop();
Spi_nop();
Spi_nop();
Spi_nop();
temp <<= 1;
if(SPI_MISO) /* CPU_IN */
{
temp++;
}
SPI_SCK_CLR;
Spi_nop();
Spi_nop();
Spi_nop();
Spi_nop();
Spi_nop();
}
AD0_VALUE[j]=temp;temp=0;
}
}
|