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.

[参考译文] CCS/TMS570LC4357:具有 DMA 的 MibSPI 主器件示例。 MIBSPI5通信不启动(spna231)

Guru**** 2605415 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/736834/ccs-tms570lc4357-mibspi-master-w-dma-example-mibspi5-communication-does-not-start-spna231

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

工具/软件:Code Composer Studio

我尝试将示例代码从 spna231.pdf (www.ti.com/.../spna231) 从 RM48移植到 TMS570LC43。 就我所见、MibSPI5的 DMA 通道对于两个控制器是相同的。

我复制了 HALCoGen 的所有相关设置、并将逻辑从原始工程的 main 复制到了 HL_SYS_MAIN。

该程序会编译并运行、但不会启动 MibSPI5通信。 我尝试在有和没有 ENA 功能的情况下使用它。

在 HALCoGen 中完成的设置:

驱动程序
---
MibSPI5
GIO (用于 LED)

MPU
--
启用 MPU 后台区域

GIO
--
将 GIOB_6设置为输出(用户 LED 2)

PINMUX
----
MibSPI5
GIOB6 J2

中断
---
33:

MibSPI5上的 DMA FTCA
---

数据








格式为0
波特率20000
的数据格式为 DLN 上的 TIM 上的 DES 上的全局 OVR 等待使能--如果需要
奇偶校验使能-- 如果需要
,WDELAY 5

延迟
7 5 10

传输组0
锁定传输
缓冲器模式5
Light 64
芯片选择保持
OneShot 传输


端口
SCI 1 SPI --未使用
SCI 2 SPI --未使用
SCI 3 SPI -- 未使用
SIMO1 DIR OUT
SIMO2 DIR OUT
SIMO3 DIR OUT

我已将移植的 CCS 项目附加到此报告中。

