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.

[参考译文] TMS320F28076:CLA interruptp SPI slvae can##39;t interrupt

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1373814/tms320f28076-cla-interrutp-spi-slvae-can-t-interrupt

器件型号:TMS320F28076

工具与软件:

我将 SPI 从器件程序 CLA 任务3用于 SPI A Rx 中断

board.c:

void spi_init ()


//mySPI0初始化
SPI_disableModule (mySPI0_BASE);
SPI_setConfig (mySPI0_BASE、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、
SPI_MODE_MASTER、700000、8);
SPI_enableFIFO (mySPI0_BASE);
SPI_disableLoopback (mySPI0_BASE);
SPI_setEmulationMode (mySPI0_BASE、SPI_EMULATION_FREE_RUN);
SPI_enableModule (mySPI0_BASE);

//mySPI1初始化
SPI_disableModule (mySPI1_base);
SPI_setConfig (mySPI1_base、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、
SPI_MODE_SLAVE、500000、16);
SPI_enableFIFO (mySPI1_base);
SPI_setFIFOInterruptLevel (mySPI1_base、SPI_FIFO_TXEMPTY、SPI_FIFO_RX4);
SPI_clearInterruptStatus (mySPI1_base、SPI_INT_RXFF);
SPI_enableInterrupt (mySPI1_base、SPI_INT_RXFF);
SPI_disableLoopback (mySPI1_base);
SPI_setEmulationMode (mySPI1_base、SPI_EMULATION_STOP_MIDV);
SPI_enableModule (mySPI1_base);
}

initcla

void initcla (void)

....

....

cla_mapTaskVector (cla1_base、cla_MVECT_1、(uint16_t)&Cla1Task1);
cla_mapTaskVector (cla1_base、cla_MVECT_8、(uint16_t)&Cla1Task8);
CLA_setTriggerSource (CLA_TASK_1、CLA_TRIGGER_EPWM6INT);
CLA_setTriggerSource (CLA_task_8、CLA_trigger_software);
//添加 SPI Rx Cla1Task3
cla_mapTaskVector (cla1_base、cla_MVECT_1、(uint16_t)&Cla1Task3);
CLA_setTriggerSource (CLA_TASK_1、CLA_TRIGGER_SPIRXAINT);

//CLA_TASKFLAG_3 Jaures CLA_TRIGGER_SPIRXAINT
cla_enableTasks (CLA1_base、(CLA_TASKFLAG_1 |CLA_TASKFLAG_3 | CLA_TASKFLAG_8));

cla_enableIACK (CLA1_base);
//
//强制执行任务8、即一次性初始化任务
//
CLA_forceTasks (CLA1_base、CLA_TASKFLAG_8);

}

CLA 任务3

#define mySPI1_base SPIA_BASE

int16_t ISPI、SpirxFifonum;
uint16_t rxfifoarray[4];
uint16_t txfifoarray[4];

__attribute__(( interrupt )) void Cla1Task3 ( void )

if (SpirxFifonum>0)

SpirxFifonum=SPI_getRxFIFOStatus (mySPI1_base);
/__mdebugstop();
rxfifoarray[0]=SPI_readDataNonBlocking (mySPI1_base);
txfifoarray[0]=(txfifoarray[0]+4);
SPI_writeDataNonBlocking (mySPI1_base、txfifoarray[0]);

rxfifoarray[1]=SPI_readDataNonBlocking (mySPI1_base);
txfifoarray[1]=(txfifoarray[1]+4);
SPI_writeDataNonBlocking (mySPI1_base、txfifoarray[1]);

rxfifoarray[2]=SPI_readDataNonBlocking (mySPI1_base);
txfifoarray[2]=(txfifoarray[2]+4);
SPI_writeDataNonBlocking (mySPI1_base、txfifoarray[2]);

rxfifoarray[3]=SPI_readDataNonBlocking (mySPI1_base);
txfifoarray[3]=(txfifoarray[3]+4);
SPI_writeDataNonBlocking (mySPI1_base、txfifoarray[3]);

}

SPI_clearInterruptStatus (mySPI1_base、SPI_INT_RXFF);
}

我的问题是 SPI ISR 仅中断一次。

