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.

[参考译文] ADS1248:从寄存器读取,是否正确?

Guru**** 2540720 points
Other Parts Discussed in Thread: ADS1248

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

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/604925/ads1248-reading-from-the-registers-is-this-correct

部件号:ADS1248

大家好!

这是我第一次进入除Arduino基础知识之外的嵌入式设备世界,我期待向大家学习。  我目前在CCS中有一个脚本,它从ADS1248模数转换器上的15个寄存器中读取。  我不确定如何解释通过SPI接收的数据,因为每次循环中的数据似乎都随机变化。  是否有人会介意查看我的代码并让我知道我是否做得正确?  下面是我的循环:

void main()

^^^^ init stuff (clk,board,UART,pinmux等

//重置SPI外设
map_PRCMPeripheralReset(PRCM_GSPI);

//在ADS1248 (WFP 1.10 -> P4)
上提取重置引脚MAP_GPIOPinWrite(GPIOA1_base, 0x08, 0xFF);

//提取1.9 起始引脚(<







int i;
unsigned long ul_ADCRawData;
未签名的长ADCReadData;

//重置SPI
MAP_SPIReset (GSPI_BASE);
UtilsDelay(64万);

//配置SPI接口
MAP_SPIConfigSetExpClk (GSPI_BASE,MAP_PRCMPeripheralClockGet (PRCM_GSPI),
SPI_IF_bit_rate,SPI_MODE_MASTER,SPI_SUP_MODE_1,
(SPI_SW_CTRL_CS |
SPI_4pin_mode |
SPI_TURBO关闭|
SPI_CS_ACTIVELOW |
SPI_WL_8);

//启用SPI通信
MAP_SPIEnable(GSPI_base); 
//生成命令(0x20= RReg,从Reg 0开始,0x0E =14)<---用于测试的硬编码
UINT8_t command_a =(0x20 | 0x00);
uINT8_t command_b =(0x0E);
而(1){
	MAP_SPICSDisable(GSPI_base);
	MAP_SPICSEnable(GSPI_base);
	//发送第一个命令字节
	MAP_SPIDataPut(GSPI_base, command_a);
	//阅读以清除
	MAP_SPIDataGet (GSPI_BASE,&UL_ADCRawData);
	//发送第二个命令字节
	MAP_SPIDataPut(GSPI_base, command_b);
	//阅读以清除
	MAP_SPIDataGet (GSPI_BASE,&UL_ADCRawData);
//发送NOP以读取15个寄存器
	对于(i=0;i<16;i++){
		MAP_SPIDataPut(GSPI_BASE,ADS_NOP);
		MAP_SPIDataGet (GSPI_BASE,&UL_ADCRawData);
		ADCReadData =(uint8_t)ul_ADCRawData;
		报告("注册[%i]:%x \n\n\r",i,ADCReadData);
		UtilsDelay(100万);
	}
}
	MAP_SPICSDisable(GSPI_base); 



}

下面是我的一些示例输出:

已接收:0
寄存器[0]: AA
寄存器[1]: 1
注册[2]: 0
寄存器[3]: 27
注册[4]: 0
寄存器[5]: 0
寄存器[6]: 50
注册[7]: 0
寄存器[8]: 80
注册[9]: 52
登记册[10]: 40
注册[11]: 17
注册[12]: FF
寄存器[13]: 0
寄存器[14]: 22

已接收:0
寄存器[0]: 43
注册[1]: 1
注册[2]: 0
寄存器[3]: 0
寄存器[4]: 19
登记册[5]: 0
寄存器[6]: 1B
寄存器[7]: 0
寄存器[8]: 80
注册[9]: 1F
注册[10]: 40
注册[11]: 90
寄存器[12]: 43
登记册[13]: 0
寄存器[14]: 49

已接收:0
寄存器[0]: 13
注册[1]: 1
注册[2]: 0
寄存器[3]: 4D
寄存器[4]: 0
寄存器[5]: 46
登记册[6]: 0
寄存器[7]: 0
寄存器[8]: 3B
登记册[9]: D
寄存器[10]: 40
注册[11]: 2A
寄存器[12]: FF
寄存器[13]: 2B
寄存器[14]: 0 

我是不是这样做?  很难解释这些数据,我不确定是垃圾,错误代码,还是应该这样更改!  如果有任何指导,我们将不胜感激!

非常恭敬,

詹姆斯

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

    /cfc-file/__key/communityserver-discussions-组件文件/73/7823.main.c

    这是main.c文件。

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

    James,


    如果每次读取寄存器时得到不同的值,我会说存在错误。 除非您将新值写入寄存器,否则寄存器不应更改。 您正在获得一些信息这一事实令人鼓舞,因为它确实对沟通做出了回应。 但是,由于您收到的响应不好,这可能意味着需要清理某些内容。

    我首先要说明以下几点:

    首先,发送复位并向上拉起始引脚后,发送SDATAC命令。 通常,当设备处于默认模式时,转换完成后输出数据立即显示在DOUT上。 如果您正在读取寄存器,并且完成了新的转换,则数据将出现在DOUT上,从而中断寄存器读取。 SDATC不会阻止设备进行转换,但会阻止输出数据加载到DOUT。
     
    其次,不要在第一次重置后写入设备,然后再读回所做的更改,而是从重置后读取寄存器开始。 ADS1248具有数据表中列出的默认寄存器设置。 设备重置后,寄存器应包含其默认值,并且它们应保持一致。

    另一个可能的问题是SCLK线路上的噪音。 如果SCLK上有噪音,设备可能会错误读取寄存器。 在SCLK上有噪声时,ADS1248认为已发出SCLK脉冲,并将DOUT移动。 同时,主中继器是后面的SCLK,并读取不同的值。

    最后,我将使用示波器或逻辑分析器来查看SPI通信的结果。 这是验证与设备通信的最佳方式。 您可以准确地看到主设备和设备的输出内容,并检查通信是否清洁。 这将有助于比浏览代码更快地调试所有内容。


    吴若瑟

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

    吴先生

    非常感谢您的回复。  重置后发送SDATAC命令后,每次从寄存器读取时,我都开始得到相同的值(正确的默认值不小于)!

    我很好奇SCLK线可能会有噪音,以便将来参考。  SCLK从位于发射台的WFP 1.7 直接进入ADC的P28。  我是否应该担心未来的噪音?  我应该如何缓解这种情况?

    尊敬的,

    詹姆斯

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


    我很高兴您能够将注册表读取为工作状态。 您似乎正在进行一些良好的测量。

    对于SCLK噪声,良好的接地平面和与SCLK的直接连接不太可能是问题。 通常,您可以通过示波器看到此问题,在示波器中,SCLK线中可能会出现峰值,以响应与其他附近设备的数字通信。 如果存在问题,SCLK上的小电容(和串联电阻)可能会对清除问题有很大的作用。 我想在100nF附近的地方可能会有所帮助。

    祝您好运,使用ADS1248。 如果您有任何其他问题,请随时回复。


    吴若瑟