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.

[参考译文] TMS320F2.8377万S:SPI RX未使用DMA写入内存

Guru**** 2485785 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/657425/tms320f28377s-spi-rx-not-being-written-to-memory-using-dma

部件号:TMS320F2.8377万S

我最初使用SPI中断从SPI接收数据。 此操作正常。  

我正在尝试使用DMA切换到读取SPI C接收缓冲区。 DMA似乎没有将数据写入变量内存。

我配置了所有内容,在调试过程中,我可以看到指向内存中变量位置的阴影寄存器,但数据保持为零。

我还可以看到调试中到达SpicRegs.SPIRXBUF的数据。 RXFFST寄存器将增加或降低至RXFFIL级别。

它还可以正确触发设置为在DMA传输结束时触发的中断。

这是我的代码:

//DMA配置文件

#定义连拍 (FIFO_LVL-1)//突发大小应小于8#define
传输 0 //[(MEM_BUFFER_Size/Fifo_LVL)-1]
#define Fifo_LVL 二 // FIFO中断级别

易失性UINT16 *DMADest;

void DMA_init()
{
//
//初始化DMA
//
DMAInitialize();

DMADest =(volatile UINT16 *) RDATA;


DMACH1AddrConfig (DMADest,&SpicRegs.SPIRXBUF);
DMACH1BurstConfig (burst,0,1); //连拍大小,源码步长,目标步长
DMACH1TransferConfig (transfer,0,1); //传输大小,源步骤,目标步骤
DMACH1ModeConfig (DMA_SPICRX,PERINT_ENABLE,OneShot_DISABLE,CONT_ENABLE,
SYNC_DISABLE,SYNC_SRC,OVRFLOW_DISABLE,十六位,
chint_end,chint_enable);
}

//在ISR文件中中断

__interrupt void local_D_INTCH1_ISR(void){


EALLOW;//需要在ISR内执行EALLOW!!!
//DmaRegs.CH6.control.bit.halt = 1;
PieCtrlRegs.PIEACK.ALL |= PIEACK_group7;// ACK接收更多中断
//来自此饼图组
EDIS;

CPU2CLA_Vctrl =(签名长) RDATA[0];
//Vctrl_Test =(签名长) RDATA[0];

返回;
} 

//全局文件中声明的变量

extern DEC volatile UINT16 RDATA[2];

编辑以包括SPI配置

//SPI配置

//SPICCR寄存器
SpicRegs.SPICCR.bit.SPISWRESET = 0;
SpicRegs.SPICCR.bit.SPICHAR = 0xF;//16位字符
SpicRegs.SPICCR.bit.CLKPOLARITY = 0;//时钟极性(数据在上升时钟边缘输出)

//SPICCL Reigsters
SpicRegs.SPICTL.bit.MASTER_SLAVE =0;//配置为从属设备以在SPISOMIA上传输
SpicRegs.SPICTL.bit.CLK_PHASE =0;//时钟相位,半周期偏移
SpicRegs.SPICTL.bit.Talk = 0;//通过SPI禁用数据传输
SpicRegs.SPICTL.bit.SPIINTENA = 0;//启用SPI中断

//SPIPRI寄存器
SpicRegs.SPIPRI.Bit.STEINV = 0; //SPISTE bar acitve low (低)
SpicRegs.SPIPRI.Bit.TRIWIRE = 0;//正常4线操作

//SPICCR寄存器,用于启用高速模式(50MHz最大时钟)
SpicRegs.SPICCR.bit.HS_MODE = 1;

//SPIFFTX寄存器
SpicRegs.SPIFFTX.Bit.SPIFFENA = 1;//启用FIFO功能

//SPIFFRX寄存器
SpicRegs.SPIFFRX.bit.RXFFIENA = 1; //启用FIFO RX中断
SpicRegs.SPIFFRX.bit.RXFFIL = 0x2; 生成中断前收到的//2个字

//SPIBRR寄存器
SpicRegs.SPIBRR.All = 0;//将波特率设置为最大速率

SpicRegs.SPIFFTX.Bit.SPIRST = 1;
SpicRegs.SPIFFTX.Bit.TXFIFO = 1;
SpicRegs.SPIFFRX.Bit.RXFIFO = 1;//启用FIFO功能
SpicRegs.SPIFFTX.Bit.TXFFINTCLR = 1;
SpicRegs.SPICCR.bit.SPISWRESET = 1; 

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

    您似乎已正确配置了所需的一切。 我假设您的示例基于SPI_LOUST_DMA示例,这很好。

    因此,重申一下,您的SPI似乎正在接收正确的数据,如SPI寄存器中所观察到的。 DMA正在触发传输中断的结束,但实际上并未将数据复制到内存缓冲区。 对吗?

    是否已将DMA连接到外设帧2网桥? 参见Example_2837xS_SPI_DMA.c的第136行,这将指定DMA作为PF2桥接器的主设备,允许DMA访问SPI模块。
    您接收到的数据缓冲区已分配到哪个内存区。 确保DMA也可以访问此选项。

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

    自您上次回复以来已有几天。 您是否能够解决您的问题? 您还有其他问题吗?

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

    我将DMA错误地分配给内存部分。 更改此选项已解决问题。

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

    我很高兴您能够解决您的问题。 将来,如果您有具体问题,请随时再次发布到论坛。

    标记