主题中讨论的其他器件: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
