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/AMC7836:AMC7836 ADC与AMC7836EVM配合良好,但未与具有自定义程序的AMC7836配合使用

Guru**** 2017950 points
Other Parts Discussed in Thread: AMC7836EVM, AMC7836
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/592868/linux-amc7836-amc7836-adc-is-working-well-with-amc7836evm-but-not-with-amc7836-with-custom-program

部件号:AMC7836

工具/软件: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