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.
大家好
嗯、我正在使用 DMA (F28379D Launch Pad)将数据从 SPI 主设备发送到从设备。 数据被接收到
将 FIFO 水平配置为 8 个字或更低、并将突发配置为7。
当我把 FIFO 水平更改为16,15… 9突发到15,14,… 8、接收到的数据变为未排列、就像在发送端一样、某些数据丢失。
请提出任何建议?
此致
非常感谢 Veena、我将继续关注。
你(们)好、Veena
我使用了2种配置。 第一个是突发大小= FIFOLVL -1、它适用于8个 FIFO 字或更低的字、如我的帖子中所述。 2ed 情况下的突发大小= (16–TXFFIL)–1 (参考手册:2137)、这不起作用。
此致、
霍萨姆
您好 Veena
很抱歉、仍然存在同样的问题。
期待收到您的回复。
谢谢
你(们)好、Veena
以下是根据 TI 示例修改的代码。
//
#include "F28x_Project.h"
//
//定义
//
#define TXBUST (16-TXFIFO_LVL)-1 //突发大小应小于8
#define 传输3 //[(MEM_buffer_size/FIFO_LVL)-1]
#define TXFIFO_LVL 15 // FIFO 中断级别
#define RXBUST RXFIFO_LVL-1 //突发大小应小于8
#define RXFIFO_LVL 15 // FIFO 中断级别
//
//全局
//
#pragma DATA_SECTION (sdata、"ramgs0");//将 TX 数据映射到存储器
#pragma DATA_SECTION (RDATA、"ramgs1");//将 RX 数据映射到存储器
uint16 sdata[128];//发送数据缓冲区
uint16 RDATA[128];//接收数据缓冲区
易失性 uint16 * DMADest;
易失性 uint16 * DMASSOURCE;
void dma_init (void);
void SPI_Fifo_init (void);
//
//主函
//
void main (void)
{
uint16 i;
InitSysCtrl();
InitSpiaGpio();
Dint;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
//
//步骤4. 初始化器件外设:
//
dma_init ();//为 SPI 配置设置 DMA
EALLOW;
CpuSysRegs.SECMSEL.bit.PF2SEL = 1;//确保 DMA 连接到外设帧2桥(EALLOW 受保护)
EDIS;
SPI_Fifo_init();//仅初始化 SPI
//
//初始化数据缓冲区
//
对于(i=0;i<128;i++)
{
sdata[i]= i;
RDATA[i]=0;
}
StartDMACH6();
StartDMACH5();
while (1)
{
}
}
//
// SPI_Fifo_init -初始化 SPIA FIFO
//
void SPI_Fifo_init()
{
// SPIA FIFO 寄存器配置
SpibRegs.SPIFFTX.bit.TXFFIL = TXFIFO_LVL;
SpibRegs.SPIFFRX.bit.RXFFIL = RXFIFO_LVL;//设置 RX FIFO 电平
SpiaRegs.SPIFFTX.bit.TXFFIL = TXFIFO_LVL;//设置 TX FIFO 电平
SpiaRegs.SPIFFRX.bit.RXFFIL = RXFIFO_LVL;
SpiaRegs.SPIFFTX.bit.SPIFFENA=1;
SpiaRegs.SPIFFTX.bit.TXFFINTCLR = 1;
SpiaRegs.SPIFFRX.bit.RXFFINTCLR = 1;
SpiaRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
SpiaRegs.SPIFFTX.bit.TXFIFO = 1;
SpiaRegs.SPIFFRX.bit.RXFIFORESET = 1;
SpiaRegs.SPIFFTX.bit.SPIRST = 1;
// SPIB FIFO 寄存器配置
SpibRegs.SPIFFTX.bit.SPIFFENA=1;
SpibRegs.SPIFFTX.bit.TXFFINTCLR = 1;
SpibRegs.SPIFFRX.bit.RXFFINTCLR = 1;
SpibRegs.SPIFFRX.bit.RXFFOVFCLR = 1;
SpibRegs.SPIFFTX.bit.TXFIFO = 1;
SpibRegs.SPIFFRX.bit.RXFIFORESET = 1;
SpibRegs.SPIFFTX.bit.SPIRST = 1;
//
//初始化内核 SPIA 寄存器
//
InitSpi();
//初始化内核 SPIB 寄存器
SpibRegs.SPICCR.bit.SPISWRESET = 0;
SpibRegs.SPICCR.bit.CLKPOLARITY = 0;
SpibRegs.SPICCR.bit.SPICHAR =(16-1);
SpibRegs.SPICCR.bit.SPILBK = 1;
SpibRegs.SPICTL.bit.MASTER_SLAVE = 0;
SpibRegs.SPICTL.bit.TALK = 1;
SpibRegs.SPICTL.bit.CLK_PHASE = 0;
SpibRegs.SPICTL.bit.SPIINTENA=0;
//设置波特率
SpibRegs.SPIBRR.bit.SPI_BIT_RATE = 0x0F;/SPI_BRR;
//设置空闲位
//在断点上停止不会停止 SPI
SpibRegs.SPIPRI.bit.FREE = 1;
//解除 SPI 复位
SpibRegs.SPICCR.bit.SPISWRESET = 1;
}
//
// dma_init - TX 和 RX 通道的 DMA 设置。
//
void dma_init()
{
//
//初始化 DMA
//
DMAInitialize();
DMASource =(volatile UINT16 *) sdata;
DMADest =(易失性 UINT16 *) RDATA;
//
//为 TX 配置 DMACH5
//
DMACH5AddrConfig (SpiaRegs.SPITXBUF、DMASource);
DMACH5BurstConfig (TXBUST、1、0);//突发大小、src 步长、dest 步长
DMACH5TransferConfig (transfer、1、0);//传输大小、src 阶跃、dest 阶跃
DMACH5ModeConfig (DMA_SPIATX、PERINT_ENABLE、OneShot_disable、CONT_ENABLE、
SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、
Chint_end、CHINT_DISABLE);
//
//为 RX 配置 DMA CH2
//
DMACH6AddrConfig (DMADest、SpibRegs.SPIRXBUF);
DMACH6BurstConfig (RXBUST、0、1);
DMACH6TransferConfig (传输、0、1);
DMACH6ModeConfig (DMA_SPIBRX、PERINT_ENABLE、OneShot_disable、CONT_ENABLE、
SYNC_DISABLE、SYNC_SRC、OVRFLOW_DISABLE、十六位、
Chint_end、CHINT_DISABLE);
}
//
//文件结束
//
此致
您好!
我稍微更新了您的代码、使其在我的环境中运行。 我将 TX 和 RX FIFO 深度更改为12、并且能够看到数据被正确接收。
您能否重新检查您正在使用的 SPI/DMA 配置
附加我使用的代码
此致、
Veena
您好!
要添加、要配置的 TX 传输大小必须为(字数)/(16 - TXFIFO_LVL)-1而不是(字数)/(TXFIFO_LVL)-1
这是因为突发大小为16 - TXFIFO_LVL、而不 是 TXFIFO_LVL
此致、
Veena
你(们)好、Veena
感谢您的努力、是的、您的代码在12和8 TX、RX FIFO 级别上工作、但在10、11、13、14 FIFO 级别上不工作。 对于 FIFO 级别的每次变化、我都将字数更改为整数。 我变得更加困惑。
此致
非常感谢 Veena 的努力、
现在我已经知道了一点、但当禁用 DMA 的继续模式并使其自由运行时、数据会出现问题、但没关系。 感谢您的努力。
非常感谢