hl_sys_main.c 的内容(与原始 main.c 相同、但使用不同的 LED (一个来自 GIO B 6上的 LaunchXL2、而不是其中一个 HET 引脚)

/**@文件 hL_sys_main.c
*@简要应用程序主文件
*@日期2017年7月7日
*@版本04.07.00
*
*此文件包含一个空的主函数
*,可用于应用程序。
*/

*
版权所有(C) 2009-2016德州仪器(TI)公司- www.ti.com
*

*
*只要
符合以下条件*,就允许以源代码和二进制形式重新分发和使用,无论是否进行*修改:
*
*源代码的重新分发必须保留上述版权
声明*、此条件列表和以下免责声明。
*
*二进制形式的再发行必须在

*
发行版随附的*文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
*
*未经

事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件派生的产品*。
*
*本软件由版权所有者和贡献者
*按原样"提供、

且不承认任何明示或暗示的保证、包括但不限于*特定用途*的适销性和适用性的暗示保证。 在任何情况下、版权
*所有者或贡献者都不对任何直接、间接、偶然、
*特殊、模范、 或相应的损害(包括但不
限于*采购替代产品或服务;丧失使用、
*数据或利润; 或业务中断)、但出于
任何*责任理论、无论是合同、严格责任还是侵权
行为*(包括疏忽或其他原因)、即使
被告知可能会造成此类损坏、也是出于此类责任理论。
*
*/


*用户代码开始(0)*/
/*用户代码结束*

/*包含文件*/

#include "hL_sys_common.h"

/*用户代码开始(1)*/
#include "hL_sys_dma.h"
#include "hL_gio.h"
#include "hL_mibspi.h"

#define "hL_tbspi.h"#define LED8


源代码:#define DPORT:#define tb 对于 DMA、在64位上保持数据对齐非常重要*/
static uint16_t source[64];

mibspiRAM_t * const pMibSpiP5Ram = mibspiRAM5;


//*用户代码结束*//

//@fn void main (void)
*@简要应用 main 函数
*@注意默认情况下此函数为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*/

/*用户代码开始(2)*/
/*用户代码结束*/

int main (void)
{//
*用户代码开始(3)*/
int32_t i32Index = 0l;
uint16_t ui16Index2=0U;
uint16_t ui16Check = 0U;

G_dmaCTRL g_dmaCTRLPKT;

gioInit();
mibspiInit();

mibspiREG5->DMACNTLEN = 0ul;/*禁用大计数*/
mibspiREG5->DMACTRL[0]=(1ul << 31)//在 ICOUNT+1传输后自动禁用 DMA 通道(在 MibSPIP 中)。 *
|(63ul << 24)/*缓冲器用于触发 DMA 传输。 *
|(0ul << 20)/* RXDMA_MapX */
|(2ul << 16)/* TXDMA_MapX */
|(0ul << 15)/*接收数据 DMA 通道使能。 *
|(0ul << 14)/*发送数据 DMA 通道使能。 *
|(0ul << 13)/*非交错 DMA 块传输。 该位仅在主控模式下可用。 *
|(0ul << 8);// ICOUNTx */

/*启用 DMA 模块:这将使 DMA 退出复位*/
dmaEnable();

/*配置 DMA 控件打包(结构是 dma.c 的一部分)*/
G_dmaCTRLPKT.Sadd =(uint32_t)(&source[0]);//初始源地址*/
G_dmaCTRLPKT.DADD =(uint32_t)(&(pMibSpiP5Ram->TX[0].data);//初始目标地址*
G_dmaCTRLPKT.CHCTRL = 0ul;/*通道控制*
G_dmaCTRLPKT.RDSIZE = ACCESS_64_BIT;/*读取大小*
G_dmaCTRLPKT.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT.ELCNT =(sizeof (source)/sizeof (source[0]))/ 4;/*元素计数*/
G_dmaCTRLPKPT.ELSOFFSET = 1ul << g_dmaCTRLPKT.RDSIZE;//元素源偏移量*/
G_dmaCTRLPKPT.FRSOFFSET = 0ul << g_dmaCTRLPKT.RDSIZE;/*帧源偏移*
G_dmaCTRLPKT.ELDOFFSET = 2ul << g_dmaCTRLPKT.WRSIZE;//元素目标偏移量*/
G_dmaCTRLPKPT.FRDOFFSET = 0ul << g_dmaCTRLPKPT.WRSIZE;//帧目标偏移量*
G_dmaCTRLPKT.PORTASGN = 4ul;/*端口 b *
G_dmaCTRLPKPT.tType = frame_transfer;/* transfer type */
G_dmaCTRLPKT.ADDMODERD = ADDR_OFFSET; /*地址模式读取*/
G_dmaCTRLPKT.ADDMODEWR = ADDR_OFFSET; /*地址模式写入*/
G_dmaCTRLPKT.AUTOINIT = AUTOINIT_ON; /* autoinit、on、MIBSPI 控制 DMA 传输(ICOUNT)*/

/*将 DMA 控制包分配给通道0 */
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT);

/*分配 DMA 请求:带有请求线的通道0 - 8 */
dmaReqAssign (DMA_CH0、6ul);/*请求线路6是 MIBSPI5[2]、这是缓冲模式中的 MIBSPI5 *

/*将 DMA 通道0设置为在硬件请求时触发*/
dmaSetChEnable (DMA_CH0、DMA_HW);

/*启用并行模式以实现高数据吞吐量*/
mibspipmodeSet (mibspiREG5、pmode_4_dataline、DATA_FORMAT0);

操作
{
static _Bool qFirstLoop = true;
静态 uint32_t u32Count = 0ul;

ui16Check = 0U;

while (dmaREG->pend &(1ul << 0)!= 0ul)
{
/*等待 DMA TX 传输完成*/
}

while (mibspiREG5->DMACTRL[0]&(1ul << 14)!= 0ul)
{
/*等待 DMA TX 传输完成*/
}

/*生成一些虚拟数据以发送*/
for (i32Index = 0l;i32Index <(sizeof (source)/sizeof (source[0]))- 1);i32Index++)
{
/*计算虚拟数据包的校验和*/
ui16检查 += ui16Index2;
source[i32Index]= ui16Index2++;
}

/*将校验和添加到数据包的末尾*/
sourc[(sizeof (source)/sizeof (source[0]))- 1]= ui16Check;

/*在 MIBSPI 中启用 DMA 控制、这将被自动清除(自动禁用 DMA 通道功能)*/
/*第一个 DMA 请求脉冲在置位 TXDMAENAx 以加载第一个发送数据后立即生成。 *
mibspiREG5->DMACTRL[0]|=(1ul << 14);//发送数据 DMA 通道启用。 *

if (true =qFirstLoop)
{
while (dmaREG->pend &(1ul << 0)!= 0ul)
{
/*等待 DMA TX 传输完成*/
}

/*触发 MIBSPI 传输*/
mibspiTransfer (mibspiREG5、0ul);

qFirstLoop = false;
}
其他
{
/*不执行任何操作*/
}

if (u32Count % 10000ul == 0ul)
{
gioSetBit (LEDPORT、LEDPIN、!gioGetBit (LEDPORT、LEDPIN));
}

