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.

[参考译文] TMS320F28335:支持与外部从器件的 SPI 通信

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1294886/tms320f28335-support-on-spi-communication-to-the-external-slave-device

器件型号:TMS320F28335

我们 尝试在 F28335器件中进行 SPI 通信、并将数据从 TMS320F28335 SPI (主器件)发送到 Holt 集成电路 HI-35850 (从器件)器件板的外部从器件。

这里、我们已将  TMS320F28335 SPI 器件配置为主器件、将 HI-35850配置 为从器件。

  • 为此、我们 尝试发送32位乘4迭代的 Arinc 数据、因为我们已将 SPICCR.bit.SPICHAR 配置为8位字。  
  • 我们以附件形式捕获并附加了采用 SCLK、MISO、MOSI 和 CS 的4通道 CRO 波形。  但我们无法在波形中看到超过16个时钟、并且芯片选择(CS)被取消置位、但32位需要32个时钟、我们需要您的支持。
  • 为此、我在下面附上了我的 SPI C 代码、以及模块名称 Mcu1_SPI_initialization( )中的初始化和配置。   

#include "Mcu1_Device.h"
#include "Mcu1_Timer.h"
#include "stdio.h"
#include "Mcu1_Arinc429.h"
#include "Mcu1_spi.h"
#include "Mcu1_Arinc429_spi.h"

