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.

[参考译文] 具有XMEGA128A3u.的ADS1259寄存器未更新

Guru**** 2551110 points
Other Parts Discussed in Thread: PGA281, ADS1259

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/629448/ads1259-with-xmega128a3u-registers-of-ads1259-are-not-being-updated

线程中讨论的其他部件:PGA281ADS1259

您好,

我正在为我的项目使用ADS1259 A/D转换器来转换从PGA281接收到的数据。 用于与ADS1259进行SPI通信的微控制器是ATxmega128a3u。 在过去的两周里,我一直在尝试配置ADS1259寄存器,以便将默认采样率从10SPS切为3600 SPS,并进行一些其它设置,但似乎没有正确写入寄存器。 /DRDY引脚在10SPS时始终保持高和低。 我还尝试通过检测RREG命令来读取寄存器值,但始终获得0x00值。 我知道人们也在早些时候提出了类似的问题,但是,即使在尝试了这些解决方案(例如,将SPI模式更改为模式1,首先发送SDATA命令以停止"读取连续数据"模式)之后,我也没有成功。 我在下面附上了我的代码和原理图。



/* SPI_test.c * 创建时间:2017年10月02日 11:55:43 AM *作者:Amit Srivastava */ #define F_CPU 3200万UL #include <AVR/IO.h> #include <util/delay.h> void setUp32Mhz InternalOsc() { OSC.CTRL || OSC_RC32MEN_OBM_OS32MHz/ EN_OS32AX_OS32Z_OS32Z_OSSC_OS32Hz/启用内部振荡 器 /*等待32kHz振荡器稳定*/ while (!(OSC状态和OSC _RC32MRDY_BM)); /*等待32MHz振荡器稳定*/ DFLLRC32M.CTRL = DFLL_ENable_BM; /*启用DFLL -默认校准内部32kHz时钟*/ CCP = CCP_IOREG_GC; /*禁用时钟更新的寄存器安全性*/ CLK.CTRL = CLK_SCLKSEL_RC32M_GC; /*切换到32MHz时钟*/ OSC.CTRL并且=~OSC RC2MEN_BM; /*禁用2MHz振荡器*/ } void setUpSPI() { // PE7= SCK,PE6=Miso,PE5=MOSI,PE5=CS。 PORT_DIR = 0b1011.1011万; /*双时钟=0,SPI启用= 1,深光源= 0 (先选择重要位),主中继器= 1 (主中继器模式),传输模式= 01 (模式1),SCK频率=11 (CLK_PE/128 (b因为 最大值= f_clk_ADS1259/TC100 1.8))*/ SPIE_0TRL_1.0101万 被禁用 ;中断= SPIE_0TC1.0101万 UINT8_t SPI_READ() { SPIE_DATA = 0x00; //正在发送虚拟数据 ,同时(!(SPIE_STATUS &(1<7)); 返回SPIE_DATA; } void setUpADS1259() { PORTF_DIR =(PORTF_DIR | 0b0.0011万);//起始引脚(PF0)输出和重置引脚(PF1)输出。 PORTB_DIR &=~(0b1000万); // DRDY引脚(PB7)输入 PORTF.OUT |= 0x02;//重置引脚高。 _delay_us (100); PORTF.OUT &=~(0b0.0001万);//起始引脚低。 _delay_us (100); //PORTF.OUT ||(0b0.0001万);//起始引脚高。 _delay_us (100); Porte输出|=0b1万;//!CS pin high _delay_us (100); Porte输出&=~0b1万;//!CS pin low _delay_us (100); //发送SDATA命令 spie_data = 0x11; _delay_us ;spie_0000_100字节;spie_data = 0x11;s000s;s1b_100;s000byte_cb ;s0000_100;se_delay 栅极转换模式,3600SPS ([2:0]--> 110) SPIE_DATA = 0b0.011万; _DELAY _US(100); PORTF.OUT |=(0b0.0001万);//起始引脚高。 _delay_us(100); } int main(void) { setUp32Mhz InternalOsc(); setUpSPI(); _Delay_ms(100); setUpADS1259(); uint8_t data = 0x00; 同时(1) {_delay_us(1000);//data = SPI_READ();} }


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    以下是DRDY,SCK和DIN引脚的原理图和示波器读数。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,Amit:

    欢迎来到TI E2E论坛!

    我不太熟悉ATxmega128a3u,所以我建议查看此XMEGA SPI示例代码进行比较: eewiki.net/.../SPI示例,用于XMEGA

    ...他们还会执行其他一些操作,例如在发送SPI字节之前切换/CS引脚,以及清除SPI缓冲区以确保您不读取垃圾数据。


    需要注意的一点是,您的读取数据功能只能在"RDATAC"模式下工作。 如果在调用读取数据函数之前未发送RDATAC命令,则需要发出RDATA命令以对数据进行时钟处理。 但是,在尝试读取数据之前,我建议从读取CONFIG0和CONF1寄存器开始,因为这些寄存器默认为非零值。


    其他一些故障排除建议是探测所有ADS1259引脚(直接)...
    -确保GPIO引脚设置正确。 -设备正在转换,/DRDY正在切换,因此它们看起来是正确的。
    -检查电源电压。 DVDD是3.3V (与您的Atmega数字逻辑电平相同),正确吗?
    -检查/CS引脚是否在正确的时间处于低电平状态(在发送SPI字节之前,保持在低电平状态,直到命令和数据超频)。
    —直接在ADS1259上探测SPI信号-原因是XMEGA输出引脚上可能没有明显的信号完整性问题,但您可能会看到在更靠近ADS1259输入引脚的位置出现振铃。
    如果可以,请尝试保持逻辑分析器或多通道示波器,以便可以同时探测SPI信号。 我看不到你显示的分离信号有任何问题,但同时探测会更容易看到SPI总线上发生的事情。

    此致,
    Chris
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Chris,感谢您的及时回复。
    我目前正在测试您的建议,并将向您提供进一步的更新。

    谢谢