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.
您好!
我正在处理 RM48L952 HDK。 我使用 MibSPI1作为主器件来发送数据、使用 MibSPI5作为从器件来接收数据。 我已经使用 Halcogen 中给出的 DMA 示例尝试了 mibspi、并根据我的要求对其进行了修改。 我将提供以下代码:
*示例数据模式配置*/
#define D_SIZE 127
void loadDataPattern (uint32 psize、uint16* pptr);
//void mibspiEnableInternalLoopback (mibspi_t * mibspi);
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
void mibspiddmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel);
uint16 TX_DATA[D_SIZE];//系统 RAM 中的发送缓冲器*/
uint16 RX_DATA[D_SIZE]={0};//系统 RAM 中的接收缓冲区
G_dmaCTRL g_dmaCTRLPKT_Tx;/* DMA 控制数据包配置堆栈*/
G_dmaCTRL g_dmaCTRLPKPT_Rx;
/*用户代码结束*/
/*用户代码开始(2)*/
/*用户代码结束*/
void main (void)
{
/*用户代码开始(3)*/
/*-在系统 RAM 中创建数据块,以...开始 *
loadDataPattern (D_size、&TX_DATA[0]);
/*-初始化 mibspi -启用 TG 0,长度127 (halcogen 文件)*/
mibspiInit();
/*-分配 DMA 请求:带有请求线的通道0 - 1 */
dmaReqAssign (0,1);
dmaReqAssign (1.6);
/*-配置 DMA 控制数据包*/
dmaConfigCtrlTxPacket ((uint32)(&TX_DATA)、(uint32)(&(mibspiRAM1->TX[0].data))、D_size);
dmaConfigCtrlRxPacket ((uint32)(&(mibspiRAM3->Rx[0].data))、(uint32)(&RX_DATA)、D_size);
支持多达32个控制数据包。 *
/*-设置 DMA 控制数据包*/
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT_Tx);
dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT_Rx);
/*-将 DMA 通道设置为在硬件请求时触发*/
dmaSetChEnable (DMA_CH0、DMA_HW);
dmaSetChEnable (DMA_CH1、DMA_HW);
/*-配置 mibspi DMA、通道0、TX 线路-0、rxline -1 */
/*-请参阅器件数据表 mibspi TX/Rx 的 DMA 请求源*/
mibspiDmaConfig (mibspiREG1、0、0、1);
/*-启用 DMA 模块*/
dmaEnable();
/*-启动 mibspi 传输 TG 0 */
mibspiTransfer (mibspiREG1,0);
/*... 等待传输完成*/
while (!(mibspiIsTransferComplete (mibspiREG1、0)))
{
};
/*从 mibspi ram 复制到 sys ram */
mibspiGetData (mibspiREG5、0、RX_DATA);
while (1);/*循环永远*/
/*用户代码结束*/
}
/*用户代码开始(4)*/
void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)
{
uint32 bufid = 0;
uint32 icount = 0;
/*设置发送和接收通道*/
mibspi->DMACTRL[通道]|=(((rxchannel<<4)|txchannel)<< 16);
/*启用发送和接收 DMA */
mibspi->DMACTRL[通道]|= 0x8000C000;
/*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
mibspi->DMACTRL[通道]|=(计数<<8)|(计数<<24);
}
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_Tx.Sadd =添加;/*源地址*
G_dmaCTRLPKT_Tx.DADD = dadd;/*目标地址*
G_dmaCTRLPKT_Tx.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT_Tx.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT_Tx.ELCNT = dsize;/*元素计数*
G_dmaCTRLPKPT_Tx.ELDOFFSET = 4;/*元素目标偏移量*
G_dmaCTRLPKPT_Tx.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKPT_Tx.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKPT_Tx.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT_Tx.PORTASGN = 4;/*端口 b *
G_dmaCTRPKT_Tx.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_Tx.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_Tx.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_Tx.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKPT_Tx.ADDMODEWR = ADDR_OFFSET;/*地址模式写入*
G_dmaCTRPKT_Tx.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_Rx.Sadd =添加;/*源地址*
G_dmaCTRLPKT_Rx.DADD = dadd;/*目标地址*
G_dmaCTRLPKT_Rx.CHCTRL = 0;/*通道控制*
G_dmaCTRLPKT_Rx.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT_Rx.ELCNT = dsize;/*元素计数*
G_dmaCTRLPKPT_Rx.ELDOFFSET = 4;/*元素目标偏移量*
G_dmaCTRLPKPT_Rx.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKPT_Rx.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_Rx.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_Rx.PORTASGN = 4;/*端口 b *
G_dmaCTRPKT_Rx.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_Rx.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_Rx.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_Rx.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKPT_Rx.ADDMODEWR = ADDR_OFFSET;/*地址模式写入*
G_dmaCTRPKT_Rx.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void loadDataPattern (uint32 psize、uint16* pptr)
{
int i;
for (i=0;<psize;i++))
{
pptr[i]= i;
}
}
/*用户代码结束*/
我无法在 mibspi5末尾接收数据 代码有什么问题? 我不确定用于 mibspi5的通道和请求线路是否正确。 我已连接了 mibspi1和 mibsi5 (SOMI 至 SOMI、SIMO 至 SIMO、CLK 至 CLK 以及 CS_1至 CS_1)。 在 Halcogen 中、我已将 CS_1用于 tg0。
谢谢
请参阅我在 TMS570LC4357器件上使用的示例。
e2e.ti.com/.../rm48l952-mibspi-transmit-and-receive-over-dma
谢谢王、
我能够使用 DMA 发送和接收数据。 我使用了其他线程 e2e.ti.com/.../mibspi-as-slave-with-dma
现在、我要发送大量数据、即610字节。 是否可以发送此大数据? 此外、我想知道一次可以发送多少数据。
谢谢、
您好、Wang、
我能够发送256字节的数据。 在 Halcogen 中、我已将 MibSPI1的 tg0和 tg1长度设置为128、MibSPI1是我的主器件、我可以看到256字节的数据、但是如果使用 tg2和 tg3、将长度设置为128、我仍然只能看到256字节。
您能帮我将其设置为610字节。
/*用户代码开始(0)*/
/*用户代码结束*/
/*包含文件*/
#include "sys_common.h"
/*用户代码开始(1)*/
#include "mibspi.h"
#include "sys_dma.h"
#include "stdio.h"
/*用户代码结束*/
/**@fn void main (void)
*@应用程序主函数简介
*@请注意、默认情况下、此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*
/*用户代码开始(2)*/
void mibspiddmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel);
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
void loadDataPattern1 (uint32 psize、uint8* pptr);
void loadDataPattern3 (uint32 psize、uint8* pptr);
#define D_SIZE 610
#define DMA_CH_TX DMA_CH0
#define DMA_CH_RX DMA_CH1
系统 RAM 中的/* SPI1发送缓冲器*/
uint8 mibSPI1_TX_Data[D_size]="$GPZDA、hmmss.ss、dd、mm、yyyy、aa、bb*CS $GPGLL、lllll.lllll、a、yyyyy.yyyyy、b、hmmss.ss、c、A*CS $GPGSV、t、n、xx、aa、ee、zzz、cc、aa、ee、zzz、cc、aa、ee、zzz、cc、aa、ee、zzz、cc* CS $GPRMC、hmmss.ss、a、lllll.lllll、a、yyy.yyyyy、B、ss.ss、hhhh、DDMMY,mm.m、D、B*CS $GPGGA、hmmss.ss、lllll.lllll、a、yyy.yyyyy、B、q、nn、hh.h、AAAAA.A、M、SSS.s、M、a.a、AAAA* CS $GPGSA,a,a,a,m,s1,s2,s3,s4,s5,s6,s7,s8,s9,s10, s11,s12, pp.p,hhh.h,v.v*CS $GPVTG、dd.dd、T、ddd、dd、M、ss.ss、N、ss.ss、K、A*CS ";
系统 RAM 中的/* SPI2发送缓冲器*/
uint8 mibSPI3_TX_Data[D_SIZE];
系统 RAM 中的/* SPI1接收缓冲器*/
uint8 mibSPI1_RX_Data[D_size]={0};
系统 RAM 中的/* SPI2接收缓冲器*/
uint8 mibSPI3_RX_Data[D_SIZE]={0};
G_dmaCTRL g_dmaCTRLPKT_RX;//接收的 DMA 控制数据包配置堆栈*
G_dmaCTRL g_dmaCTRLPKT_TX;//用于发送的 DMA 控制数据包配置堆栈*
/*用户代码结束*/
int main (空)
{
/*用户代码开始(3)*/
uint32 i;
/*-初始化 mibspi -启用传输组0,长度128 (halcogen 文件)*/
mibspiInit();
//loadDataPattern1 (D_size、&mibSPI1_TX_Data[0]);
loadDataPattern3 (D_size、&mibSPI3_TX_Data[0]);
/******** /
/* DMA 请求源:MIBSPI3[0]->请求行15 */
dmaReqAssign (DMA_CH_TX,15);/*发送数据 DMA 通道使能。 *
/* DMA 请求源:MIBSPI3[1]->请求行14 */
dmaReqAssign (DMA_CH_RX,14);/*接收数据 DMA 通道启用。 *
/*-配置 DMA 控制数据包以将数据发送到 mibSPI3 TX 缓冲区*/
dmaConfigCtrlRxPacket ((uint32)&(mibspiRAM3->rx[0].data)、(uint32)&(mibSPI3_RX_Data)、D_size);
/*-配置 DMA 控制数据包以从 mibSPI3 Rx 缓冲区接收数据*/
dmaConfigCtrlTxPacket ((uint32)&(mibSPI3_TX_Data)、(uint32)&(mibspiRAM3->TX[0].data)、D_size);
/*-设置用于传输的 DMA 控制数据包*/
dmaSetCtrlPacket (dma_ch_tx、g_dmaCTRLPKT_TX);
/*-为接收设置 DMA 控制数据包*/
dmaSetCtrlPacket (dma_ch_RX、g_dmaCTRLPKT_RX);
/*-配置 mibspi DMA、通道0、txline -15、rxline -14 */
mibspiDmaConfig (mibspiREG3、dma_ch_tx、14、15);
/******** /
/* DMA 请求源:MIBSPI1[0]->请求行1 */
dmaReqAssign (DMA_CH_TX,1);
/*-分配 DMA 请求:通道1 */
/* DMA 请求源:MIBSPI1[1]->请求行0 */
dmaReqAssign (DMA_CH_RX,0);
/*-配置 DMA 控制数据包以将数据发送到 mibSPI1 TX 缓冲区*/
dmaConfigCtrlTxPacket ((uint32)&(mibSPI1_TX_Data)、(uint32)&(mibspiRAM1->TX[0].data)、D_size);
/*-配置 DMA 控制数据包以从 mibSPI1 Rx 缓冲区接收数据*/
dmaConfigCtrlRxPacket ((uint32)&(mibspiRAM1->rx[0].data)、(uint32)&(mibSPI1_RX_Data)、D_size);
/*-设置用于传输的 DMA 控制数据包*/
dmaSetCtrlPacket (dma_ch_tx、g_dmaCTRLPKT_TX);// RAM 到 MIBSPIRAM
/*-为接收设置 DMA 控制数据包*/
dmaSetCtrlPacket (dma_ch_RX、g_dmaCTRLPKT_RX);// MIBSPIRAM 到 RAM
/*-配置 mibspi DMA、通道0、txline -1、rxline -0*/
mibspiDmaConfig (mibspiREG1、dma_ch_tx、0、1);
/******** /
/*-将 DMA 通道设置为在硬件请求时触发*/
dmaSetChEnable (DMA_CH_TX、DMA_HW);
dmaSetChEnable (DMA_CH_RX、DMA_HW);
/*接收数据后启用中断*/
dmaEnableInterrupt (DMA_CH_TX、FTC);/* FTC:帧传输完成中断*
dmaEnableInterrupt (DMA_CH_RX、FTC);/* FTC:帧传输完成中断*
_enable_IRQ ();
/*立即启用 DMA 以确保它已准备好接受请求*/
dmaEnable();
/****设置从属设备***** /
/*启动接收缓冲区*/
mibspiSetData (mibspiREG3、1、mibSPI3_TX_Data);
/*-启动 mibspi 传输 TG 1 */
mibspiTransfer (mibspiREG3、1);
/****设置主设备****/
/*启动传输缓冲区*/
mibspiSetData (mibspiREG1、0、mibSPI1_TX_Data);
/*-启动 mibspi 传输 TG 0 */
mibspiTransfer (mibspiREG1、0);
/*... 等待传输完成*/
while (!(mibspiIsTransferComplete (mibspiREG1、0)));
while (!(mibspiIsTransferComplete (mibspiREG3、1)));
/*从 mibspi ram 复制到 sys ram */
mibspiGetData (mibspiREG3、1、mibSPI3_RX_Data);
for (i=0;i<=D_SIZE;i++)
{
printf ("\r\n%d mibSPI1_TX_Data:0x%04x mibSPI3_RX_Data:0x%04x "、i、mibSPI1_TX_Data[i]、mibSPI3_RX_Data[i]);
}
while (1);
/*用户代码结束*/
返回0;
}
/*用户代码开始(4)*/
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_TX.Sadd =添加;/*源地址*
G_dmaCTRLPKT_TX.DADD = dadd;/*目标地址*
G_dmaCTRLPKT_TX.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT_TX.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT_TX.ELCNT = dsize;/*元素计数*
G_dmaCTRLPKPT_TX.ELDOFFSET = 4;/*元素目标偏移量*
G_dmaCTRLPKPT_TX.ELSOFFSET = 0;/*元素源偏移*
G_dmaCTRLPKPT_TX.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_TX.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_TX.PORTASGN = 4;/*端口 b *
G_dmaCTRLPKT_TX.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_TX.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_TX.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_TX.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKPT_TX.ADDMODEWR = ADDR_OFFSET;/*地址模式写入*
G_dmaCTRPKT_TX.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_RX.Sadd =添加;/*源地址*
G_dmaCTRLPKT_RX.DADD =添加;/*目标地址*
G_dmaCTRLPKT_RX.CHCTRL = 0;/*通道控制*
G_dmaCTRLPKT_RX.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT_RX.ELCNT = dsize;/*元素计数*
G_dmaCTRLPKPT_RX.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPPKT_RX.ELSOFFSET = 4;/*元素源偏移*
G_dmaCTRLPKPT_RX.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_RX.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_RX.PORTASGN = 4;/*端口 b *
G_dmaCTRPKT_RX.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_RX.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_RX.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_RX.ADDMODERD = ADDR_OFFSET;/*地址模式读取*
G_dmaCTRPKT_RX.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRPKT_RX.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)
{
uint32 bufid = D_size - 1;
uint32 icount = 0;
/*设置发送和接收通道*/
mibspi->DMACTRL[通道]|=(((rxchannel<<4)|txchannel)<< 16);
//启用发送 DMA */
mibspi->DMACTRL[通道]|= 0x00008000;// RX DMA 启用
mibspi->DMACTRL[通道]|= 0x00004000;// TX DMA 使能
/*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
mibspi->DMACTRL[通道]|=(计数<<8)|(计数<<24);
}
void loadDataPattern1 (uint32 psize、uint8* pptr)
{
int i;
for (i=0;<psize;i++))
{
pptr[i]= i;
}
}
void loadDataPattern3 (uint32 psize、uint8* pptr)
{
int i;
for (i=0;<psize;i++))
{
PPTR]= I+128;
}
}
/*用户代码结束*/
谢谢
通过使用 DMAxCOUNT 和 DMACNTLEN 寄存器、MibSPI 可以传输一个最多为65535 (65K)个字的块。
您好、Wang、
我已经尝试使用 DMAxCOUNT 和 DMACNTLEN、但仍然只能传输256字节的数据。 您能否检查我所做的工作是否正确?
我两天前回答了、但我不知道为什么没有发布我的答案。
在代码中、MibSPI1和 MibSPI3使用相同的 DMA 通道、请为 MibSPI3使用单独的 DMA 通道。 DMA 封装配置中的元素大小为610。 我建议您使用 TG 大小作为元素大小。
如果使用10个 TMibSPI1 G0缓冲区进行传输、使用10个 MibSPI3 TG0缓冲区接收数据、并且总数据大小为610个半字、 则可以配置元素大小= 10、帧大小= 610/10=61
请像我在以下函数中所做的那样更改您的 MibSPI DMA 配置:
void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)
{
uint32 bufid;
if (mibspi =mibspiREG1){
bufid = tgPSTART1[通道]+ E_COUNT - 1;
}否则{
bufid = tgPSTART3[通道]+ E_COUNT - 1;
}
/*设置发送和接收通道*/
mibspi->DMACTRL[通道]|=(rxchannel << 20)|(txchannel << 16);
如果(F_COUNT > 1){
mibspi->TGCTRL[通道]&= 0xBFFFFFFF;//禁用 OneShot
}否则{
mibspi->TGCTRL[通道]|= 0x40000000;//启用 OneShot
}
/*启用发送和接收 DMA */
mibspi->DMACTRL[通道]|= 0x8000C000;
/*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
mibspi->DMACTRL[通道]|=(bufid=24);
/*启用大计数传输*/
mibspi->DMACNTLEN = 0x1;
mibspi->DMACOUNT[通道]=(F_COUNT - 1)<< 16;
}
您好、Wang、
很抱歉回复迟到了。 我在其他一些工作中很忙、看不到这一点。
根据您的建议、我将元素大小更改为128、因为 TG 0的缓冲区大小为128。 此外、我将帧计数更改为610/128 = 5 (舍入)。
我更改了 您给出的 MibSPI DMA 配置。 我只是想知道您的代码中的 tgPSTART1 E_COUNT 和 F_COUNT 是什么。
tgPSTART1: TG 起始地址。 对于 TG0、它为0。
e_count:元素数量:128
F_COUNT:帧数、5
您好、Wang、
我更改了代码、但现在即使是前255个字节也会损坏。 更改的代码如下所示:
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_TX.Sadd =添加;/*源地址*
G_dmaCTRLPKT_TX.DADD = dadd;/*目标地址*
G_dmaCTRLPKT_TX.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT_TX.FRCNT = 5;/*帧计数*
G_dmaCTRLPKT_TX.ELCNT = 128;/*元素计数*
G_dmaCTRLPKPT_TX.ELDOFFSET = 4;/*元素目标偏移量*
G_dmaCTRLPKPT_TX.ELSOFFSET = 0;/*元素源偏移*
G_dmaCTRLPKPT_TX.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_TX.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_TX.PORTASGN = 4;/*端口 b *
G_dmaCTRLPKT_TX.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_TX.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_TX.tType = block_transfer;/* transfer type *
G_dmaCTRPKT_TX.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKPT_TX.ADDMODEWR = ADDR_OFFSET;/*地址模式写入*
G_dmaCTRPKT_TX.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_RX.Sadd =添加;/*源地址*
G_dmaCTRLPKT_RX.DADD =添加;/*目标地址*
G_dmaCTRLPKT_RX.CHCTRL = 0;/*通道控制*
G_dmaCTRLPKT_RX.FRCNT = 5;/*帧计数*/
G_dmaCTRLPKT_RX.ELCNT = 128;/*元素计数*
G_dmaCTRLPKPT_RX.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPPKT_RX.ELSOFFSET = 4;/*元素源偏移*
G_dmaCTRLPKPT_RX.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_RX.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_RX.PORTASGN = 4;/*端口 b *
G_dmaCTRPKT_RX.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_RX.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_RX.tType = BLOCK_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_RX.ADDMODERD = ADDR_OFFSET;/*地址模式读取*
G_dmaCTRPKT_RX.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRPKT_RX.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)
{
uint32 bufid;
if (mibspi =mibspiREG1){
bufid = 0 + 128 - 1;
}否则{
bufid = 3 + 128 - 1;
}
/*设置发送和接收通道*/
mibspi->DMACTRL[通道]|=(rxchannel << 20)|(txchannel << 16);
如果(5 > 1){
mibspi->TGCTRL[通道]&= 0xBFFFFFFF;//禁用 OneShot
}否则{
mibspi->TGCTRL[通道]|= 0x40000000;//启用 OneShot
}
/*启用发送和接收 DMA */
mibspi->DMACTRL[通道]|= 0x8000C000;
/*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
mibspi->DMACTRL[通道]|=(bufid=24);
/*启用大计数传输*/
mibspi->DMACNTLEN = 0x1;
mibspi->DMACOUNT 通道=(5 - 1)<< 16;
}
这是我的示例项目。 我的设置中的缓冲区数量为64。
MibSPI1是 SPI 主器件、MibSPI3是 SPI 从器件。 代码在 TMS570LS12x Launchpad 上进行了测试。
e2e.ti.com/.../TMS570LS1224_5F00_MibSPI_5F00_DMA_5F00_BigBlock.zip
感谢 您的观看、
我会检查这个问题、并尝试找出我的问题所在。
再次感谢。
您可以更改 TG0中的缓冲区数量。 之后、您需要更改 sys_main.c 中的 E_COUNT