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:使用 DMA 的 MibSpi Tx 和 Rx

Guru**** 2124380 points
Other Parts Discussed in Thread: RM48L952, HALCOGEN, TMS570LC4357
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/984724/rm48l952-mibspi-tx-and-rx-using-dma

器件型号:RM48L952
主题中讨论的其他器件: HALCOGENTMS570LC4357

您好!

我正在处理 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字节的数据。 您能否检查我所做的工作是否正确?

    e2e.ti.com/.../3364.SPI.zip

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

    对此进行了任何更新?

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

    我两天前回答了、但我不知道为什么没有发布我的答案。

    在代码中、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