This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Linux
/*------------------ 函数:ADCChannelValue 输入 :i2c字符串- i2c打开/dev/i2c-2 高缓冲器的设备地址-数据表中的较高值 低缓冲器-数据表 中的较低寄存器值pin_no - 处理:通过将ADC通道参数 作为输入从指定ADC引脚读取值。 产出 :ADC通道电压值(0V-12.5V) 返回 :浮点 注释 :无 --------无-------- */ float ADCChannelValue (int highbuff,int lowbuff,int pin_no) { int SPIfd=0; int SPIreturn=0; float ADCvalue=adc 0.0 ; uint8_t upperByte_adc; uint8_lowert Byte_adc; 结构SPI_IOC_TRANSFER transferspi ={ tx_buf =(unsigned long) txspi, rx_buf =(unsigned long) rxspi, .len = array_size (txspi), .delay_usecs = delaysec, .speed_hz =速度, 每字.bits_per =位 ,}; //打开并设置SPI 0.0 SPIfd =SPIsetup ("/dev/spi1"); //写入0.0 mux配置reg-0 txspi[0]=0x00; txspi[1]=0x13; txspi[2]=0xFF; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(), transferspi); IF (SPIreturn < 1) { pabort (“无法发送SPI消息”); } usleep(2000); //写入ADC mux配置reg-1 txspi[0]=0x00; txspi[1]=0x14; txspi[2]=0xFF; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), transferspi); IF (SPIreturn < 1) { pabort (“无法发送SPI消息”); } usleep(2000); //写入ADC mux配置reg-2 txspi[0]=0x00; txspi[1]=0x15; txspi[2]=0xFF; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), transferspi); IF (SPIreturn < 1) { pleep("无法发送SPI消息"); }usleep(2000) ; //写入ADC配置寄存 器// ADC转换模式:直接模式(0)// 转换速率(00)// 启用ADC参考缓冲区 txspi[0]=0x00; txspi[1]=0x10; txspi[2]=0x10; SPIreturn = ioctl, SPI_message(spi_1)(spi)1 transferspi); IF (SPIreturn < 1) { pabort (“无法发送SPI消息”); } usleep(2000); //关闭电源模式注册器配置 txspi[0]=0x00; txspi[1]=0xB4; txspi[2]=0x03; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), transferspi); IF (SPIreturn < 1) { pabort (“不能发送SPI消息”); } usleep(2000); // ADC触发注册表设置位0以启动ADC内部转换 txspi[0]=0x00; txspi[1]=0xC0; txspi[2]=0x01; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), transferspi); IF (SPIreturn < 1) { pabort("无法发送SPI消息");} usleep(2000); //状态寄存器读取,指示ADC空闲和ADC数据可用标志 txspi[0]=0x80; txspi[1]=0x72; txspi[2]=0xFF; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), transferspi); usleep (2000); //状态寄存器读取,指示ADC空闲和ADC数据可用标志 txspi[0]=0x80; txspi[1]=0x72; txspi[2]=0xFF; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), 转接(&T); usleep(2000); //状态寄存器读取,指示ADC空闲和ADC数据可用标志 txspi[0]=0x80; txspi[1]=0x72; txspi[2]=0xFF; SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), transferspi); usleep (2000); //从ADC数据注册表读取的值 //注册表包含ADC通道 txspi[0]=0x80, txspi[1]=highbuff, txspi[2]=0xFF, SPIreturn = ioctl(SPIfd, SPI_IOC_MESSAG(1), transferspi); IF (SPIreturn < 1) { pabort("c't send SPI message"); } else { upperByte_adc=rxspi[2]; printf (" Upper Byt=%d\n",upperByte_ADC); } //printf ("发送到ADC - 0x%02x。 0x%02x。 0x%02x.\n",txspi[0],txspi[1],txspi[2]); //printf ("从ADC读取- 0x%02x。 0x%02x。 0x%02x.\n",rxspi[0],rxspi[1],rxspi[2]); usleep(2000); //注册表包含ADC通道 txspi[0]=0x80的低字节代码; txspi[1]=lowbuff; ioci[2]=0xFF; SPIreturn = ioctl, SPI_fbuff (SPI_SPIfbeep) transferspi); IF (SPIreturn < 1) { pabort("c't send SPI message"); } else { lowerByte_adc=rxspi[2]; //printf (" lower byte=%d\n",lowerByte_adc); }//printf ("发送到ADC - 0x%02x。 0x%02x。 0x%02x.\n",txspi[0],txspi[1],txspi[2]); //printf ("从ADC读取- 0x%02x。 0x%02x。 0x%02x.\n",rxspi[0],rxspi[1],rxspi[2]); IF (pin_no<=15) { // ADCconversiontoFloat定义于amc7836.h ADCvalue=ADCconversiontoFloat (upperByte_ADC,lowerByte_ADC); else if (pin_no<=20) { // amc7836.h中定义的ADCconversiontoFloat ADCvalue=LVADCconversiontoFloat (upperByte_ADC,lowerByte_ADC); } 否则,如果(pin_no=21) { // amc7836.h中定义的ADCconversiontoFloat ADCvalue=TempADCconversiontoFloat (upperByte_ADC,lowerByte_ADC); } SPIclose(SPIfd); return (ADCvalue); }
请在上面的自定义板上查找我们的代码和原理图。
同一代码函数与SPI一起工作,并在AMC7836EVM上非常好地返回ADC数据的结果。
但是,当我们在带有ADC 7836芯片的定制电路板上运行相同的函数调用时,总是返回 0F (更高的ADC代码) FF (更低的ADC代码),这相当于双极12.5V和单极5V。
我们已经调试了所有可能性,但无法找到导致AMC7836芯片上的ADC读数错误的任何差异。
如果 我们 必须设置任何其它寄存器,或者必须进行某些硬件配置,从而获得与AMC7836EVM相同的结果,请提出建议
注:高 缓冲区和低缓冲区字节是缓冲寄存器,用于在SPI上传递..例如,ADC通道0 HIGH =0x21 Low =0x20