请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
部件号: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