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.

[参考译文] ADS1263:SPI与ADS1263和ATxmega256a3bu通信

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/596816/ads1263-spi-communication-with-ads1263-and-atxmega256a3bu

部件号:ADS1263

您好,

我正在使用带有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