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**** 2253470 points
Other Parts Discussed in Thread: LAUNCHXL-F28027
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

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

器件型号:TMS320F28027
主题中讨论的其他器件:LAUNCHXL-F28027

您好!

我正在使用 LAUNCHXL-F28027、我正在尝试将 SPIA 外设与 Raspberry Pi 搭配使用。 问题是、它永远不会进入传输器和接收器中断的回调。 实际上、它是第一次进入接收器中断、但 随后 RXFFIENA 寄存器变为高电平、从不变为低电平、因此我认为它是这个问题的关键之一。 如果有人知道问题可能是什么、我会非常感激。

这是代码。 main 只是对这些函数和 for (;;)的调用。

void SPIA_Init (void (* TX_int)(void)、void (* Rx_int)(unsigned char)
){


EALLOW;

SpiaRegs.SPICCR.bit.SPISWRESET = 0;//复位条件

SpiaRegs.SPICCR.bit.CLKPOLARCRNT= 1;// SPICTR.SPICT.ST/ SPICT.STAL.SpiR/


SpiR/ SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SpiRIST.SPICRINIT.SpiRINIT.SpiR=0;//配置为 SPICRIST.SPICRIST.


//禁用发送路径

SpiaRegs.SPIFFTX.bit.SPIFFENA=1;// SPI_A FIFO 模式*//
SpiaRegs.SPIFFTX.bit.TXFFIL = 0;

SpiaRegs.SPIFFRX.bit.RXFFIL = 4; //将 RX FIFO 级别设置为0
SpiaRegs.SPIFFRX.bit.RXFFIENA=1;
// SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;
// SpiaRegs.SPIPRI.All=0x0010;

SPIA_Rx_callback = FIF_int;SPIA_TX_REACT.TXEST.1=SPIESCR.BIT.TX.BIT.R=1
;SpiCR.BIT.TXESR=SPICESR=1;SpiCR.BIT.TX.BIT.TX.BIT.TX.BIT.TX.BIT.TX.BIT.R=SPICESR=1;SpiCR.BIT.TX.BIT.TX.BIT.BIT.BIT.R=SPICESR=SPIC




EDIS;

DINT;

//启用 SCI 接收中断
Hwi_create (72、SPIARX_ISR、NULL、NULL);//在 PIE 组6
中启用 SPIRXINTA Hwi_create (73、SPIATX_ISR、NULL、NULL);//在 PIE 组6

EINT 中启用 SPIRXINTA; //在 CPU 级别

返回上启用中断;
}

void SPIARX_ISR (UARg arg)
{
RDATA[1]= SpiaRegs.SPIRXBUF;//从机读取数据
RDATA[2]= SpiaRegs.SPIRXBUF;//从机读取数据
RDATA[3]= SpiaRegs.SPIRXBUF]
;//从机读取数据 RDXBUF[SPIRF];//从机读取
数据 RDXBUF[SpiRXBUF] //从机读取数据

// if (SPIA_Rx_callback!= 0)
// (* SPIA_Rx_callback)(RDATA[1]); //将数据发送到 sci_callback
EALLOW 指向的函数;
//SpiaRegs.SPIFFRX.bit.RXFFOVFCLR=1;//清除溢出标志
SpiaRegs.SPIFFRX.bit.RXFFINTCLR=1;//清除中断标志
// PieCtrlRegs.PIECR=0x20|;//清除中断标志 //发出 PIE ack
EDIS;
}

void SPIATX_ISR (UArg_arg)
{
SpiaRegs.SPITXBUF = sdata[1];//从器件发送数据

SpiaRegs.SPIFFTX.bit.TXFFINTCLR=1;//清除中断标志
PieCtrlRegs.PIEACK.All|=0x20; //发出 PIE ACK
//if (SPIA_TX_CALLBACK!= 0)
//(* SPIA_TX_CALLBACK)(); //执行 sci_callback
指向的函数}
void initGPIO (void){
EALLOW;

//rRaspberry (SPIA)
// GpioCtrlRegs.GPAPUD.bit.GPIO16 = 0;
// GpioCtrlRegs.GPAPUD.bit.GPIO17 = 0;
// GpioCtrlRegs.GPAPKA.bit.GPIO18 = 0;
// GpioCtrl18 = 0;// GPIO18 = 0;// GPIO18 = GPIO18 = 0 *
GpioCtrlRegs.GPAMUX2.bit.GPIO16=1;//SPISIMOA
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1;//SPISOMIA
GpioCtrlRegs.GPAMUX2.bit.GPIO19=1;//SPISTE
GCtrlRegs.GPAMUX2.bit.GPIO18 = 1;//SPICLK
// GpioCtrlRegs.GPAQSEL2.bit.GPIO16 = 3;
// GpioCtrlRegs.GPAQSEL2.bit.GPIO17 = 3;
// GpioRegs.GPQ252.bit.GPIO=3.Gpio15.GQ2.GPIO2.GPIO=3.bit.GPIO3.GPIO=3/GPIO1.bit.GPIO1.bit.GPIO3.GPIO1.GPIO=2.Q251.bit.GPIO1.bit.GPIO3.GPIO1.bit.GPIO=2.GPIO1.GPIO1.


//LED
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;//用作 GPIO
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; //输出

//右侧电机
GpioCtrlRegs.GPAMUX1.bit.GPIO2 = 1; ///EPWM2A
GpioCtrlRegs.GPAMUX1.bit.GPIO3=1; //EPWM2B
GpioCtrlRegs.GPAMUX2.bit.GPIO24 = 2;//EQEP2A
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 2;//EQEP2B

//US 传感器-故障触发器和输出参数列表
GpioCtrlRegs.GPADIR.bit.GPIO4=1; //输出左侧
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0; //向左触发
GpioCtrlRegs.GPAMUX1.bit.GPIO5=3; //ECAP1 -左侧
GpioCtrlRegs.GPAMUX1.bit.GPIO7=3; //ECAP2 -正面
GpioCtrlRegs.GPAMUX2.bit.GPIO26 = 1;//ECAP3 -右侧

//模拟输入
GpioCtrlRegs.AIOMUX1.bit.AIO2 = 0;// ADCINA2 -左侧
GpioCtrlRegs.AIOMUX1.bit.AIO4 = 0;// ADCINA4 -正面
GpioCtrlRegs.AIOMUX1.bit.AIO6 = 0;// ADCINA6 -右

EDIS;

}

void initSystem (void){
EALLOW;

//至少对于调试是必需的
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
(*Device_cal)();
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 0;

//低速时钟配置
SysCtrlRegs.LOSPCP。all = 0b010; //除以4

//启用外设时钟
SysCtrlRegs.PCLKCR0.bit.SPIANCLK = 1;
SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;
SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1;
SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1;
SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1;
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1;
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1;
SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 1;

EDIS;
}

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

    我写信告诉您、已指派一名 C2000团队成员回答此帖子。

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

    在 SPIARX_ISR 中、是否已注释掉 PIEACK? 如果您不 ACK 中断、则永远不会再次输入中断。 在中断中、您读取并清除 SPI 模块内的标志、但下次触发该标志时、您将无法访问该标志。

    请取消注释此行。

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

    您好!

    这可能是一个问题、但也不起作用。 我 也取消了 GPAPUD 和 GPAQSEL2线路的注释、现在我在读取信息后复位接收 FIFO。 然后它就可以工作了。 我不知道原因、但 SPIA 没有减少接收器 FIFO 中的状态编号、因此我必须"手动"执行它。 它对我很有用。 我已将此代码传递给 F28069、因此无需进行此复位、因此我不知道。 但它终于成功了、谢谢您。

    伊内斯