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.

[参考译文] TMS570LS0432:TMS570 SPI 处于中断模式

Guru**** 2439560 points
Other Parts Discussed in Thread: TMS570LS0432

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/624112/tms570ls0432-tms570-spi-in-interrupt-mode

器件型号:TMS570LS0432

您好!
我使用的是 TMS570LS0432 Hercules 微控制  器、因为我在中断模式下使用 SPI 协议、我已经按照 example_spi_master_slavee2e.ti.com/.../4442.example_5F00_spi_5F00_Master_5F00_Slave.c 文件中规定的过程通过代码生成器设置了所有参数。


电机会
SendspiAndGetData();然后再次
SendspiAndGetData()


我没有从我的从器件获取正确的数据、但当我将上述代码更改为时


SendspiAndGetData();
while (SpiRxStatus (spiREG3)=1);
SendspiAndGetData();
while (SpiRxStatus (spiREG3)=1);


然后、我将从我的从器件获取正确的数据。
但由于 spiSendAndGetData()之后的 while 循环;SPI 通信需要更多的时间,这对我们的应用不正确
请给我任何提示、如果我做错、请纠正我...
正在等待您的回复。

提前感谢..

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您开始使用的示例设置了两个 SPI、一个作为主器件、另一个作为从器件。 这两个调用是针对不同的 SPI。 虽然您没有使用代码中的参数包括实际调用,但它看起来就像您使用相同的 SPI (SPI3)调用 spSendAndGetData()两次一样。 此函数设置缓冲器以执行多个传输。 它使用静态结构来跟踪状态。 如果您第二次调用函数、在第一个缓冲区完全发送之前、它将覆盖静态结构、中止第一个传输块。

    您可以将缓冲区合并为单个缓冲区并调用 spiSendAndGetData(),也可以使用 spiEndNotification()回调函数(仍在中断例程中)创建自己的队列,以在队列中加载下一个传输块。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速回复、

    现在、让我澄清一下、我在 TMS570 (主控)微控制 器侧仅使用一个 SPI3端口、而在从控制器侧、我不使用 TMS570的另一个 SPI 端口。 我只是将 SPI 数据从 TMS570传输到我的从器件、每次传输时、我都会从从器件读取数据。

    另一件事是抱歉、我没有提到上面 SPI 的参数、但在我的代码中、我传递了5个参数。

    我希望在 RTI 定时器中断模式下每10ms 传输一次 SPI 数据、但无法从器件获取正确的数据。

    以及如何编写 spiEndNotification()回调函数。  

    如果 您能提供帮助、我将不胜感激

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您每10ms 传输一次 SPI 数据是一个帧(8位还是16位)吗? 是否在继续之前等待传输完成、或者是否在接收到新数据时需要中断? 你越清楚地描述你要做的事情、我的建议就越好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在传输8位数据。 我只想在 RTI 定时器中断例程中每10ms 发送和接收一次 SPI 数据、而在另一次主循环将执行一个任务。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、SPI 的工作方式是当数据被移出(发送)时、数据也被接收。 我想您有三种选择。 这实际上取决于您何时需要接收到的数据。

    1:通过直接写入 SPI DAT0寄存器来发送第一个字节

    SPI->DAT0 = my_data; 

    然后在 RTI 中断中读取第一次发送时传入的数据、然后发送第二次数据。 这是一个简单的实现方案、但您读取的数据已使用10ms。

    if ((SPI->FLG & 0x00000100U)!= 0x00000100U)
    {
    } /*由于未接收到数据,因此出现错误例程*/
    my_read_data =(uint8) SPI->BUF;
    SPI->DAT0 = NEW_TX_DATA;//开始发送下一个字节
    
    

    2.如果不能等待10ms 以获得读取数据、则可以在 RTI 中断中每10ms 传输一次数据、然后在主循环中轮询接收到的数据。 这种方法的问题是、如果主循环太慢(执行某些时间所需的时间超过10ms)、您可能会丢失一些接收到的数据。

    3.您可以 在10ms RTI 中断例程中执行数据传输、并在 SPI 接收时生成中断。 在 SPI 中断例程中、读取字符并将其放入缓冲区。 必要时设置标志、然后让主例程处理数据。

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

    以下是我的示例代码、请提供任何解决方案

    spiDAT1_t 数据通信图;

    dataconfconfig.CS_hold = true;
    dataconfconfig.WDEL = true;
    dataconfconfig.DFSEL = SPI_FMT_0;
    dataconfconfig.CSNR = 0xFC;

    int rdcfb (uint8_t NIC、uint8_t r_config[][12]、unsigned char * ReadDataBuff、spiDAT1_t *数据通信图、spiBASE-t * SPI)

    INT8_t PEC 错误= 0;

    uint16_t DATA_PEC;
    uint16_t Received_Pec;

    unsigned int PNTR=0、DataStartLocation=0;
    memset ((char *) TX、0、sizeof (TX_LTC));
    memset ((char *) rx、0、sizeof (rx_LTC));

    TX[PNTR]=0x00;PNTR++;DataStartLocation++;
    TX[PNTR]=0x02;PNTR++;DataStartLocation++;
    TX[PNTR]=0x2B;PNTR++;DataStartLocation++;
    TX[PNTR]=0x0A;PNTR++;DataStartLocation++;
    PNTR+=8;                                       //从   从从器件读取8字节数据

    WAKEUP_IDLE (数据通信配置、spiREG3); //从设备在将每个数据包发送到从设备之前所需的虚拟数据

    spiSendAndGetData (spiREG3、dataconfig、PNTR、TX、Rx);

    memcpy ((char *) ReadDataBuff、(char *)&Rx[DataStartLocation]、8);

    void WAKEUP_IDLE (spiDAT1_t *数据配置、spiBASE-t * SPI)

    int wpntr =0;uint8_t w_TX[10]、w_Rx[10];
    uint8_t ut;int i;
    memset ((char *) w_TX、0、sizeof (w_TX));
    memset ((char *) w_Rx、0、sizeof (w_Rx));
    W_TX[wpntR]= 0x00;wpntr++;
    W_TX[wpntR]= 0x00;wpntr++;

    SendAndGetData (spiREG3、dataconconfig、wpntr、w_TX、w_Rx);  

    如果我调用  LTC6811_rdcfb (total_ic、r_config、rdcfb、&dataconconfig、spiREG3); 进行整流

    那么 我无法获取正确的数据。

    定时器和 SPI 中断都是 IRQ 中断