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.

[参考译文] TMS320F28027:配置 SPI 时出现问题

Guru**** 2538960 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/794478/tms320f28027-problem-with-configuring-spi

器件型号:TMS320F28027

嘿、我正在尝试为 Picolo F28027配置非 FIFO 模式下的 SPI、但似乎从未产生中断、我配置为从模式、我的主设备是 Arduino Mega、连续在循环中发送数据。 我也尝试配置中断。

这是代码

#include "DSP28x_Project.h"

中断 void SPI_RC_ISR ();

void main ()
{
InitSysCtrl();

/*中断配置*/

Dint;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW;

PieVectTable.SPIRXINTA =&SPI_RC_ISR;

PieCtrlRegs.PIECTRL.bit.ENPIE =1;
PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//表示螺旋
PieCtrlRegs.PIECTRL.bit.PIEVECT= 0x0D90;
IER |= M_INT6;// spirx 的 CPU 中断6
EINT;
ERTM;

/* GPIO 上拉使能*/

GpioCtrlRegs.GPAPUD.bit.GPIO16=0;
GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
GpioCtrlRegs.GPAPUD.bit.GPIO18=0;
GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;

/*资格选择*/

GpioCtrlRegs.GPAQSEL2.bit.GPIO16=3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;

/*在 SPI 模式下设置 GPIO 引脚*/

GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;
GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;
GpioCtrlRegs.GPAMUX2.bit.GPIO19=1;

/* SPI 配置*/
SpiaRegs.SPICCR.bit.SPISWRESET = 0;//复位
SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;//从模式
SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//数据输出在上升和下降
SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//无延迟
//SpiaRegs.SPIBRR = 127;//最低波特率
SpiaRegs.SPICCR.bit.SPICHAR = 7;// 8位字
SpiaRegs.SPISTS.bit.overoverover_flag = 0;
SpiaRegs.SPISTS.bit.INT_FLAG = 0;
SpiaRegs.SPIPRI.bit.TRIWIRE = 0;
SpiaRegs.SPIFFRX.bit.RXFFIENA=0;
SpiaRegs.SPICTL.bit.OVERRUNINTENA=1;//启用接收器溢出
SpiaRegs.SPICTL.bit.SPIINTENA=1;// TX 和 Rx 中断使能
SpiaRegs.SPICCR.bit.SPISWRESET = 1;//从复位中释放

/*数据传输*/
uint16_t DATA_Rx = 0;

// SpiaRegs.SPICTL.bit.Talk = 0;//传输关闭
while (SpiaRegs.SPISTS.bit.INT_flag!=1);//等待数据接收
DATA_Rx = SpiaRegs.SPIRXBUF;
while (1);

}

中断空 SPI_RC_ISR ()
{
int DATA_Rx;
DATA_Rx = SpiaRegs.SPIRXBUF;
}

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

    数据传输按预期进行。 您是否能够使用轮询模式接收数据?

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

    您好、Veena、

    我将 Arduino 中的数据更改为16位数字、因为 int c = 0x00ff。 并将 SPICHAR 更改为0。 现在中断标志被置位。 仍然编程未进入中断服务例程。  

    我们使用轮询模式接收数据 、但在每2秒发送0x00ff 时、我们接收到数字31、4095、65535的序列。 。 也不一致。

    您能 不能给 SPICHAR 的使用放点光? ISR 问题。

    感谢您的参与和支持

    F28027代码:
    #include "DSP28x_Project.h"
    
    中断 void SPI_RC_ISR ();
    
    void main ()
    {
    InitSysCtrl();
    
    /*中断配置*/
    
    Dint;
    InitPieCtrl();
    
    IER = 0x0000;
    IFR = 0x0000;
    
    InitPieVectTable();
    
    EALLOW;
    
    PieVectTable.SPIRXINTA =&SPI_RC_ISR;
    
    PieCtrlRegs.PIECTRL.bit.ENPIE =1;
    PieCtrlRegs.PIEIER1.bit.INTx1 = 1;//表示螺旋
    PieCtrlRegs.PIECTRL.bit.PIEVECT= 0x0D90;
    IER |= M_INT6;// spirx 的 CPU 中断6
    EINT;
    ERTM;
    
    /* GPIO 上拉使能*/
    
    GpioCtrlRegs.GPAPUD.bit.GPIO16=0;
    GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
    GpioCtrlRegs.GPAPUD.bit.GPIO18=0;
    GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0;
    
    /*资格选择*/
    
    GpioCtrlRegs.GPAQSEL2.bit.GPIO16=3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO18 = 3;
    GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3;
    
    /*在 SPI 模式下设置 GPIO 引脚*/
    
    GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO18=1;
    GpioCtrlRegs.GPAMUX2.bit.GPIO19=1;
    
    /* SPI 配置*/
    SpiaRegs.SPICCR.bit.SPISWRESET = 0;//复位
    SpiaRegs.SPICTL.bit.MASTER_SLAVE = 0;//从模式
    SpiaRegs.SPICCR.bit.CLKPOLARITY = 0;//数据输出在上升和下降
    SpiaRegs.SPICTL.bit.CLK_PHASE = 0;//无延迟
    //SpiaRegs.SPIBRR = 127;//最低波特率
    SpiaRegs.SPICCR.bit.SPICHAR = 0;// 1位字
    SpiaRegs.SPISTS.bit.overoverover_flag = 0;
    SpiaRegs.SPISTS.bit.INT_FLAG = 0;
    SpiaRegs.SPIPRI.bit.TRIWIRE = 0;
    SpiaRegs.SPIFFRX.bit.RXFFIENA=0;
    SpiaRegs.SPICTL.bit.OVERRUNINTENA=1;//启用接收器溢出
    SpiaRegs.SPICTL.bit.SPIINTENA=1;// TX 和 Rx 中断使能
    SpiaRegs.SPICCR.bit.SPISWRESET = 1;//从复位中释放
    
    /*数据传输*/
    uint16_t DATA_Rx = 0;
    SpiaRegs.SPICTL.bit.TALK = 0;//传输关闭
    
    while (1){
    if (SpiaRegs.SPISTS.bit.INT_flag ==1){//等待直到数据接收
    DATA_Rx =(SpiaRegs.SPIRXBUF & 0x00ff);
    }
    }
    
    
    
    中断 void SPI_RC_ISR ()
    {
    int DATA_Rx;
    DATA_Rx = SpiaRegs.SPIRXBUF;
    }
    

    Arduino 代码:

    #include 
    
    void setup (void){
    Serial.begin(115200);//将波特率设置为115200 (对于 USART
    digitalWrite (SS、HIGH);//禁用从器件选择
    SPI.begin ();
    SPI.setClockDivider(SPI_CLOCK_DIV128);//divide 将时钟设置为8
    }
    
    void loop (void){
    int c=0x00ff;
    digitalWrite (SS、LOW);//启用从器件选择
    SPI.transfer (c);
    Serial.print (c);
    digitalWrite (SS);High
    (HIGH
    );2000) 

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

    如果您能够使用轮询方法接收日期、并且问题仅与获取中断有关、请确保正确配置 PIE 中断、确保在配置中断之前清除 PIE 和 SPI 模块中的挂起标志(如果有)。

    您可以根据应用需要更新 SPICHAR、但应确保主设备和从设备上的数据长度配置相同。

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

    您好!

    您是否能够解决此问题?

    此致、

    Veena

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于我在过去几周没有收到您的反馈、我假设您能够解决问题、我正在关闭 TT。

    此致、
    Veena