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.

[参考译文] CCS/RM48L952:从外部 ADC 获取数据时遇到问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/641694/ccs-rm48l952-trouble-getting-data-from-external-adc

器件型号:RM48L952
主题中讨论的其他器件:HALCOGENADS8922B

工具/软件:Code Composer Studio

您好!  

我目前正在处理一个项目、目前我遇到了一个问题、该问题已使我的进度停止。

上下文:我之前尝试过发布此内容、但遇到了一些奇怪的错误、因此这里尝试了#3。

首先、一些可能有助于故障排除的详细信息:

>相关系统组件:

--> CCSv7

--> HALCoGen v4.07

--> RM48

--> ADS8922B

>我要实现的目标的基本概述:

-->使用 RM48从菊花链配置中获取 ADC 转换

-->将转换存储在 microSD 卡上

 

>当前设置/配置:

->MIBSPI1/SPI1模块连接到 ADC 菊花链(这将是我用于向 ADC 发送数据/从 ADC 接收数据的模块)

---- >我使用的菊花链拓扑直接来自 ADS892xB 数据表;已经过验证

--> SPI 模块的波特率设置为400kHz

->NCS[3]配置为 GIO 以进行位拆裂(其余 SPI 引脚为 SPI 功能)

->MIBSPI1/SPI1模块引脚映射:

        RM48引脚           ->  ADC 引脚 -> 简要详细信息

---- 根据            数据表、>MIBSPI1NCS_3 -> NCS ->所有3个 ADC 的 NCS 线路连接在一起

---- >MIBSPI1SIMO   -> SDI          -> SIMO 线连接到菊花链中第一个 ADC (x 轴)的 SDI 引脚

---- >MIBSPI1SOMI   -> SDO-0     -> SOMI 线连接到菊花链中最后一个 ADC (z 轴)的 SDO-0引脚

---- 根据              数据表、>MIBSPI1CLK -> SCLK ->所有3个 ADC 的 SCLK 线路连接在一起

---- 根据                数据表、所有3个 ADC 的>GIOA_5 -> CONVST -> CONVST 线路连接在一起

---- >每个 ADC 的每个 nRST 和 RVS 引脚都连接到 GPIO

问题:  

我一直使用 Saleae 逻辑分析仪来观察相关 SPI 线路之间的通信。 我目前能够查看和验证我正在发送的数据。 我还不断从菊花链中获得某种垃圾数据响应("垃圾"意味着我目前没有将信号馈送到 ADC 进行转换、因此我得到的响应是随机值)。 我现在要做的只是成功地将我正在获取的"垃圾"存储到缓冲区中。 我正在使用 spiTransmitAndReceive()函数发送/接收数据。 **正在发送源缓冲区数据并已进行验证,但目标缓冲区最终全部为1 (这通常表示没有连接),而不是在 MISO 行上看到的内容**。

我的测试代码:

int main (空)

