Part Number:ADS8168
大家好,我使用ADS8168读取数据有问题。
我是在ZYNQ 平台下使用ADS8168的。
我先测试了一下zynq和ADS8168的spi通讯是否正常。
write_cmd(ADCCMD_WR_REG, 0xFF, 0x55);
write_cmd(ADCCMD_RD_REG, 0xFF, 0x0);
我先向 0xFF地址谢数据 0x55, 然后读0xFF的数据,结果返回0x55;
write_cmd(ADCCMD_WR_REG, 0xFFFF, 0x66);
write_cmd(ADCCMD_RD_REG, 0xFFFF, 0x0);
我向 0xFF地址谢数据 0x66, 然后读0xFF的数据,结果返回0x66;
这说明读写没问题,SPI通讯没问题。
下面就开始按照手册配置和读取数据
// 使能写
write_cmd(ADCCMD_WR_REG, REG_ACCESS, REG_ACCESS_BITS);
//write_cmd(ADCCMD_RD_REG, REG_ACCESS, 0x0);
// Powerup all except the ref/2 buffer
write_cmd(ADCCMD_WR_REG, REG_PD_CNTL, PD_CNTL_PD_REFby2);
// Data type: ADC value + 4-bit channel id
write_cmd(ADCCMD_WR_REG, REG_DATA_CNTL, DATA_CNTL_FORMAT_CHID);
// Vref = 4V096
write_cmd(ADCCMD_WR_REG, REG_OFST_CAL, OFST_CAL_4V096);//REG_SDO_CNTL4
write_cmd(ADCCMD_WR_REG, REG_SDO_CNTL4, SDO_CNTL4_SEQSTS_CFG);
write_cmd(ADCCMD_WR_REG, REG_DEVICE_CFG, DEVICE_CFG_SEQMODE_AUTO);
tmp|=AUTO_SEQ_CFG1_EN_AIN0;
tmp|=AUTO_SEQ_CFG1_EN_AIN1;
write_cmd(ADCCMD_WR_REG, REG_AUTO_SEQ_CFG1, tmp);
write_cmd(ADCCMD_WR_REG, REG_SEQ_START, SEQ_START_START);
while(readpin(SEQSTS)!=0)
{
chanel2=readChannelCustom();
chanel6=readChannelCustom();
}
the readchannelcustom fun follow
uint16_t readChannelCustom()
{
//Establish time
for(int i=0;i<50000;i++);
unsigned char tx_data[2]={0,0};
unsigned char rx_data[2]={0,0};
XSpi_Transfer(&SpiInstance, tx_data, rx_data, 2);
return rx_data[0] << 8 | rx_data[1];
}
我使用自动模式读取0,和1 通道,我改变0通道的输入从0.4-20V,结果输出的数据一直是0x8E1。具体是哪一步配置有问题呢?我读取的时候查看了SEQSTS的pin脚,seq开始的时候pin脚拉高,当读完两次的时候,pin脚就自动拉低了。
Amy Luo:
您好,
我有如下疑问:
关于 0xFF地址,是什么的地址?寄存器地址没有到 0xFF,最大到7Eh
另外输入从0.4-20V,ADS8168的输入也到不了20V
,
shaoqing ke:
您好!
谢谢您的回复,20V是笔误,应该是2V.
我重新检查了SPI通讯,发现通讯有问题,每次读回来的都是上次的命令。
write_cmd(ADCCMD_WR_REG, REG_SDI_CNTL , 0x0);
SPI Send : 0x08 0x08 0x00
Read: 0x06 0x06 0x06
usleep(100);write_cmd(ADCCMD_WR_REG, REG_SDO_CNTL1 , 0x0);
SPI Send : 0x08 0x0C 0x00
Read: 0x08 0x08 0x00
usleep(100);write_cmd(ADCCMD_RD_REG, REG_ACCESS , 0x0);
SPI Send : 0x02 0x00 0x00
Read: 0x08 0x0C 0x00
usleep(100);write_cmd(ADCCMD_NOP, 0xFF, 0x00);
SPI Send : 0x00 0xFF 0x00
Read: 0x02 0x00 0x00
usleep(100);
是通讯速率的问题还是CPOL,CPOH,时钟极性和相位的问题?
,
shaoqing ke:
您好!
谢谢您的回复,20V是笔误,应该是2V.
我重新检查了SPI通讯,发现通讯有问题,每次读回来的都是上次的命令。
write_cmd(ADCCMD_WR_REG, REG_SDI_CNTL , 0x0);
SPI Send : 0x08 0x08 0x00
Read: 0x06 0x06 0x06
usleep(100);write_cmd(ADCCMD_WR_REG, REG_SDO_CNTL1 , 0x0);
SPI Send : 0x08 0x0C 0x00
Read: 0x08 0x08 0x00
usleep(100);write_cmd(ADCCMD_RD_REG, REG_ACCESS , 0x0);
SPI Send : 0x02 0x00 0x00
Read: 0x08 0x0C 0x00
usleep(100);write_cmd(ADCCMD_NOP, 0xFF, 0x00);
SPI Send : 0x00 0xFF 0x00
Read: 0x02 0x00 0x00
usleep(100);
是通讯速率的问题还是CPOL,CPOH,时钟极性和相位的问题?
,
shaoqing ke:
write_cmd(ADCCMD_RD_REG, REG_ACCESS , 0x0);
SPI Send : 0x01 0x00 0x00
Read: 0x08 0x0C 0x00
这个地方写错了。
,
Amy Luo:
您现在可以正确写入和读取寄存器的值吗?如果不可以,您可以附上SPI通信的示波器波形吗,我看下时序上是否存在问题
,
shaoqing ke:
我用了3个ADS8168,由于其他2个引脚未配置,默认是低电平,因此在SDO上产生冲突,这样回复的数据就不对。