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.
您好,
我正在使用带有atxmega256a3bu微控制器的ADS1263。 我现在遇到了配置SPI通信的问题。
(我已将原理图添加到附件中。)
问题是在miso (DOUT/DRDY)线路上无法获得任何信号。
IM使用SPI_Mode1, 500kHz,我直接从ADC读取,如第68页ADS1263数据表中所述。
现在的问题是,我的DRDY引脚(要与之同步的)永远不会变低,即使我将重置引脚切换为1秒(睡眠模式<9ms左右),DRDY引脚始终保持高。
它是否表示ADS1263已损坏或原理图中是否有任何错误?
在我的C代码中,我将CS和MOSI (DIN)线一直拉低,而起始销始终保持高。 然后等待:
while (!(Porta.in和0x10));
用于获得DRDY低值(Porta - pin4),随后读取6个字节(1个状态4个数据1个CRC字节)并将它们放入阵列中。
但正如已经提到的,DRDY永远不会变低,微控制器在while循环中卡住。
我该怎么办?
我将感谢对这一职位的每一个答复。
e2e.ti.com/.../Mikrokontroller_5F00_ATXmega256A3BU_5F00_Schaltplan.pdfe2e.ti.com/.../ADS1263-_2B00_-MCxmega.rar
您好,Ratimir,
欢迎来到TI E2E论坛!
在调试SPI通信之前,我将重点关注/DRDY问题。 当ADC转换时,您应该看到/DRDY定期脉冲(精确地说是1/data rate)。 如果/DRDY未脉冲,则可能表示存在以下问题之一:
1. ADC未正确通电。
查看您的原理图,我没有看到将电源接地线连接到ADC板GND的明显位置,尤其是在您使用双极电源时。 但是,如果您使用单极电源模式(AVDD = 5V,AVSS = 0V),您可以将所有电源接地连接到AVSS ...我会仔细检查您的电源是否正确连接,ADC是否通电。
2. ADC没有时钟信号。
您正在使用内部振荡器(XTAL1连接至GND),因此这应该不是问题。
3. ADC处于断电模式或未转换。
检查PWDN和起始引脚的逻辑级别。 两个针脚都应较高才能激活设备。
4.如果满足上述所有条件,但仍然看不到/DRDY信号,则ADC可能会损坏。
我建议使用示波器探测/DRDY信号,以检查是否正在切换,以防微控制器未记录/DRDY低电平情况。
另一个注意事项是,如果您将MCU板跳线连接到ADC板,请确保跳线短接在一起,以避免SPI信号的电感过高。 此外,不要忘记将PCB接地连接在一起(...我忘记了连接!)。
此致,
Chris
您好Chris,
首先,感谢您的回复和帮助。
ADC工作正常。 我可以读写ADC的寄存器。 我用调试器和OSCi检查了它。
现在,当我尝试读取输入的值时,它会对输入电压做出反应(它会更改数字,当我施加电压时,我可以看到OSCi发生的事情)。 但该值似乎是假的。
当我将电压设置为0伏时,我期望数据也约为0。 但情况并非如此。 所有值似乎都不匹配。
以下是初始化后如何执行代码,启用时钟,芯片选择永久低,SPI (***, 50万Hz, Mode1, Mastermode)和USART (USARTE0, 9600 Baud, 8N1)-我知道两者都工作正常。
int主菜单{
UINT8_t RX[6]. //接收缓冲区
..blablabla init,SPI,USART,board_config blabla..
start_adc;//正在发送启动命令
而(1){
READ_ADC();//正在发送读取命令
SPI_READ_PACKET (&***,RX,6) // SPI_READ_PACKET (volatile AVR32_SPI_t *SPI,uint8_t *data,size_t len)
// RX[0]应该是状态字节?
//RX[1-4]数据字节?
//RX[5] CRC字节
对于(int i=0;i < 4;i++)
{
uINT32_t adc32_raw |= RX[I+1]<<((3-I)*8);//将数据字节设置为4字节整数值
}
//示例:x =1232;char first =(x/1000)应为1232/1000 =1000 = 1 (第一位)
//我想:1232-1*1000=232</s>1000
//232/100=2 (第二位数)...依此类推
//然后我添加+48或0x30作为ASCII代码0-9
对于(int i = 0;i<=9;i++)
{
char c[i+i]= adc32_raw /(10^(9-I));//我只能通过USART发送字符,所以我将 32位值除以分隔数字,如上面的示例所示
}
对于(int i = 0;I<10;I++)
{
usart_putchar(c[i]+48);
}
delay_ms(500);//等待一会,等待下一个循环
}
}
DRDY工作,CS,工作,SPI工作……一切都工作……但我的数据永远不像它应该在我的终端(PuTTY)。 我在直接模式下也尝试了相同的方法:
这里我把起始销定的很高,我喜欢
而(1){
while (Porta.in和DRDY_PIN);//等待数据就绪低,因此数据是新的,可以读取
SPI_READ_PACKET (&***,RX,6);
}
但这些值仍然是错误的。 也许我在沟通过程中做了一些错误的事情?
谢谢!
拉蒂密尔
您好,Ratimir,
示波器上的SPI数据是否正常?
当您的数据经过如此多的不同阶段(SPI通信,C后处理,ASCII编码,UART通信,终端显示和解码)时,很难调试问题。 如果您可以独立完成每个阶段(例如,查看示波器上的原始SPI数据),则可以帮助您确定问题可能出在哪里。
注:由于噪音和两种补充数据格式,0V输入将提供接近0x0万和0x8000万的结果更正:0xFFFFFFFF。
[报价用户="Ratimir避雷器"]
对于(int i=0;i < 4;i++)
{
uINT32_t adc32_raw |= RX[I+1]<<((3-I)*8);//将数据字节设置为4字节整数值
}
[/引述]
在合并数据之前,请确保通过将adc32_raw值设置为零来清除该值。 否则,您将使用之前的数据存储数据。
我不确定二进制到ASCII转换的实现... 它看起来不像您在处理十六进制字母字符(A,B,C,D,E, f)我不理解以下操作:"char c[i+i]= adc32_raw /(10^(9-I));"。 我会仔细检查您的代码的这些部分是否正在执行其预期的操作。
此致,
Chris
您好,Chris:
示波器上的SPI数据是否正常?
是的。 SPI和USART工作正常。
我不理解以下操作:"char c[i+i]= adc32_raw /(10^(9-I));
我把4个字节放在一个32位数字上。 然后,我将数字的每个数字进行拆分。 原因是,我只能在USART上加个字符。
您可以得到的最大数字是2^32。 此数字有10位数。 所以我把它分成数千个,几百个,几百个,一个。
但是,除了价值观之外,一切都很顺利。 我焊接了一个全新的主板。 现在我得到了零。 但这些价值观并不合适。
因此,我的问题是:
1) 如果我使用AVDD = 5V和AVSS = GND (0V)作为供应商,我允许在输入处输入什么:
-绕过和未绕过PGA?
-单路和差动模式
例如,我将AIN8配置为正,将AIN9配置为负输入(ADC1MUX寄存器中的0x89h)。
2) 在数据表的第119页上,他们说如果未禁用PGA且您使用5V电源,则不允许将0 V输入至负极输入。 也许我之前销毁了输入,因为首先,我没有绕过Intern PGA,而使用电压源将AIN8 = 1 V和AIN9 = 0 V (GND)设置为?
3) 如上所述,我使用AIN8位置和AIN9负极,绕过PGA (在未绕过且使用增益=1之前)。 因此,在我的配置中,在第109页上,您说Vinp >-0.1V和VINN < 5.1V? 因此,如果我将AIN8 = 1 V和AIN9 = GND设为"接地",应该没有问题?
但在PGA未绕过且增益=1时:Vinp >0.3V且Vinn <4.7V。 因此(如问题2所示) AIN8 = 1V,AIN9 = 0V,它应该匹配?
4) 您建议使用哪种输入配置来测试这些值?
非常感谢!
拉蒂密尔
您好,Ratimir,
好的-我从本质上看你在尝试做什么。 您正在将数据转换为十进制值,然后尝试转换为ASCII。 您的代码的这一部分是否正常工作? 您可以尝试在代码中将"adc32_ray"设置为常量值,并查看是否获得正确的ASCII输出。
关于您的其他问题...
[报价用户="Ratimir避雷器"]
1) 如果我使用AVDD = 5V和AVSS = GND (0V)作为供应商,我允许在输入处输入什么:
-绕过和未绕过PGA?
-单路和差动模式
[/引述]
有一个Excel计算器可帮助您确定所有这些设置的可接受输入电压。 您可以在此处找到:
[报价用户="Ratimir避雷器"]2。) 在数据表的第119页上,他们说如果未禁用PGA且您使用5V电源,则不允许将0 V输入至负极输入。 也许我之前销毁了输入,因为首先,我没有绕过Intern PGA,而使用电压源将AIN8 = 1 V和AIN9 = 0 V (GND)设置为? [/引述]
只要您不超过绝对最大额定值,设备就应该正常。 在启用PGA的情况下,将输入连接到接地会违反PGA共模电压并产生非线性结果,因为PGA输出不能变为0V (AVSS)。
[报价用户="Ratimir避雷器"]
3) 如上所述,我使用AIN8位置和AIN9负极,绕过PGA (在未绕过且使用增益=1之前)。 因此,在我的配置中,在第109页上,您说Vinp >-0.1V和VINN < 5.1V? 因此,如果我将AIN8 = 1 V和AIN9 = GND设为"接地",应该没有问题?
但在PGA未绕过且增益=1时:Vinp >0.3V且Vinn <4.7V。 因此(如问题2所示) AIN8 = 1V,AIN9 = 0V,它应该匹配?
[/引述]
对于1 V/V的PGA增益和5V单极电源,输入电压必须在:0.3V < VIN< 4.7V的范围内。
在绕过PGA的情况下,输入电压必须在-0.1V < VIN < 5.1V的范围内。
当绕过PGA时,您可以将输入连接到接地。 否则,您需要提供双极ADC电源(+/-2.5V)。
[报价用户="Ratimir避雷器"]4.) 您会推荐哪种输入配置来测试值?[/QUOT]
对于测试,我通常将输入短接到AINCOM (为AINp和AINN选择AINCOM),然后启用VBIAS (电平转换器),这样两个输入都连接到2.5V。
此致,
Chris