u32Count++;
}
while (1);

/*用户代码结束*/

返回0;
}//*


用户代码开始(4)*/*
用户代码结束*/

症状:程序运行在第一个主循环中、然后在第二个入口继续等待:

while (dmaREG->pend &(1ul << 0)!= 0ul)
{
/*等待 DMA TX 传输完成*/
}

MibSPI5引脚不会发生任何情况。 无 CS 低电平、无时钟、无数据流动。


我的项目已附加:

e2e.ti.com/.../8231.TMS570LC43_5F00_MibSPIP_5F00_Master_5F00_Single_5F00_DMA.zip

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

    要为 TX 使用 DMA 请求线路#6、请将2写入 DMACTL 寄存器的 TXDMA_MapX。

    我还建议将16位用于读取大小和写入大小、以及将地址模式用于读取 AS INC
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="QJ Wang ]Jan 您好、

    要为 TX 使用 DMA 请求线路#6、请将2写入 DMACTL 寄存器的 TXDMA_MapX。

    [/报价]

    我相信我会写下该值:

    |(2ul << 16)/* TXDMA_MapX */ 

    '我正在使用  来自 www.ti.com/.../spna231 的代码,项目 MibSPIP_Master_Single_DMA

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

    论坛上是否有人试用 了应用报告 SPNA231" 在基于 HerculesTm的微控制器上使用 MibSPIP 模块的高速串行总线"?

    如果是、您能否分享您是否对项目进行了更改、或者是否使用 了 pdf 中链接的项目

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

    您好 Jan、

    封闭的是我的已测试的 MibSPI+DMA 代码。

    MibSPI1用于 TX:DMA 通道1用于 TX、通道0用于 RX、TG0用于 TX

    MibSPI3是接收数据

    e2e.ti.com/.../6138.HL_5F00_sys_5F00_main.c

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

    该代码在 TMS570LC4357 Launchpad 上进行了测试。 MibSPI1和 MibSPI3通过导线连接。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢、我将进行检查。 我相信我已经测试了一个接近这一点的示例、它确实起了作用。

    这并不是因为我没有使 MibSPI 和 DMA 正常工作。 我正在 为教育版 BoosterPack MK II 编写的 LCD 驱动程序中使用它

    这是应用手册 spa231中的速度优化,我无法正常工作...

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

    您好、Jan、

    用于 DMA 的端口对于 RM48和 TMS570LC43x 是不同的。 DMA 使用 RM48中的端口 B (0x4)。 在 TMS570C43x 中:

    要将数据从 SRAM 传输到 MibSPI 寄存器或 MibSPI RAM、使用端口 A 读取和端口 B 写入(0x01、PARx 寄存器)

    2.要将数据从 MibSPI 寄存器或 MibSPI RAM 传输到 SRAM、使用端口 B 读取和端口 A 写入(0x00、PARx 寄存器)

    因此、代码中的语句应更改为:

    G_dmaCTRLPKT.PORTASGN = 0x01;

    G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTB_WRITE;

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

    我将检查这是不是我的问题

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

    [引用 user="QJ"]

    您好、Jan、

    用于 DMA 的端口对于 RM48和 TMS570LC43x 是不同的。 DMA 使用 RM48中的端口 B (0x4)。 在 TMS570C43x 中:

    要将数据从 SRAM 传输到 MibSPI 寄存器或 MibSPI RAM、使用端口 A 读取和端口 B 写入(0x01、PARx 寄存器)

    2.要将数据从 MibSPI 寄存器或 MibSPI RAM 传输到 SRAM、使用端口 B 读取和端口 A 写入(0x00、PARx 寄存器)

    因此、代码中的语句应更改为:

    G_dmaCTRLPKT.PORTASGN = 0x01;

    G_dmaCTRLPKT.PORTASGN = PORTA_READ_PORTB_WRITE;

    (笑声)

    就是这样! 谢谢 QJ。

    下面是具有4个并行引脚的 DMA 模式的捕获应用手册 SPNA231的主器件示例(仅显示 SIMO0和2):

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

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

    是的、谢谢。

    为了其他人的利益、我附上了工作示例的 CCS8和 HALCoGen 项目。

    它与 在 Hercules SPI 和 DMA 上编写的这一博客系列有关

    e2e.ti.com/.../2251.TMS570LC43_5F00_MibSPIP_5F00_Master_5F00_Single_5F00_DMA.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢 Jan 与我们分享您的工作代码!