main (void)
{
  //初始化系统控制:PLL、看门狗
  InitSysCtrl()

  //禁用 CPU 中断
  Dint;
  GPIO_init ();
  InitPieCtrl()

  /*禁用所有中断并清除所有中断标志:*/
   IER = 0x0000
   IFR = 0x0000
   InitPieVectTable()

   /*初始化 GPIO 引脚*/
  InitSpiaGpio()

  /*调用 SPI 初始化*/
    mcu1_spi_initialization()

    /* j 表示索引增量*/
    UNS8j = 0

    /* Tx 数据变量*/
    UNS8Tdata = 0

        SpiaRegs.SPITXBUF = 0x1000
        SpiaRegs.SPITXBUF = 0x2000
        SpiaRegs.SPITXBUF = 0x2000
        for (j=0;j<=19;j++)
        {
        SpiaRegs.SPITXBUF = 0x0E00
        SpiaRegs.SPITXBUF = 0x5500
        SpiaRegs.SPITXBUF = 0x5500
        SpiaRegs.SPITXBUF = 0x5500
        SpiaRegs.SPITXBUF = 0x5500
        Tdata = SpiaRegs.SPITXBUF
        printf ("传输的数据:0x%X\n"、Tdata);
        }

void InitSpiaGpio()
{

  EALLOW;

/*为 GPIO16、GPIO17、GPIO18和 GPIO19启用上拉电阻*/
  GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0 //(SPISIMOA)
  GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0 //(SPISOMIA)
  GpioCtrlRegs.GPAPUD.bit.GPIO18 = 0 //(SPICLKA)
  GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0 //(SPISTEA)

  /* GPIO16、GPIO17、GPIO18和 GPIO19的异步输入*/
  GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3//(SPISIMOA)
  GpioCtrlRegs.GPAQSEL2.GPIO17 = 3//(SPISOMIA)
  GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3//(SPICLKA)
  GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3// (SPISTEA)

  /*配置多路复用器寄存器引脚 GPIO16、GPIO17、GPIO18和 GPIO19 */
  GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1// SPISIMOA
  GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1// SPISOMIA
  GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1// SPICLKA
  GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 1// SPISTEA

  EDIS;

void Mcu1_SPI_initialization()
{

  EALLOW;
  /*启用外设时钟*/
  SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1
  EDIS;

  /* SPI 的配置*/
  / /
  /* SPI 软件复位为0 */
  SpiaRegs.SPICCR.bit.SPISWRESET = 0

  /* SPI 网络模式,作为主站*/
  SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1

  /*启用通话位以启用传输*/
  SpiaRegs.SPICTL.bit.talk = 1

  /*时钟极性为0 */
  SpiaRegs.SPICCR.bit.CLKPOLARITY = 0

  /*时钟相位为0 */
  SpiaRegs.SPICTL.bit.CLK_PHASE = 0

  /* SPI 波特率控制*/
  SpiaRegs.SPIBRR = 0x27   // SPI_BRR

  /* SPI 字符位到8位字*/
  SpiaRegs.SPICCR.bit.SPICHAR = 0x7

  /*通过向该位输入1来清除溢出标志*/
  SpiaRegs.SPISTS.bit.overrid_flag = 1

  /*将 SPIRSWRESET 设置为1 以将 SPI 从复位状态释放*/
  SpiaRegs.SPICCR.bit.SPISWRESET = 1

  / /




请查看我的波形和 SPI 代码附件。  好心建议我,有什么需要纠正。

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

    尊敬的 Chaya:

    请仔细检查 F28335和 HI-35850之间的时钟相位和极性是否一致。 您能否尝试将极性位更改为1? 如果这样不起作用、我只是想确保我拥有所有上下文、F28335的数据的发送/接收中是否涉及任何其他代码? 您在非 FIFO、F28335主模式下操作、没有中断、正确吗?

    此致、

    艾里森

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

    您好!

    1. 是的、我们在非 FIFO 模式下运行。
    2. 主机模式配合使用。
    3. 而没有中断。

    测试环境:

    • 主机系统(TI F28335作为主控制器)单独供电
    • ADK-35850 、HI-35850作为一个整体供电。

     

    主机 SPI 配置(TI F28335):

    • 针对复位状态将 SPI SWRESET 清零、SpiaRegs.SPICCR.bit.SPISWRESET = 0;
    • 主机作为主站、SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;
    • 波特率:500kHz、SpiaRegs.SPIBRR = 0x7F;
    • 发送器启用、SpiaRegs.SPICTL.TALK = 1;
    • 将主机配置为模式-‘0'、SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;、& SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    • 主机 SPI 8位字符、SpiaRegs.SPICCR.bit.SPICHAR = 0x7;
    • 清除溢出标志、SpiaRegs.SPISTS.bit.overrid_flag = 1;
    • 完成这些配置后、将 SPI SWRESET 设置为1、SpiaRegs.SPICCR.bit.SPISWRESET = 1;

     

    主机 SPI 总线引脚配置(TI F28335):

    • 首先、我们启用 GPIO16 (MOSI)、GPIO17 (MISO)、GPIO18 (SCLK)和 GPIO19 (SPISTE)的上拉电阻器。
    • 设置 GPIO16 (MOSI)、GPIO17 (MISO)、GPIO18 (SCLK)和 GPIO19 (SPISTE)的异步输入。
    • 已将 GPIO16配置为 MOSI、GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1;
    • 已将 GPIO17配置为 MISO、GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;
    • 已将 GPIO18配置为 SCLK、GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1;

     

    • 为了始终保持 SPISTE (CS)处于活动状态、将 GPIO19配置为通用 I/O (GPIO)、GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0;
      • GpioDataRegs.GPADAT.bit.GPIO19 = 0;
      • GpioCtrlRegs.GPADIR.bit.GPIO19 = 1;(用于输出)

     

    主机 SPI (TI F28335)和 Holt HI-35850之间的互连:

                   下面提供了测试配置的详细信息、请参阅随附的图-2、图3和图4。

    • 主机 SPI MOSI (GPIO16)<-> HI-3535的串行输入(SI)
    • 主机 SPI MISO (GPIO17)<-> HI-353555的串行输出(SO)
    • 主机 SPI SCLK (GPIO18)<-> HI-3555的串行时钟(SCLK)
    • 主机 SPI SPISTE (GPIO19)<-> HI-3555的芯片选择(CS)

     

    测试传导:

    • 将主机配置为模式-‘0'、SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;、& SpiaRegs.SPICTL.bit.CLK_PHASE = 0;
    • 在 SO 中发送了"0x0A"数据、并且正在等待来自霍尔特板的数据"0x01"的响应
    • 没有。 时钟脉冲的值仅限制为8、即使 CS 继续保持运行状态(请参阅随附的图-1)、并且未从 Holt HI-35850接收到任何数据

     

    查询:

                   阐述以下问题、

    1. 请确认我们的配置是否正确、以便 SPI 在模式"0"下运行?
    2. 请说明为什么不。 的时钟脉冲被限制为8个时钟周期、尽管 CS/处于活动状态?  
    3. 请确认主机 SPI (TI F28335)和 Holt HI-35850之间的连接是否正确?

     

    请求您向我们提供有关如何增加8个以上时钟脉冲以及获取 Holt HI-35850接收数据的支持。

     谢谢。此致、

    查亚  

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

    尊敬的 Chaya:

    非常感谢您提供的有序信息 、非常有帮助。 到目前为止、您的 SPI F28335和 GPIO 配置看起来是正确的。 这是在模式0下运行的正确设置、但我能不能问您是否尝试将极性位设置为"1"? 换句话说、您能否尝试进行测试、唯一的更改是将 F28335的极性设置为"1"、以便 F28335在"模式1"而不是"模式0"下运行? 我在另一个器件和 HI-35850之间发现了一个与此类似的问题、我们希望首先检查这是否可以解决此问题、因为这需要快速更改才能实现。

    请告诉我、这是否能够解决问题、或者您看到的行为不同。

    此致、

    艾里森

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

    大家好。

    感谢您的立即响应。

    根据您的建议、我们也尝试了模式0和其余模式的组合、如下表所示:

    模式

    时钟极性

    时钟相位

    GPIO-19

    0

    0

    0

    通用 I/O

    图1

    0

    0

    0

    CS

    图2

    1

    1

    0

    通用 I/O

    图4

    1

    1

    0

    CS

    图3

    2

    0

    1

    通用 I/O

    图5

    2

    0

    1

    CS

    图6

    3

    1

    1

    通用 I/O

    图8

    3

    1

    1

    CS

    图7

     

    在对组合进行的所有试验中、我们在传输8个不同数据并将其配置为8位字的同时、只能看到波形中只有8个时钟周期。

    请为我们提供支持、帮助我们了解如何查看8个以上的时钟周期。  例如、这里我要传输8个不同的数据、我们希望看到(8位 X 8)连续64个时钟周期、芯片选择(CS)应保持低电平。

     

     

    谢谢。此致、

    查亚

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

    尊敬的 Chaya:

    感谢您提供测试的示波器屏幕截图。 我还想问您是否可以澄清黄色是 SPICLK、绿色是 SPISTE 以及蓝色信号是什么(以及先前示波器截图中的紫色是什么?) 当然。 您是否对这两条数据线路进行范围检查、以确保  在这段时间内从 F28335和 HI-35850的每条线路上发送正确的数据?   

    此外、我看到您将连续几行代码写入 TXBUF 而不中断、您能尝试在两次写入之间添加一些延迟吗? 或者您是否考虑过使用 FIFO 模式?

    另外、是否要在数据传输开始时手动将 SPISTE 引脚设置为低电平、然后在结束时重新设置为高电平? 这将确保您捕获发送数据的时间。

    此致、

    艾里森

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

    您好!

         感谢您的答复。

         我们已经尝试为 TMS320F28335配置了 SPI、现在我们获得了16个时钟周期、芯片选择也与例外一样低。

        我们还有一个关于这一点的疑问、现在我正在集成  TMS320F28335和 HI35850并尝试在主机 SPI (TMS320F28335)和 HI35850之间进行通信、我已将 TMS320F28335配置为模式1和主器件、但我无法看到它们之间的通信。 请帮助我们解决此问题。

    我们对此有一些疑问、能否致电解决此问题。

    如果是、请告诉我您的空闲 时间、以便通过团队进行联系

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

    尊敬的 Chaya:  

    很高兴您解决了这个问题-我想在尝试拨打电话之前澄清几件事:  

    • 您实施了哪些确切的更改来解决该问题? 它是否将时钟模式更改为1? 或者添加代码以先将 STE 拉低、再拉高?
      • 那么、不是8个时钟脉冲、您现在可以连续看到16个没有延迟?
    •  在尝试通信期间、您是否能够提供4条 SPI 线路的示波器截图? (SPICLK、数据线路和 SPISTE)
      • 这在调试 SPI 通信问题时非常有用、因为 如果一个器件或另一个器件不 正确发送或接收、很明显。
      • 我之所以提出这个问题、是因为如果这似乎是一个与 HI35850相关的查询、那么我们应该尽量 与该器件的专家进行联系、因为我对 F28335的掌握程度与此相关。  
    • 我想我可能误解了最初的问题、因为我曾认为您可以在两个设备之间进行通信、但无法传输完整数据-您能否澄清先前发送的图像中的其他示波器通道?

    此致、

    艾里森

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

    大家好。

                   我们正在将 TI 28335处理器板用于我们的其中一个应用,并将此控制器的 SPI 总线用作连接 HI-35850 ARINC-429卡的主机设备。 我们的代码能够通过 HI-35850卡传输 A429数据、并尝试通过使用跳线从外部将发送器环回到其接收器来接收数据

    以下是执行的测试和观察结果:

    • 使用外部跳线将 HI-35850发送器环接到自己的接收器
    • 发送了 ARINC 429数据0x55AAFFC0
    • 读取 HI-35850状态寄存器的状态、并且观察到 RX FIFO 不为空、从而确保数据接收
    • 尝试通过发送操作码0x08h、然后发送虚拟无操作码0x00h、0x00h、0x00h、0x00h、0x00h 来读取 RX FIFO、以便按照 HI-35850用户手册规定的序列读取32位数据
    • 以这种方式读取数据时、我们观察到 RXBUFF 在传输第一个0x00h 后具有数据0x55、在传输第二个0x00h 后 RXBUFF=0xAAh、在传输第三个0x00后 RXBUFF =0xFFh、在传输最后一个0x00h 后 RXBUF = 0xC0h
    • 我们试图将 RXBUFF 值移动到8位数组、以便将它们转换为32位字(RXDAT[I]= RXBUFF、I= 1 t0 4)
    • 在此期间、我们观察到所有4个数组元素都用0x00h 填充
    • 为了改进、我们引入了发送0x00h 之间的小延迟、并观察到仅 RXDAT[1]具有0x55h、而其余3个位置都是0x00h。
    • 我们将 RXDAT 元素的数据类型声明为32位字、并观察到、除了第一个数据读取0x00550000、其余三个数据读取0x00000000。

     

     

    我们在使用 HI-35850卡进行数据传输和接收的过程中只有一步之遥,如果该问题得到解决,我们将100%了解如何使用此卡进行 ARINC 429传输和接收。

     

    请求您的理解和即时支持、以解决数据读取问题。

    谢谢。此致、

    查亚

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

    尊敬的 Chaya:  

    我不熟悉  HI-35850用户手册、但我想澄清您看到的问题:

    如果我理解正确、那么对于发送的四个无操作码、您能够正确发送和接收5个传输(您能确认该数据是所传输的正确数据、并且您在通过 SPI 接收该数据时是否有任何问题?)

    因此、主要问题似乎是读取接收到的数据时出现了问题? 由于您使用8位传输、您是否在接收后对数据进行位移? 您能否共享一些转换为32位字的程序、以便我来看看?

    此致、

    艾里森

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

    您好  

    感谢您的答复、

    现在我们面临着另一个问题、

    今天、我们已尝试了从外部主机 SPI 器件接收数据。  测试观察结果如下:

     

    • 我 尝试通过 TI F28335的 SPI 读取从外部 SPI 器件发送的数据(0x55AACCBBh)。 使用 for 循环将32位作为4字节读取、并尝试将其存储在无符号 int32变量中
    • 在这里、这是我第一次调试和运行代码、我们可以 在 TI F28335器件的 SPI RXBUFF 寄存器中看到全部32位数据。 但是、在将该数据存储为临时(无符号 INT8)变量并将其转换为32位变量时、我获得的数据存储为0x00000000h
    • 第二次执行.exe 时、 在 32bit 变量中只看到3个字节的0x55AACCh
    • 我在下面附上了我的代码、
    • 请求您浏览代码并为我们提供建议、以便正确接收数据

     

    */李启明 /

    #包含 "Mcu1_Device.h"

    #包含 "Mcu1_Timer.h"

    #包含 "stdio.h"

    #包含 "Mcu1_SPI.h"

     

    ( )

     {

       UNS8 I_g;

       /*初始化系统控制:PLL、看门狗*/

        InitSysCtrl();

     

       /*禁用 CPU 中断*/

       Dint;

       /*初始化 GPIO */

    //   GPIO_init ();

    */李启明 /

    /*将 PIE 控制寄存器初始化为默认状态。*/

    /*默认状态是所有 PIE 中断均被禁用且标志置位

      被清除。*/

    */李启明 /

       InitPieCtrl();

       /*禁用所有中断并清除所有中断标志:*/

        IER = 0x0000;

        IFR = 0x0000;

     

    */李启明 /

    /*使用指向 shell 中断的指针初始化 PIE 矢量表

       服务例程(ISR)。*/

    /*这将填充整个表,即使中断

       没有使用过压保护。  这对于调试很有用。*/

    */李启明 /

     

       InitPieVectTable();

       InitSpiaGpio();

       mcu1_spi_initialization();

     

     

    联合国大会议程项目3 /

    /*配置外部 SPI 系统*/

       SpiaRegs.SPITXBUF = 0x01;

       SpiaRegs.SPITXBUF = Transmitting_Data_ 452];

       SpiaRegs.SPITXBUF = Transmitting_Data_ 383];

       SpiaRegs.SPITXBUF = Transmitting_Data_ 454];

    / /

       实现 (i_g=0;i_g<=1000;i_g++)    

        {

     

       }

             Mcu1_SPI_TX ();

    Mcu1_SPI_initialization ()

    {

     

       EALLOW;

       /*启用外设时钟*/

       SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;

       EDIS;

     

       /*启用字符长度控制位,启用 SPI 复位*/

       SpiaRegs.SPICCR.all = 0x0007;

       /*启用 SPI 中断*/

       SpiaRegs.SPICTL.bit.SPIINTENA = 1;

       /*正常 SPI 时钟方案*/

       SpiaRegs.SPICTL.bit.CLK_PHASE = 1;

       /*启用通话位以启用传输*/

       SpiaRegs.SPICTL.bit.talk = 1;

       /* SPI 网络模式,作为主站*/

       SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;

       /* SPI 波特率控制*/

       SpiaRegs.SPIBRR = SPI_BRR;

       /*发送 FIFO 中断级别位设置为2个字*/

       SpiaRegs.SPIFFTX.bit.TXFFIL = 2;

       /*启用 TX FIFO 中断*/

       SpiaRegs.SPIFFTX.bit.TXFFIENA = 1;

       /*TX FIFO 重置*/

       SpiaRegs.SPIFFTX.bit.TXFIFO = 1;

       /*启用 SPI FIFO */

       SpiaRegs.SPIFFTX.bit.SPIFFENA = 1;

       /*TX FIFO 中断清除*/

       SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;

       /*RX FIFO 中断使能*/

       SpiaRegs.SPIFFRX.bit.RXFFIENA = 1;

       /*接收 FIFO 中断级别,生成为2个字*/

       SpiaRegs.SPIFFRX.bit.RXFFIL = 2;     // 2

       /*接收 FIFO 中断清除*/

       SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;

       /*接收 FIFO 复位*/

       SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;

       SpiaRegs.SPICCR.bit.SPISWRESET = 1;

     

       EALLOW;

       /*将 ISR 分配给 SCI TX 中断*/

       PieVectTable.SPITXINTA =&SPI_TX_ISR;

       /*将 ISR 分配给 SCI RX 中断*/

       PieVectTable.SPIRXINTA =&SPI_RX_ISR;

       /*外设初始化,启用 PIE 模块*/

       PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

       /*此处在 PIE 组中启用 SCI RX 中断9*/

       PieCtrlRegs.PIEIER6.bit.intx2 = 1;

       /*此处在 PIE 组中启用 SCI TX 中断9*/

       PieCtrlRegs.PIEIER6.bit.INTx1 = 1;

       EDIS;

     

       /*启用 中断*/

       EINT;

       /*启用全局实时中断 DBgm*/

       ERTM;

       /*打印作为传输开始的声明*/

       printf ("传输\n");

    Mcu1_SPI_TX ( )

    {

       UNSP 32 R Xd_Data = 0;

       UNS8温度= 0;

       UNS16 I=0;

       /*检查发送器是否准备好传输数据*/

       如果 (SpiaRegs.SPIFFTX.bit.TXFFST == 0)

       {

     

           实现 (j_g=0;j_g<=10000;j_g++)       //有意延迟以接收数据;无此延迟仅接收0x00h

           {

     

           }

     

     

    /*数据接收*/

           SpiaRegs.SPITXBUF = 0x0800;      //发送用于读取32位数据的操作码

           实现 (I=0;I<=3;I++)                //读取4字节的循环

           {

               R Xd_Data = R Xd_Data <<8;

               SpiaRegs.SPITXBUF = 0x0000;  //发送虚拟数据而不发送操作码以接收字节数据

               温度= SpiaRegs.SPIRXBUF;    //从0到3个环路读取4个字节

               R Xd_Data = R Xd_Data |温度;    //将每个字节存储到32位变量中

     

           }

           printf ("接收的 RxD 数据:0x%X%X\n"、R Xd_Data);

        }

     

       否则

       {

           /*打印发送器状态*/

           printf ("发送器未就绪\n");

       }

    谢谢。此致、

    查亚

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

    尊敬的 Chaya:

    你可以做的一件事就是启用 SPIPRI 寄存器的"free"和"soft"位- 在运行 CCS 时、诸如轮询存储器、监视窗口、断点等操作会暂时停止 CPU。 此 CCS 活动可能 会 影响您的应用程序的运行。

    您能否确认 8位"Temp"变量在"for"循环的每次迭代中包含正确的数据字节? 也可以 先将数据保存为数组形式 、例如 Temp[i]= SpiaRegs.SPIRXBUF;在调试时检查完整的数组是否正确后、您可以将字节中的位移到 R Xd_Data 中。

    另一个建议是尝试删除打印语句、但由于它们不在 ISR 中、我不认为这会影响您的情况中的任何内容。

    此致、

    艾里森

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

    您好!

     

                   我们通过启用自由位和软位尝试了您提出的任何建议、即使我们也面临同样的问题。  

    • 当我在调试后首次尝试运行代码时、我们无法将数据存储在变量中。  但每当我第二次尝试重新运行代码而不进行调试时、仅重新运行代码时、我们就可以存储数据。
    • 我们还有另一个处理器板(TI F28069)、它具有相同的 SPI 接口。  在两个处理器中、我们都能在寄存器视图中看到 RXBUFF 中的数据。  不过、当我们尝试将数据复制到另一个变量以进行数据处理时、我们得到的数据为0x00h。

                   考虑到我们的项目压力,我们需要尽早解决这个问题,我们从一个多星期以来就面临着这个问题。 我们可以根据您的空闲时间安排呼叫、因此需要您的即时支持来解决此问题。  请告诉我们您的空闲时间以便拨打电话。

    谢谢。此致、

    查亚

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

    尊敬的 Chaya:

    在向外设传输一个字节的数据后、控制器 从 SPIRXBUF 读取数据的速度过快。 这就是为什么你在第一次运行时看到零(因为尚未实际接收到任何数据)、并且在第二次运行时会读取一些剩余数据。 我对解决此问题的建议如下:

    • 发送连续的操作码和四个虚拟无操作码字节(没有在两者之间读取)、以便芯片选择引脚在所有传输期间持续保持低电平。
    • 发送5个字节的数据后:然后、程序中应该有一条检查 RX FIFO 级别状态的线路。
      • 如果接收 FIFO 至少有5个字(来自5次传输)、那么您可以开始从 FIFO 读取数据。
    • 您可以将 FIFO 的第一个字读取到其他一些临时16位变量中以丢弃它。
    • 在读取第一个 RXFIFO 字以丢弃传输操作码后接收到的字节之后、可以使用与现在执行方法类似的方法读取 FIFO 的4个数据字节。
      • 我在这里的建议是将"Temp"保持为16位、无需使用8位(您要接收的8位实际数据将保留在16位中的最低位、因此在下一步中对其进行 OR-ing 将与现在的功能相同)
        • 作为边注、如果您希望、您可以选择在 RXBUF 和0x00FF 之间按位执行"与"运算、以确保高8位中为零、而低8位中仅为数据、但这不是必需的。
      • 您可以继续对每个字节对 R Xd_Data | Temp 执行按位或运算、以创建32位 R Xd_Data

    一般而言、程序应始终在实际读取前检查 RXBUF 中是否存在完整/有效数据。 如果您在传输命令之后直接执行读取命令而不检查有效数据、则控制器的读取速度快于 SPI 实际完成传输的速度、因此数据读取会出现问题。

    这应该会解决它!

    此致、

    艾里森

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

    您好!

                   感谢您的立即响应。  

    考虑到我们的项目压力、我们需要尽快解决此问题、我更愿意与您通话、以更好的方式提出问题。

     

    在我们今天进行的所有试验和提出的意见之后:

    • 我们根据您昨天提供的建议进行了尝试。  方法是连续发送虚拟无操作码、而不在两者之间读取数据。  情况比没有改善情况更糟糕、因为我们只能读取第一个字节、即使我们执行了很多次。
    • 由于我们对读取数据的时序裕度存在疑问、因此我们降低并增加了 SPI 时钟频率(290kHz 至2MHz、而不是更早的400kHz)。  观察结果与昨天相同、我们可以在其中读取16位数据。

     

    请告诉我您是否可以接听电话。

     

    谢谢。此致、

    查亚

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们根据您昨天给出的建议进行了尝试。  方法是连续发送虚拟无操作码、而不在两者之间读取数据。  情况比改善差,因为我们只能读取第一个字节,即使我们执行了很多次。

    这不是建议的那样。 建议是:

            SpiaRegs.SPITXBUF = 0x0800;       // Transmit opcode for reading 32bit data
            SpiaRegs.SPITXBUF = 0x0000;   // Transmit dummy data no opcode in order to receive the byte data
            SpiaRegs.SPITXBUF = 0x0000;   // Transmit dummy data no opcode in order to receive the byte data
            SpiaRegs.SPITXBUF = 0x0000;   // Transmit dummy data no opcode in order to receive the byte data
            SpiaRegs.SPITXBUF = 0x0000;   // Transmit dummy data no opcode in order to receive the byte data
            
            >> You add code here to wait until SpiaRegs.SPIFFRX.RXFFST >= 5
            
            Temp = SpiaRegs.SPIRXBUF; // discard first byte (correspons to data received when opcode was sent)
            
            for(i=0;i<=3;i++)                 // Loop for reading 4 bytes
            {
                RXd_Data = RXd_Data<<8;
                Temp = SpiaRegs.SPIRXBUF;     // Read 4 bytes from 0 to 3 loops
                RXd_Data = RXd_Data|Temp;     // storing each byte into 32bit variable
            }

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

    您好!

                   尽管有我们的跟踪、但我们无法将接收到的数据存储到声明的变量中。  因此、我们强烈认为与您通话是可取的做法、请让我知道您是否可以进行通话。

     

                   为 TI F28335实验套件中的 HI-35850环回测试执行的测试、我们将以[0xE0h、0x11h、0x11h、0xC0h]作为 Arinc 字传输的数据。  当我们接收到数据(无论我们是为了回送数据而传输的还是其他数据)时、我们都能够在 TI F28335的 SI (MISO)系列的示波器中看到相同的数据、具体请参阅 Attachment_1.pdf。  RXBUF 和 RXEMU 寄存器中也有相同的数据、但当我们尝试传输到变量时、会得到不一致的数据。  我们从过去10天开始就一直面临此问题、因此我们请求致电您以澄清此问题。  此外、请查找以下源代码、并请求您提供需要更正的建议。

     

    源码:-

     

    #include "Mcu1_Device.h"

    #include "Mcu1_Timer.h"

    #include "stdio.h"

    #include "Mcu1_spi.h"

     

    UNS16 Transmitting_Data_[452]={0x0A、0x00、0x10、0x20、0x20、 0x0B、0x00、0x00、0x0E、0xE0、 0x11、0x11、0xC0、0x61、0x11、 0xD0、0xC0};

    UNS16 ReceivedData_g[10]={0};

    UNS16 = Transmitted_Data_= 5.120, Dataregister_g = 0;

    UNS16 j_g = 0;

     

    空 main (void)

     {

       UNS8 I_g;

       /*初始化系统控制:PLL、看门狗*/

       InitSysCtrl();

     

       /*禁用 CPU 中断*/

       Dint;

    */李启明 /

    /*将 PIE 控制寄存器初始化为默认状态。*/

    /*默认状态是所有 PIE 中断均被禁用且标志置位

      被清除。*/

    */李启明 /

       InitPieCtrl();

       /*禁用所有中断并清除所有中断标志:*/

        IER = 0x0000;

        IFR = 0x0000;

     

    */李启明 /

    /*使用指向 shell 中断的指针初始化 PIE 矢量表

       服务例程(ISR)。*/

    /*这将填充整个表,即使中断

       没有使用过压保护。  这对于调试很有用。*/

    */李启明 /

     

       InitPieVectTable();

     

       /*初始化 SPI GPIO 引脚*/

       InitSpiGpio();

                   

                   /*调用 SPI 初始化*/

       mcu1_spi_initialization();

     

     

       SpiaRegs.SPITXBUF =(Transmitting_Data_ 452]<<8);

       SpiaRegs.SPITXBUF =(Transmitting_Data_ 383]<<8);

       SpiaRegs.SPITXBUF =(Transmitting_Data_ 54]<<8);

       for (i_g=0;i_g<10000;i_g++)

       {

     

       }

     

             Mcu1_SPI_TX ();

     

    void Mcu1_SPI_initialization()

    {

     

       EALLOW;

       /*启用外设时钟*/

       SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;

       EDIS;

     

       EALLOW;

       /*启用字符长度控制位,启用 SPI 复位*/

       SpiaRegs.SPICCR.all = 0x0007;

       /*启用 SPI 中断*/

       SpiaRegs.SPICTL.bit.SPIINTENA = 1;

       /*正常 SPI 时钟方案*/

       SpiaRegs.SPICTL.bit.CLK_PHASE = 1;

       /*启用通话位以启用传输*/

       SpiaRegs.SPICTL.bit.talk = 1;

       /* SPI 网络模式,作为主站*/

       SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;

       /* SPI 波特率控制*/

       SpiaRegs.SPIBRR = SPI_BRR;

       /*发送 FIFO 中断级别位设置为2个字*/

       SpiaRegs.SPIFFTX.bit.TXFFIL = 2;

       /*启用 TX FIFO 中断*/

       SpiaRegs.SPIFFTX.bit.TXFFIENA = 1;

       /*TX FIFO 重置*/

       SpiaRegs.SPIFFTX.bit.TXFIFO = 1;

       /*启用 SPI FIFO */

       SpiaRegs.SPIFFTX.bit.SPIFFENA = 1;

       /*TX FIFO 中断清除*/

       SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;

       /*RX FIFO 中断使能*/

       SpiaRegs.SPIFFRX.bit.RXFFIENA = 1;

       /*接收 FIFO 中断级别,生成为2个字*/

       SpiaRegs.SPIFFRX.bit.RXFFIL = 2;     // 2

       /*接收 FIFO 中断清除*/

       SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;

       SpiaRegs.SPIPRI.bit.free = 1;

       /*接收 FIFO 复位*/

       SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;

       SpiaRegs.SPICCR.bit.SPISWRESET = 1;

       EDIS;

     

       EALLOW;

       /*将 ISR 分配给 SCI TX 中断*/

       PieVectTable.SPITXINTA =&SPI_TX_ISR;

       /*将 ISR 分配给 SCI RX 中断*/

       PieVectTable.SPIRXINTA =&SPI_RX_ISR;

       /*外设初始化,启用 PIE 模块*/

       PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

       /*此处在 PIE 组中启用 SCI RX 中断9*/

       PieCtrlRegs.PIEIER6.bit.intx2 = 1;

       /*此处在 PIE 组中启用 SCI TX 中断9*/

       PieCtrlRegs.PIEIER6.bit.INTx1 = 1;

       EDIS;

     

       /*启用 中断*/

       EINT;

       /*启用全局实时中断 DBgm*/

       ERTM;

     

    void Mcu1_SPI_TX (void)

    {

       UNS16 I=0;

       UNS32 RX_DATA = 0;

       UNS8 Temp[4]={0};

       UNS16状态= 0;

       UNS8VAR = 0x01;

       /*检查发送器是否准备好传输数据*/

       IF (SpiaRegs.SPIFFTX.bit.TXFFST = 0)

       {

           /*将数据从变量传输到 SPI 缓冲器*/

           for (j_g=8;j_g<=16;j_g++)

           {

                SpiaRegs.SPITXBUF =(Transmitting_Data_ j_g<<8);

           }

           delay();

     

           请执行{

                   for (i=0;i<=1;i++)

                   {

                       SpiaRegs.SPITXBUF =(Transmitting_Data_ I)<<8);

                   }

                   delay();

     

                   状态= SpiaRegs.SPIRXEMU;

               } while ((状态和 VAR)!=0);

           delay();

                                   

           SpiaRegs.SPITXBUF =(0x08<<8);

           for (j_g=0;j_g<=3;j_g++)

           {

                 SpiaRegs.SPITXBUF =(0x00<<8);

                 temp[j_g]= SpiaRegs.SPIRXBUF;

           }

        }

     

       否则

       {

           /*打印发送器状态*/

           printf("transmitter is not ready\n");

       }

       printf ("状态:0x%X\n"、状态);

       printf ("receivedData-1:0x%X\n"、Temp[0]);

       printf("receivedData-2 : 0x%X\n", Temp[1]);

       printf("receivedData-3: 0x%X\n", Temp[2]);

       printf("receivedData-4 : 0x%X\n", Temp[3]);

     

    e2e.ti.com/.../Attachment_5F00_1.pdf

    谢谢。此致、

    查亚

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

    尊敬的 Chaya:

    根据您提供的代码、看起来不像是您实现了我们建议的更改。 我们对您刚发送的最新代码不太了解、因此我们回到了原始代码以获取32位"R Xd_Data "变量、因为我认为获取这些32位数据是您程序的最终目标。

    首先、我想确保您了解 SPI 操作的以下几点:

    1. 您应该 在写入发送 FIFO 来传输数据之前、务必检查发送 FIFO 是否有空间 (我们在代码中添加了这些内容并添加了注释)
    2. 您还应该 在尝试读取接收 FIFO 中的数据之前、务必检查接收 FIFO 中是否有数据  (我们在代码中添加了这些内容并添加了注释)
    3. 每当您通过写入发送缓冲区从主器件传输一个字节的数据时、主器件还将接收一个字节的数据 同时 并将其存储在接收缓冲区中(参见下图以了解进一步的说明、图片参见 HI35850数据表)

    以下是我们经过编辑的代码版本。

    • 注意、我们添加了相应代码、以便根据我的笔记1检查发送 FIFO 状态和接收 FIFO 状态。 和2. 是"是"。
    • 我们还添加了一个代码,用于在您最初在 main ()中传输4个字节后读取和丢弃数据,并在您传输一个字节的 op 代码后读取和丢弃数据。
    • 现在您读取并实际保存在附加程序中的唯一数据是在发送  Mcu1_SPI_TX()中的4个虚拟字节后接收到 的4个字节-然后这些字节将进行组合并存储在  R Xd_Data 中。

    e2e.ti.com/.../hi35850_5F00_f28335.c

    此致、

    艾里森

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

    器件型号:TMS320F28335

    你好,

                   我看到了你们向人们提供的支持之一、他们试图将 HI-35850子板作为外部从器件与配置为主器件的 TMS320F28335进行通信。

    目前、我们还尝试将 HI-35850板作为从设备与配置为主设备的 TMS320F28335进行通信。  至此、我们已成功完成了数据传输。

    从 HI-35850卡成功传送了 ARINC-429后,我们尝试通过其接收器接收数据,方法是通过将其 TX 线连接至其 RX 线从外部环回发送器。  但在这里,我们面临的问题是从 HI-35850 ARINC 接收器的数据接收。  我简单介绍了我进行的测试和观察如下:

     

    • 使用外部跳线将 HI-35850发送器环接到自己的接收器
    • 发送了 ARINC 429数据0xE01111C0
    • 读取 SR 寄存器的状态并且观察到 RX FIFO 不为空
    • 为了读取32位数据、尝试通过发送操作码0x08h、然后发送虚拟无操作码0x00h、0x00h、0x00h、0x00h、0x00h 来读取 RX FIFO
    • 以这种方式读取数据时、我们观察到 RXBUFF 在传输第一个0x00h 后具有数据0xE0、在传输第二个0x00h 后 RXBUFF=0x11h、在传输第三个0x00后 RXBUFF =0x11h、在传输最后一个0x00h 后 RXBUF = 0xC0h。  
    • 我们试图将 RXBUFF 值移到8位/16位数组中、以便将其转换为32位字(Temp[j_g]= RXBUFF、I= 0至3)。  我们在此针对8位字符字(SPICCR.bit.SPICHAR = 0x7h)进行了配置。
    • 在此期间、我们观察到所有4个数组元素都用0x00h 填充。  但我们能够在 RXEMU 和 RXBUF 寄存器中看到数据。  我通过连接到 TMS320F28335控制器的 SI 线路(MISO)、在示波器中捕获了接收到的 ARINC 数据的波形、请参阅 Attachment_1.pdf 文件。

     

    这里、我将从 HI-35850向后附加用于 TMS320F28335配置的源代码、用于外部环路的数据传输和数据接收代码。  请浏览代码并向我们建议需要进行的所有更正。

     

    源码:

     

    #包含 "Mcu1_Device.h"

    #包含 "Mcu1_Timer.h"

    #包含 "stdio.h"

    #包含 "Mcu1_SPI.h"

     

    /*全局变量*/

    UNS16 Transmitting_Data_[4512]={0x0A00, 0x0000, 0x1000, 0x2000, 0x2000, 0x0B00、0x0000、0x0000、0x0E00、0xE000、 0x1100、0x1100、0xC000};

    UNS16 j_g = 0;

    ( )

    {

       UNS8 I_g;

       /*初始化系统控制:PLL、看门狗*/

       InitSysCtrl();

     

       /*禁用 CPU 中断*/

       Dint;

       /*初始化 GPIO */

       GPIO_init ();

    */李启明 /

    /*将 PIE 控制寄存器初始化为默认状态。*/

    /*默认状态是所有 PIE 中断均被禁用且标志置位

      被清除。*/

    */李启明 /

       InitPieCtrl();

       /*禁用所有中断并清除所有中断标志:*/

        IER = 0x0000;

        IFR = 0x0000;

     

    */李启明 /

    /*使用指向 shell 中断的指针初始化 PIE 矢量表

       服务例程(ISR)。*/

    /*这将填充整个表,即使中断

       没有使用过压保护。  这对于调试很有用。*/

    */李启明 /

     

       InitPieVectTable();

       /*呼叫计时器配置*/

       // Timer0_config ();

       /*调用 SPI 初始化*/

       mcu1_spi_initialization();

       /*初始化 SPI GPIO 引脚*/

       InitSpiGpio();

     

       SpiaRegs.SPITXBUF = 0x0100;

     

       SpiaRegs.SPITXBUF = Transmitting_Data_ 452];

       SpiaRegs.SPITXBUF = Transmitting_Data_ 383];

       SpiaRegs.SPITXBUF = Transmitting_Data_ 454];

       实现 (I_g=0;I_g<10000;I_g++)

       {

     

       }

       

    Mcu1_SPI_TX ();

     

    Mcu1_SPI_initialization ()

    {

     

       EALLOW;

       /*启用外设时钟*/

       SysCtrlRegs.PCLKCR0.bit.SPIAENCLK = 1;

       EDIS;

     

       /*启用字符长度控制位,启用 SPI 复位*/

       SpiaRegs.SPICCR.all = 0x0007;

       /*启用 SPI 中断*/

       SpiaRegs.SPICTL.bit.SPIINTENA = 1;

       /*正常 SPI 时钟方案*/

       SpiaRegs.SPICTL.bit.CLK_PHASE = 1;

       /*启用通话位以启用传输*/

       SpiaRegs.SPICTL.bit.talk = 1;

       /* SPI 网络模式,作为主站*/

       SpiaRegs.SPICTL.bit.MASTER_SLAVE = 1;

       /* SPI 波特率控制*/

       SpiaRegs.SPIBRR = SPI_BRR;

       /*发送 FIFO 中断级别位设置为2个字*/

       SpiaRegs.SPIFFTX.bit.TXFFIL = 2;

       /*启用 TX FIFO 中断*/

       SpiaRegs.SPIFFTX.bit.TXFFIENA = 1;

       /*TX FIFO 重置*/

       SpiaRegs.SPIFFTX.bit.TXFIFO = 1;

       /*启用 SPI FIFO */

       SpiaRegs.SPIFFTX.bit.SPIFFENA = 1;

       /*TX FIFO 中断清除*/

       SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;

       /*RX FIFO 中断使能*/

       SpiaRegs.SPIFFRX.bit.RXFFIENA = 1;

       /*接收 FIFO 中断级别,生成为2个字*/

       SpiaRegs.SPIFFRX.bit.RXFFIL = 2;     // 2

       /*接收 FIFO 中断清除*/

       SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;

       /*接收 FIFO 复位*/

       SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;

       SpiaRegs.SPIPRI.bit.free = 1;

       SpiaRegs.SPICCR.all = 0x0087;

     

       EALLOW;

       /*将 ISR 分配给 SCI TX 中断*/

       PieVectTable.SPITXINTA =&SPI_TX_ISR;

       /*将 ISR 分配给 SCI RX 中断*/

       PieVectTable.SPIRXINTA =&SPI_RX_ISR;

       /*外设初始化,启用 PIE 模块*/

       PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

       /*此处在 PIE 组中启用 SCI RX 中断9*/

       PieCtrlRegs.PIEIER6.bit.intx2 = 1;

       /*此处在 PIE 组中启用 SCI TX 中断9*/

       PieCtrlRegs.PIEIER6.bit.INTx1 = 1;

       EDIS;

     

       /*启用 中断*/

       EINT;

       /*启用全局实时中断 DBgm*/

       ERTM;

    Mcu1_SPI_TX ( )

    {

       UNS16 I=0;

       UNS16 Temp[4]={0};

       UNS16状态= 0;

       UNS8VAR = 0x01;

       /*检查发送器是否准备好传输数据*/

       如果 (SpiaRegs.SPIFFTX.bit.TXFFST == 0)

       {

           /*将数据从变量传输到 SPI 缓冲器*/

           实现 (j_g=8;j_g<=12;j_g++)

           {

                SpiaRegs.SPITXBUF = Transmitting_Data_ j_g];

           }

     

           实现 (j_g=0;j_g<=10000;j_g++)

           {

     

           }

           实现 (I=0;I<=1;I++)

           {

               SpiaRegs.SPITXBUF = Transmitting_Data_ i;

           }

           实现 (j_g=0;j_g<=10000;j_g++)

           {

     

           }

           状态= SpiaRegs.SPIRXEMU;

           如果 ((状态和 VAR)=0)

           {

           SpiaRegs.SPITXBUF = 0x0800;

     

           实现 (j_g=0;j_g<=3;j_g++)

           {

               SpiaRegs.SPITXBUF = 0x0000;

               temp[j_g]= SpiaRegs.SPIRXBUF;

           }

     

     

           }

           否则

           {

               printf ("RX FIFO 不为空\n");

           }

        }

     

       否则

       {

           /*打印发送器状态*/

           printf ("发送器未就绪\n");

       }

       printf ("状态:0x%X\n",状态);

       printf ("receivedData-1:0x%X\n"、Temp[0]);

       printf ("receivedData-2:0x%X\n"、Temp[1]);

       printf ("receivedData-3:0x%X\n"、Temp[2]);

       printf ("receivedData-4:0x%X\n"、Temp[3]);

     

     

    e2e.ti.com/.../1122.Attachment_5F00_1.pdf

    谢谢。此致、

    查亚

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

    尊敬的 Chaya:

    由于此帖子与您正在进行的另一个讨论类似、因此我将连接这两个对话。

    此外、如果您希望联系您在上面标记的人员、建议您 离线联系他们。

    艾什瓦里亚

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

    您好!

    感谢您帮助我们按照您建议的步骤操作。 现在我们可以读取数据了。

    谢谢。此致、

    查亚  

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

    您好!

                   感谢您在2023年12月14日的答复。

     

    • 我们在规范中实施了您的建议、并观察到我们能够从 HI-35850发送和接收 Arinc429数据。
    • 我们将 HI-35850发送器和接收器连接到外部装置(Ballard USB Arinc429卡),并能够交换数据。
    • 我们的要求是将2个 HI-35850板连接到采用主-从配置的 TI 处理器 SPI。
    • 为了实现这一点、我们将 GPIO19 (SPISTE)配置为通用 I/O (GPAMUX2.bit.GPIO19 = 0)。
    • GPIO19被配置为输出模式、在数据交换之前就在其中写入逻辑‘0'、并在数据交换后变为逻辑‘1'。 (下面附有源代码)。
    • 以下是我们的观察:
      • 最初、我们在通信开始前将 GPIO19设为低电平、并在通信完全完成后将 GPIO19设为高电平。  在此配置中、我们无法交换数据(请参阅随附的源代码1)。
      • 我们对代码进行了如下修改、对于发送的每个命令字、都必须在命令传输前将 GPIO19设为低电平、在命令传输后将其设为高电平。  仅当每个命令字之间给出了 LOW 和 HIGH 时、该器件才会工作。
      • GPIO19始终保持低电平、即使我们的源代码将其设为高电平用于上述两项测试。

     

    需要您澄清如何通过控制用于芯片选择(nCS)功能的 GPIO 引脚来改进用于将 TI 控制器的 SPI 连接到2个从器件的代码。

    e2e.ti.com/.../SPI_5F00_GPIO19_5F00_code.txt

    此致、

    查亚

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

    尊敬的 Chaya:

    将来、请尝试为单独的问题创建单独的主题(您始终可以链接到该主题以提供上下文)。

    这听起来像是一个 GPIO 复用/配置问题。 首先、澄清一下、您是否正在尝试与2个单独的 HI-35850板进行通信? 如果需要、则需要具有两条单独的芯片选择线(每个器件一条)。 我目前只在您的代码中看到 GPIO19被用作芯片选择、您能帮助解释一下当前 GPIO 设置的上下文吗?

    您是尝试将 GPIO19用作手动芯片选择引脚、还是尝试将其用作专用的 SPISTE 引脚?

    • 当将其用作手动片选时、您会将其设置为常规 GPIO ( GPAMUX2寄存器中的 GPIO 19位= 00)和 输出(GPADIR 寄存器中的 GPIO19位= 1) 在通信前后使用 GPADAT 寄存器手动将0和1写入
    • 当将其用作专用 SPISTE 引脚时、您可以将设置 为 SPISTEA (GPAMUX2位= 00)、并且它应自动以 SPI 通信进行切换(无需手动写入)

    我还能问为什么 Mcu1_SPI_GPIO_High ()和 Mcu1_SPI_GPIO_Low ()中的 gpioctrlregs 行之间存在延迟 ?

    另一个需要检查的事项是确保您了解 HI-35850板的预期内容-某些器件在字传输之间进行芯片选择活动时尤为突出。 您是否已查看该器件的时序要求以确保满足这些要求?

    此致、

    艾里森