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 的 SPI

Guru**** 1646690 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/641647/ccs-rm48l952-spi-with-external-adc

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

工具/软件:Code Composer Studio

大家好、

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

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

>相关系统组件

--> 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 线路连接在一起

---- >GIOA_5        -> CONVST -> 所有3个 ADC 的 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 模块设置为主和从、并在两个模块之间发送数据(外部回送)的概念相同。 我的直觉是错误的、或者我尝试执行我的想法是错误的-目前还不确定。

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

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

    ADC 数据转换的最小延迟为30ns。 delay_cycles (1)是否足够长以便 ADC 完成数据采样和转换?
    最大数据长度(SPI)为16位、ADC 数据长度为22位、因此我建议您使用11位 SPI 数据长度。
    如果 WDEL 被置位、等待延迟将在两个传输之间应用(每个传输11位)。 我不建议使用 WDELAY。
    4.您可以尝试多缓冲模式吗?