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/TMS320F28377S:如何将通过 SPI MISO 线路传输的4个实时数据(字节)保存为四个不同的变量?

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/589453/ccs-tms320f28377s-how-to-save-4-real-time-data-bytes-coming-over-spi-miso-line-into-four-distinct-variables

器件型号:TMS320F28377S
主题中讨论的其他器件: C2000WARE

工具/软件:Code Composer Studio

您好!

我正在从事 TMS320F28377和第三方嵌入式硬件之间的 SPI 通信。

目前对 TI 板和第三方硬件之间的浮点编号交换非常感兴趣。 第三方硬件仅具有发送和接收8位(1字节)的限制。

因此、我已经将 float 转换为 char、 我将从 TI 向第三方硬件发送4个字节、我将从第三方硬件向 TI 接收4个字节。

在 TI 端、我在16位 SPIRXBUF 中一个接一个地接收4个字节。 这些字节被覆盖、所以我的问题是如何在 SPIRXBUF 中被覆盖前将其保存一个字节。

可以有人帮助解决此问题吗?

此致、

Narayani

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

    您是否在 SPI 上启用了 FIFO? 在覆盖任何数据之前、您可以在 SPI 中存储最多16个16位字。 有关 FIFO 的更多信息、请参阅 TRM 以及 C2000ware 中的示例。 我将介绍您使用的基本配置和用法。

    将具有 RX FIFO 的 SPI 配置为在4个字时中断。 确保 TXFIFO 已启用、以便您可以写入多个字、并让 SPI 在无需 CPU 干预的情况下发送这些字。

    无论何时您准备好接收来自从设备的数据。 您可以将4个字写入 SPITXBUF 并继续执行其他操作。 一旦 SPI 接收到4个完整字、CPU 将被 SPI 中断。 您可以通过读取 SPIRXBUF 4次并将8位数据存储/打包到数组中来获取 RXFIFO 的内容。

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

    Mark、您好!

    我尝试了您建议的解决方案。 我将 SPIFFRX 内容配置为0x0A2A (即 RXFFST 和 RXFFIL 配置为10h、接收 FIFO 有16个字、 这是最大值)、在 RXFIFO ISR 中、我正在读取 SPIRXBUF 4次(可能是我所做的错误)、但仍然无法获得4个字节。

    我已禁用 TXFIFO 模式。 一旦我接收到 RXBUF 中的数据,我就会将其发送回 void main()中的第三方硬件。 我在另一侧接收适当的字节。 那么、根据您的建议、我是否需要将 TX 配置为 FIFO 模式? 我随附的代码将使您清楚地了解我的疑虑。


    #include "F28x_Project.h"
    #include "stdio.h"

    uint32 RDATA[2];    //接收数据缓冲区
    char *PTR_RDATA;    //接收数据缓冲区
    uint16 RDATA_POINT; //跟踪我们的位置
    字符 res[20];
    float n=8.6857;
    unsigned char *chptr;
    unsigned char *chptr1;
    unsigned char *chptr2;
    unsigned char *chptr3;
    unsigned char *chptr4;
    unsigned char arr[4];
    unsigned char TempBuf = 0;
    uint32 TempBuf1_Rx;


    中断 void spiTxFifoIsr (void);
    中断空 spiRxFifoIsr (void);
    void delay_loop (void);
    void SPI_Fifo_init (void);
    void error();


    void main (void)


      uint16 i;

     InitSysCtrl();

      InitSpiaGpio();

      Dint;
      IER = 0x0000;
      IFR = 0x0000;
      uint16计数;

      InitPieCtrl();

      InitPieVectTable();

      EALLOW;  
      PieVectTable.SPIA_RX_INT =&spirxFifoIsr;
      PieVectTable.SPIA_TX_INT =&spTxFifoIsr;
      EDIS;   

      SPI_Fifo_init();  //仅初始化 SPI

      PieCtrlRegs.PIECTRL.bit.ENPIE = 1;    
      PieCtrlRegs.PIEIER6.bit.INTx1 = 1;    
      PieCtrlRegs.PIEIER6.bit.INTx2 = 1;    
      IER = 0x20;                             
      EINT;                                 


      for (;;)
      {
             if (RDATA[0]!= 0)
             {
               int i=0;
               SENSOR[0]=(float) RDATA[0]* 8.6857;
               //sensor[0]=(float) RDATA[0]*1;
               chptr=(unsigned char *)传感器(sensor);
               //字节、按字节传输
               while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
               TempBuf =((* chptr)& 0x0000);
               SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
               delay_loop();
               while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
               TempBuf =((* chptr)<< 8 & 0x0000);
               SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
               //delay_loop();
               while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
               TempBuf =(*(chptr + 1) & 0x0000);
               SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
               //delay_loop();
               while (SpiaRegs.SPISTS.bit.BUFFULL_FLAG);
               TempBuf =(*(chptr + 1)<< 8 & 0x0000);
               SpiaRegs.SPITXBUF =(uint16_t) TempBuf;//< 8)& 0xFF00;
             }
     }





    void delay_loop ()

       长 I;
       对于(i = 0;i < 1000000;i++){}



    空错误(空)

       asm ("    ESTOP0"); //测试失败!!! 停下来!
       适用于(;);


    void SPI_Fifo_init()

     
       SpiaRegs.SPIFFTX.bit.SPIRST = 0;
       SpiaRegs.SPIFFTX.ALL = 0x0000;    
       //SpiaRegs.SPIFFTX.ALL = 0xC022;       
       SpiaRegs.SPIFFRX.ALL = 0x0A2A;
       SpiaRegs.SPIFFRX.bit.RXFFST=A;
       SpiaRegs.SPIFFCT.all = 0x00;

       //SpiaRegs.SPIFFTX.bit.TXFIFO=1;
       SpiaRegs.SPIFFRX.bit.RXFIFORESET=1;

       SpiaRegs.SPIFFTX.bit.SPIRST = 1;

       InitSpi();




    /*中断 void spiTxFifoIsr (void)

       uint16 i;
       SpiaRegs.SPITXBUF=sdata[0];
     

     for (i=0;i<2;i++)                   
       {
          sdata[i]= sdata[i]+5;
       }

       SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;
       PieCtrlRegs.PIEACK.All|=0x20;      //
    }*/


    中断空 spiRxFifoIsr (空)

       uint16 i=0;


       RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
       chptr1 =(unsigned char *)&RDATA[0];
       RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
       chptr2 =(unsigned char *)&RDATA[0];
       RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
       chptr3 =(unsigned char *)&RDATA[0];
       RDATA[0]=((SpiaRegs.SPIRXBUF)& 0x00FF);
       chptr4 =(unsigned char *)&RDATA[0];



         //SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; //清除溢出标志
       SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中断标志
       PieCtrlRegs.PIEACX.All|=0x20;      //发出 PIE ACK

    谢谢、此致、

    Narayani

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

    很抱歉耽误你的时间。 是的、您可以启用 TXFIFO、以便以 SYSCLK 的速度向 FIFO 写入4个字、并让 SPI 以 SPICLK 的速率处理发送/接收。 这将释放 CPU 以处理其他事情、直到触发 RX FIFO ISR。

    几个问题-
    您是否自行解决了问题?
    您的数据流应该是什么样的? 恒定的数据流? 按需、4字节突发?
    您需要在下一个字节上回显每个字节、还是突发类型的回显(接收4个字节、然后回显4个字节)。
    F28377S 是主器件还是从器件?

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

    Mark、您好!

    我实际上解决了这个问题。

    是的、我的数据流应该看起来像是两个平台之间的浮点数据交换。 当我使用 SPI 通信时、我将浮点转换为4字节字符。

    它不是恒定的数据流、它在每个时钟周期中都会发生变化。 我不想回显字节。 在我的案例中、F28377S 是从器件。

    现在、我的下一个挑战是、4个字节可以获取00到 FF (0到255)之间的任何值。 我的虚拟字节也可以是0到255之间的任何值。 为了我的目的,我把它当作255。 如果我不发送和接收虚拟字节、我将无法按正确的顺序收集4个字节。 如果序列受到干扰、浮点值将发生变化、这将导致错误。 那么、任何人能不能帮助我如何接收适当的4个字节而不使用任何虚拟字节、或者任何其他想法也会有帮助。 为了更好地理解、我附加代码的虚拟字节条件。

    中断空 spiRxFifoIsr (空)


       RByte =(无符号字符)(SpiaRegs.SPIRXBUF & 0x00FF);

       如果(RByte ==255)
          cnt1 = 0;
       否则(RByte !=255 & cnt1<=3)
       {
          String2[cnt1]= RByte;//(unsigned char)(SpiaRegs.SPIRXBUF & 0x00FF);
          cnt1 = cnt1+1;

       }


       //SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1; //清除溢出标志
       SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1; //清除中断标志
       PieCtrlRegs.PIEACX.All|=0x20;      //发出 PIE ACK

    在上述条件下、如果除虚拟字节之外的4个字节中的任何一个字节、则该条件失败、如果我忽略该条件、则会干扰 string2[cnt1]数组中的序列。 因此、请建议一些解决方案。 这是 ISR 下的一段代码。 我在以前的帖子中附加的 REST 代码。

    提前感谢、

    Narayani