请帮助我检查是否未命中哪个代码?

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

    大家好、Juares、

    您是否尝试使用(CPU 上的) SPI 中断? 还是仅限用于 SPI 通信的 CLA 任务?  

    我看到您将 task1的 CLA 触发器设置为 CLA_TRIGGER_SPIRXAINT。 如果您想针对 SPI1使用任务3、您是指在这里放置任务3而不是任务1吗?

    此致、

    Allison

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

    MCU 中运行的该 SPI 中断正确、没有问题。

    但我想移至 CLA、执行 SPI ISR

    I MODIFY  

    void initcla (void)

    ....

    ....
    cla_mapTaskVector (cla1_base、cla_MVECT_1、(uint16_t)&Cla1Task1);
    //添加 SPI Rx Cla1Task3
    cla_mapTaskVector (cla1_base、cla_MVECT_3、(uint16_t)&Cla1Task3);
    cla_mapTaskVector (cla1_base、cla_MVECT_8、(uint16_t)&Cla1Task8);
    CLA_setTriggerSource (CLA_TASK_1、CLA_TRIGGER_EPWM6INT);
    //添加 SPI Rx Cla1Task3
    CLA_setTriggerSource (CLA_TASK_3、CLA_TRIGGER_SPIRXAINT);
    CLA_setTriggerSource (CLA_task_8、CLA_trigger_software);
    #pragma diag_warning=770

    //
    //启用任务1、3和8
    //CLA_TASKFLAG_3 Jaures CLA_TRIGGER_SPIRXAINT
    cla_enableTasks (CLA1_base、(CLA_TASKFLAG_1 |CLA_TASKFLAG_3 | CLA_TASKFLAG_8));

    cla_enableIACK (CLA1_base);
    //
    //强制执行任务8、即一次性初始化任务
    //
    CLA_forceTasks (CLA1_base、CLA_TASKFLAG_8);
    }

    针对 DSP 数字功率补偿器的任务1

    SPI 中断的任务3  

    var init 的任务8

    但任务3只触发一次?

    可以将 TX 数据编程为保持0x0004吗?

    为什么?

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

    您好、Jaures、

    我认为我看到了这个问题。 您确实需要 在任务结束时清除中断源以接收进一步的任务触发器、但是无法 SPI_clearInterruptStatus()从.CLA 文件调用、因为它在 spi.c 文件中定义、因此仅针对 C28x 进行编译。  您可以改为在 CLA 任务的末尾放置以下行、这将直接清除标志吗?

    HWREGH(base + SPI_O_FFRX) |= SPI_FFRX_RXFFINTCLR;

    你看不到从 CLA 任务中调用某些其他 driverlib 函数(如 SPI_readDataNonBlocking()和 SPI_writeDataNonBlocking())时会出现问题的原因是这些函数是在 spi.h 文件中定义的、这意味着它们是内联函数、内容将在编译时替换.cla 文件中的函数调用。 您通常只能从.cla 文件调用.h 文件中定义的 driverlib 函数。

    请告诉我、这是否可以解决该问题。

    此致、

    Delaney

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

    修改正常运行的任务3

    但为什么第一次接收 FIFO (SpirxFifonum)= 16?

     SpirxFifoCNT =1;

    需要添加  

    if (SpirxFifonum>4)

    HWREGH (SPIA_BASE + SPI_O_FFRX)|= SPI_FFRX_RXFFOVFCLR;
    HWREGH (SPIA_BASE + SPI_O_STS)|= SPI_STS_OVERRUN_FLAG;
    SpirxFifoCNT=SpirxFifoCNT+0x01U;
    }

    为何触发  SPI_FFRX_RXFFOVFCLR 或 SPI_STS_OVERRUNY_FLAG ?

    #define mySPI1_base SPIA_BASE

    void spi_init ()

    //mySPI1初始化
    SPI_disableModule (mySPI1_base);
    SPI_setConfig (mySPI1_base、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、
    SPI_MODE_SLAVE、500000、16);
    SPI_enableFIFO (mySPI1_base);
    SPI_setFIFOInterruptLevel (mySPI1_base、SPI_FIFO_TXEMPTY、SPI_FIFO_RX4);
    SPI_clearInterruptStatus (mySPI1_base、SPI_INT_RXFF);
    SPI_enableInterrupt (mySPI1_base、SPI_INT_RXFF);
    SPI_disableLoopback (mySPI1_base);
    SPI_setEmulationMode (mySPI1_base、SPI_EMULATION_STOP_MIDV);
    SPI_enableModule (mySPI1_base);
    }

    __attribute__(( interrupt )) void Cla1Task3 ( void )

    //SpirxFifonum=((HWREGH (SPIA_BASE + SPI_O_FFRX)& SPI_FFRX_RXFFST_M)>> SPI_FFRX_RXFFST_S);
    SpirxFifonum=(SPI_RxFIFOLevel)((HWREGH (SPIA_BASE + SPI_O_FFRX)& SPI_FFRX_RXFFST_M)>>SPI_FFRX_RXFFST_S);
    if (SpirxFifonum>4)

    HWREGH (SPIA_BASE + SPI_O_FFRX)|= SPI_FFRX_RXFFOVFCLR;
    HWREGH (SPIA_BASE + SPI_O_STS)|= SPI_STS_OVERRUN_FLAG;
    SpirxFifoCNT=SpirxFifoCNT+0x01U;
    }
    否则{}

    if (SpirxFifonum>0)

    for (ISPI=0;ISPI<SpirxFifonum;ISPI++)

    //rxfifoarray[ISPI]=SPI_readDataNonBlocking (mySPI1_base);
    rxfifoarray[ISPI]=(HWREGH (SPIA_BASE + SPI_O_RXBUF));
    //静态内联 void
    /__mdebugstop();
    txfifoarray[ISPI]=(txfifoarray[ISPI]+4);
    // spi_writeDataNonBlocking (mySPI1_base、txfifoarray[ISPI]);
    HWREGH (SPIA_BASE + SPI_O_TXBUF)=txfifoarray[ISPI];
    }
    }
    //SPI_clearInterruptStatus (mySPI1_base、SPI_INT_RXFF);
    HWREGH (SPIA_BASE + SPI_O_FFRX)|= SPI_FFRX_RXFFINTCLR;

    }

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

    您好、Jaures、

    很高兴听到您使 CLA 任务正常工作。 我将让 Allison 评论您的 SPI 配置和您看到的行为。

    此致、

    Delaney

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

    修改正常运行的任务3

    但为什么第一次接收 FIFO (SpirxFifonum)= 16?

     SpirxFifoCNT =1;

    需要添加  

    if (SpirxFifonum>4)

    HWREGH (SPIA_BASE + SPI_O_FFRX)|= SPI_FFRX_RXFFOVFCLR;
    HWREGH (SPIA_BASE + SPI_O_STS)|= SPI_STS_OVERRUN_FLAG;
    SpirxFifoCNT=SpirxFifoCNT+0x01U;
    }

    为何触发  SPI_FFRX_RXFFOVFCLR 或 SPI_STS_OVERRUNY_FLAG ?

    #define mySPI1_base SPIA_BASE

    void spi_init ()

    //mySPI1初始化
    SPI_disableModule (mySPI1_base);
    SPI_setConfig (mySPI1_base、DEVICE_LSPCLK_FREQ、SPI_PROT_POL0PHA0、
    SPI_MODE_SLAVE、500000、16);
    SPI_enableFIFO (mySPI1_base);
    SPI_setFIFOInterruptLevel (mySPI1_base、SPI_FIFO_TXEMPTY、SPI_FIFO_RX4);
    SPI_clearInterruptStatus (mySPI1_base、SPI_INT_RXFF);
    SPI_enableInterrupt (mySPI1_base、SPI_INT_RXFF);
    SPI_disableLoopback (mySPI1_base);
    SPI_setEmulationMode (mySPI1_base、SPI_EMULATION_STOP_MIDV);
    SPI_enableModule (mySPI1_base);
    }

    __attribute__(( interrupt )) void Cla1Task3 ( void )

    //SpirxFifonum=((HWREGH (SPIA_BASE + SPI_O_FFRX)& SPI_FFRX_RXFFST_M)>> SPI_FFRX_RXFFST_S);
    SpirxFifonum=(SPI_RxFIFOLevel)((HWREGH (SPIA_BASE + SPI_O_FFRX)& SPI_FFRX_RXFFST_M)>>SPI_FFRX_RXFFST_S);
    if (SpirxFifonum>4)

    HWREGH (SPIA_BASE + SPI_O_FFRX)|= SPI_FFRX_RXFFOVFCLR;
    HWREGH (SPIA_BASE + SPI_O_STS)|= SPI_STS_OVERRUN_FLAG;
    SpirxFifoCNT=SpirxFifoCNT+0x01U;
    }
    否则{}

    if (SpirxFifonum>0)

    for (ISPI=0;ISPI<SpirxFifonum;ISPI++)

    //rxfifoarray[ISPI]=SPI_readDataNonBlocking (mySPI1_base);
    rxfifoarray[ISPI]=(HWREGH (SPIA_BASE + SPI_O_RXBUF));
    //静态内联 void
    /__mdebugstop();
    txfifoarray[ISPI]=(txfifoarray[ISPI]+4);
    // spi_writeDataNonBlocking (mySPI1_base、txfifoarray[ISPI]);
    HWREGH (SPIA_BASE + SPI_O_TXBUF)=txfifoarray[ISPI];
    }
    }
    //SPI_clearInterruptStatus (mySPI1_base、SPI_INT_RXFF);
    HWREGH (SPIA_BASE + SPI_O_FFRX)|= SPI_FFRX_RXFFINTCLR;

    }

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

    大家好、Juares、

    当您询问以下内容时:

    [报价 userid="485605" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1373814/tms320f28076-cla-interrutp-spi-slvae-can-t-interrupt/5258712 #5258712"]为什么第一次使用 Rx FIFO (SpirxFifonum)=16[/QUOT]
    • 您是否看到 RXFIFO 状态= 16 (意味着 RX FIFO 的所有16级均已满)?   
    • 您将 RX FIFO 中断级别设置为4、这意味着您应在 RXFIFO 至少有4个级别(满有要读取的数据)时触发中断(在本例中为 CLA 任务3)。  

    很抱歉、但我很难理解确切的问题是什么-您能帮我们解决您遇到的问题吗?

    1. 请首先澄清:您想做什么?
      1. 您期望接收和发送多少数据?
      2. 您要在什么位置尝试从 RXFIFO 读取(您是否要在每次 RXFIFO 至少包含4个数据时读取)?
      3. 将 RXFIFO 数据移至何处? 该问题是否仅与您存储接收到的数据的方式有关? 不是接收器本身吗?
    2. 您看到此问题出现了什么症状?
      1. 只有 RX 存在此问题吗? 或者 SPI TX 也存在问题吗?
      2. 是否设置了任何错误标志?
      3. CLA 任务是否正确/按预期发生?
      4. 您是否对 SPI 线路进行了仔细检查、以确保看到预期的信号(数据、芯片选择、时钟)?

    您混合使用 driverlib 代码和 HWREGH 代码而不是仅使用 driverlib 的具体原因吗?

    此致、

    Allison

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    • 您是否看到 RXFIFO 状态= 16 (意味着 RX FIFO 的所有16级均已满)?
      • 有   
    • 您将 RX FIFO 中断级别设置为4、这意味着您应在 RXFIFO 至少有4个级别(满有要读取的数据)时触发中断(在本例中为 CLA 任务3)。  

    请首先澄清:您想做什么?
    A. 您期望接收和发送多少数据?
    4字 pre 10ms mcu1主器件发送到 MCU2从器件测试
    B. 您要在什么位置尝试从 RXFIFO 读取(您是否要在每次 RXFIFO 至少包含4个数据时读取)?
    每10ms 为 Yes (是) mcu1发送至 MCU2
    c. 将 RXFIFO 数据移至何处? 该问题是否仅与您存储接收到的数据的方式有关? 不是接收器本身吗?
    用于任务1数字电源的4字数据、但仅测试新的、
    但数据没有任何变化,现在测试

    您看到此问题出现了什么症状?
    A. 只有 RX 存在此问题吗? 或者 SPI TX 也存在问题吗?
    Tx 从 mcu1 SPI 主器件执行 mcu1 lib、在 CLA 不执行、没有问题
    B. 是否设置了任何错误标志?
    SPI Rx FIFO 已满、过载运行标志达1次(SPI_FFRX_RXFFOVFCLR 或 SPI_STS_OVERRUN_FLAG)
    c. CLA 任务是否正确/按预期发生?
    不详细测试,我感谢没有问题
    D. 您是否对 SPI 线路进行了仔细检查、以确保看到预期的信号(数据、芯片选择、时钟)?
    是附加的图片

    您混合使用 driverlib 代码和 HWREGH 代码而不是仅使用 driverlib 的具体原因吗?
    使用 sys.cfg 的 gen board.c;void spi_init () MCU 在 CLA 上执行初始编号、仅在 CLA 上执行任务3

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

    大家好、Juares、

    感谢您的答复。

    您能否尝试在 CCS 中使用"Step Over"(单步执行)和"Step Into"(单步执行到)按钮单步执行您的代码、同时使用"Registers"(寄存器)查看窗口("Continuous Refresh"已开启)监视 SPI 状态? 首次初始化 SPI 模块时、SPI RX 状态应从0开始、并且应清除错误标志。 通过单步执行代码、我想确定状态何时(代码中的哪一点)发生变化、并查看是否会在预期时发生变化。  

    如果正确触发 CLA (当 RX FIFO 达到4级满)来读取 FIFO 中的任何数据以将其清除、则 RX FIFO 状态不应溢出。

    如果我在示波器捕获上正确读取了通道、信号看起来都很好、因此我怀疑这里可能存在一些软件或配置问题。

    此致、

    Allison

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

    我现在忙,我会尝试它