/*用户代码开始(3)*/

    /*启用中断请求*/

    _enable_IRQ ();

 

    /*模块初始化*/

    rtiSetup();//初始化 RTI 模块

    PinLeets();//初始化 ADC 引脚电平

    sciInit();//初始化 SCI (UART)模块

    mibspiInit();//初始化 MibSPI 模块

    spiInit();//初始化 SPI 模块

    gioInit();//初始化 GIO 模块

    adcInit();//初始化 ADC 模块

 

    /*定义 CONVST 位*/

    uint32 CONVST = 5;

 

    //

    //开始与 SPI 兼容的代码

    //

    spiDAT1_t CONFIG1;

 

    CONFIG1.CS_HOLD = false;

    CONFIG1.WDEL = true;

    CONFIG1.DFSEL = SPI_FMT_0;

    CONFIG1.CSNR = SPI_CS_3;

 

    /*发送 NOP 命令以提供22*N (66)个周期*/

    /*有关可接受命令的表,请参阅数据表*/

    //TODO:验证尝试接收数据时是否应发送

    UINT16 NOP[6]={0};

 

    /*接收缓冲器*/

    uint16 rxBuff[6]={0};

 

    /*启动 UART 终端用户界面*/

    // TexIn_UI();

 

    while (1)

    {

        /*数据传输测试*/

        /*------------ *

        /*转换数据*/

        //将 CONVST 拉为高电平以启动转换

        gioSetBit (gioPORTA、CONVST、1);

 

        //延迟

        _delay_cycles (1);

 

        //拉 CONVST LO 以停止转换

        gioSetBit (gioPORTA、CONVST、0);

 

        //延迟

        _delay_cycles (10);

 

        /*------------ *

        /*[F]*/

        /*直接从数据表中删除第29-30页*/

        // 1)将 CS 拉低以启动数据传输帧

        // CS -> LO

        gioSetBit (spiPORT1、SPI_PIN_CS3、0);

 

        // 2)提供22*N 时钟,其中 N 是菊花链中的设备数

        //发送66位数据

        // 11位突发

        //使用 spiTransmitAndReceiveData()????

        TransmitAndReceiveData (spiREG1、&config1、6、NOP、rxBuff);

 

        // 3)将 CS HI 拉至结束数据传输帧

        // CS ->高

        gioSetBit (spiPORT1、SPI_PIN_CS3、1);

 

        // 4)延迟

        _delay_cycles (10);

    }

 

/*用户代码结束*/

问题:

> while (1)循环中的代码是否预计会导致循环每次迭代的单次转换? (时间可能是个问题?)

>完成单次转换后,如何将该数据存储到接收缓冲区(rxBuff)中?

>尝试从外部设备接收数据时是否需要中断? 或者,为了成功接收数据,我是否只能使用 POLLING 函数 spiTransmitAndReceiveData()?

总之:

>我将使用默认的 ADC 配置(到目前为止、如有必要、可能会更改)

>我已验证发送的数据符合我的预期

>我从菊花链中获得某种类型的响应(正如萨莱阿所观察到的)。 然而、这个数据还未被验证、并且我没有成功地将数据存储到接收缓冲器中

我不能确定我现在所遗漏的是什么。 我的直觉告诉我、与外部 ADC 交谈的概念与将两个 SPI 模块设置为主和从、并在两个模块之间发送数据(外部回送)的概念相同。 我的直觉是错误的、或者我尝试执行我的想法是错误的-目前还不确定。

一如既往、感谢您的参与和考虑!

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

    我不太了解 ADS8922B。 如果 while (1)循环中的延迟满足 ADS8922B 数据表中的延迟要求、则应正常工作。 ADS 中的缓冲器长度为22位、SPI 配置中使用的 CHARLEN 是多少?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    CHARLEN 设置为11位(最大值为16)。 此外、要使用 ADS8922B 成功传输数据帧、我必须提供22*N 个时钟周期(N 是菊花链中 ADC 的数量)。 根据我的理解、这意味着如果我想成功发送/接收全部3个 ADC 的数据、我需要将 CS 设置为低电平、然后提供66个时钟周期。 但是、再说一次、我可以看到 ADC 发送的数据。 我的问题是,我正在努力获取该数据并将其存储到 rxBuff 中。

     

    这是我在萨莱阿看到的一个例子:

    通道0 -> CS

    通道1 -> SOMI

    频道2 -> SIMO

    通道3 -> CLK

    通道4 -> CONVST

    通道5、6和7是连接到 ADC nRST 引脚的 GPIO

    这就是我最终在 rxBuff 中存储的内容:

    理论上、rxBuff 应改为使用在 SOMI 线上观察到的值进行填充。 在这种情况下,rxBuff 应该是:

    rxBuff[0]= 1952  ->  0x7A0  ->  11110100000

    rxBuff[1]= 1744  ->  0x6D0  ->  11011010000

    rxBuff[2]= 124   ->  0x07C  ->  000011100

    rxBuff[3]= 768   ->  0x300  ->  01100000000

    rxBuff[4]= 7      ->  0x007  ->  00000000111

    rxBuff[5]= 1728  ->  0x6C0  -> 11011000000

    情况并非如此。 我缺少什么?