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/TMS570LS3137:LIN-DMA 接口驱动器延迟的 SCI 模式乱码

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/837315/ccs-tms570ls3137-sci-mode-of-lin-dma-interface-driver-delay-garbled-code

器件型号:TMS570LS3137

工具/软件:Code Composer Studio

在配置了 LIN-DMA ( 131/132引脚)的 TMS570LS31 SCI 模式后、如果延迟增加、将发送一个乱码;如果延迟被删除、将正常发送。请问原因是什么?

软件配置如下:

sciBASE-t* uartREG[2]={sciREG、scilinREG};
/*
*@简介:

* UART 初始化

*@参数:

* uartx:序列号、0或1

* buad_rate:串行端口波特率

*奇偶校验:(-1个不带奇偶校验、0个偶校验、1个奇偶校验)

*
void bsp_uart_open (uint8 uartx、uint32 buad_rate、sint8奇偶校验)

uint8 Paren =奇偶校验=-1? 0:1;
uint8 parVal =奇偶校验= 1? 0:1;

uartx &= 0x3;
/**初始化 SCI */
uartREG[uartx]->GCR1 &=~0x80U;
/**-使 SCI 退出复位*/
uartREG[uartx]->GCR0 = 0U;
uartREG[uartx]->GCR0 = 1U;

/**-禁用所有中断*/
uartREG[uartx]->CLEARINT = 0xFFFFFFU;
uartREG[uartx]->CLEARINTLVL = 0xFFFFFFU;

/**-全局控制1 */
uartREG[uartx]->GCR1 =(uint32)((uint32) 1U <<25U)//启用发送
|(uint32)((uint32) 1U << 24U)/*启用接收*/
|(UINT32)((UINT32) 1U << 5U)//内部时钟(器件没有时钟引脚)*/
|(uint32)((uint32) 0U << 4U)/*停止位数*/
|(uint32)((uint32) parVal << 3U)/*偶校验、否则为奇数*/
|(uint32)((uint32) Paren << 2U)/*启用奇偶校验*/
|(uint32)((uint32) 1U << 1U);/*异步计时模式*/

/**-设置波特率*/
uartREG[uartx]->BRS = buad_rate;/*波特率*/

/**-传输长度*/
uartREG[uartx]-->格式= 8U - 1U;/*长度*/

/**-设置 SCI 引脚功能模式*/
uartREG[uartx]->PIO0=(uint32)((uint32) 1U <<2U)/* TX 引脚*/
|(uint32)((uint32) 1U << 1U);/* Rx 引脚*

/**-设置 SCI 引脚默认输出值*/
uartREG[uartx]->PIO3=(uint32)((uint32) 0U <<2U)/* TX 引脚*/
|(uint32)((uint32) 0U << 1U);/* Rx 引脚*

/**-设置 SCI 引脚输出方向*/
uartREG[uartx]->PIO1=(uint32)((uint32) 1U <<2U)/* TX 引脚*/
|(uint32)((uint32) 0U << 1U);/* Rx 引脚*

/**-设置 SCI 引脚开漏使能*/
uartREG[uartx]->PIO6 =(uint32)((uint32) 0U <<2U)/* TX 引脚*/
|(uint32)((uint32) 0U << 1U);/* Rx 引脚*

/**-设置 SCI 引脚上拉/下拉使能*/
uartREG[uartx]->PIO7=(uint32)((uint32) 0U <<2U)/* TX 引脚*/
|(uint32)((uint32) 0U << 1U);/* Rx 引脚*

/**-设置 SCI 引脚上拉/下拉选择*/
uartREG[uartx]->PIO8=(uint32)((uint32) 1U <<2U)/* TX 引脚*/
|(uint32)((uint32) 1U << 1U);/* Rx 引脚*

/**-设置中断级别*/
uartREG[uartx]->SETINTLVL =(uint32)((uint32) 0U <<26U)//帧错误
|(uint32)((uint32) 0U << 25U)/*溢出错误*/
|(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/
|(uint32)((uint32) 0U << 9U)//接收*/
|(uint32)((uint32) 0U << 8U)/*发送*/
|(uint32)((uint32) 0U << 1U)/*唤醒*/
|(uint32)((uint32) 0U << 0U);/*中断检测*

/**-设置中断使能*/
uartREG[uartx]->SETINT =(uint32)((uint32) 0U <<26U)/*帧错误*/
|(uint32)((uint32) 0U << 25U)/*溢出错误*/
|(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/
|(uint32)((uint32) 0U <<9U)/* 1接收*/
|(uint32)((uint32) 0U << 1U)/*唤醒*/
|(uint32)((uint32) 0U << 0U);/*中断检测*
/**-初始化全局传输变量*/
G_sciTransfer_t[uartx].mode =(uint32) 0U << 8U;
G_sciTransfer_t[uartx].TX_length = 0U;
G_sciTransfer_t[uartx].rx_length = 0;
/**-最终启动 SCI */
uartREG[uartx]->GCR1 |= 0x80U;



#define SCI_TX_ADDR ((uint32_t)(&(uartREG[0]->TD))+ 3)
#define SCI_RX_ADDR ((uint32_t)(&(uartREG[0]->RD))+ 3)
#define LIN_TX_ADDR ((uint32_t)(&(uartREG[1]->TD))+ 3)
#define LIN_RX_ADDR ((uint32_t)(&(uartREG[1]->RD))+ 3)
#define DMA_SCI_TX DMA_REQ31
#define DMA_SCI_RX DMA_REQ30
#define DMA_LIN_TX DMA_REQ29
#define DMA_LIN_RX DMA_REQ28

#define SCI_SET_TX_DMA (1<<16)
#define SCI_SET_RX_DMA (1<<17)
#define SCI_SET_RX_DMA_ALL (1<<18)


void bsp_dma_enable (uint8 uartx、uint8 * txData、uint16 txSize、uint16 TX_CHX、uint8 * rxData、uint16 rxSize、uint16 Rx_CHX);
uint8_t bsp_dma_send_data (uint16_t txSize、uint16 TX_CHX);
uint32_t bsp_dma_get_data (uint8_t * rxData、uint16 rxSize、uint16 rx_chx);


void bsp_dma_enable (uint8 uartx、uint8 * txData、uint16 txSize、uint16 TX_CHX、uint8 * rxData、uint16 rxSize、uint16 Rx_CHX)

uint32_t sciTxData、sciRxData;
g_dmaCTRL g_dmaCTRLPPKT1、g_dmaCTRLPPKT2;
while (((uartREG[uartx]->FLR & SCI_TX_INT)== 0U)||(((uartREG[uartx]->FLR & 0x4)=0x4))

}/*等待*/
if (uartx = 0x0)

/*分配 DMA 请求 SCI 发送到 TX 通道 x*/
dmaReqAssign (TX_CHX、DMA_SCI_TX);

/*将 DMA 请求 SCI 接收分配给 Rx 通道 x*/
dmaReqAssign (Rx_CHX、DMA_SCI_RX);

其他

/*分配 DMA 请求 SCI 发送到 TX 通道 x*/
dmaReqAssign (TX_CHX、DMA_LIN_TX);

/*将 DMA 请求 SCI 接收分配给 Rx 通道 x*/
dmaReqAssign (Rx_CHX、DMA_LIN_RX);

SCI/LIN 8位 TX/Rx 数据的地址*/
if (uartx = 0x0)

sciTxData = SCI_TX_ADDR;
sciRxData = SCI_RX_ADDR;

其他

sciTxData = LIN_TX_ADDR;
sciRxData = LIN_RX_ADDR;

if (txSize >0){
/*为 TX 通道 x*/配置控制数据包
G_dmaCTRLPKT1.Sadd =(uint32_t) txData;/*源地址*
G_dmaCTRLPKT1.DADD = sciTxData;/*目标地址*
G_dmaCTRLPKT1.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT1.FRCNT = txSize;/*帧计数*/
G_dmaCTRLPKT1.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT1.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT1.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT1.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT1.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT1.PORTASGN = 4;/*仅 PORTB *
G_dmaCTRLPKT1.RDSIZE = ACCESS_8_BIT;/*读取大小*
G_dmaCTRLPKT1.WRSIZE = ACCESS_8_BIT;/*写入大小*
G_dmaCTRLPKT1.tType = FRAME_TRANSFSION;/* TRANSFSION TYPE *
G_dmaCTRLPKT1.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKT1.ADDMODEWR = ADDR_FIXED;/*地址模式写入*
G_dmaCTRLPKT1.AUTOINIT = AUTOINIT_OFF;/*自动初始化*/
/*为 TX 通道 x*/设置 TX 控制数据包
dmaSetCtrlPacket (TX_CHX、g_dmaCTRLPKT1);
/*启用 uartx 发送 DMA 请求*/
uartREG[uartx]->SETINT |= SCI_SET_TX_DMA;
uartREG[uartx]->SETINT |=((uint32_t) 1<<8);
uartREG[uartx]->TD = 48;

if (rxSize >0){
/*为通道 x*/配置控制包
G_dmaCTRLPKT2.Sadd = sciRxData;/*源地址*/
G_dmaCTRLPKT2.DADD =(uint32_t) rxData;//目标地址*/
G_dmaCTRLPKT2.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT2.FRCNT = rxSize;/*帧计数*/
G_dmaCTRLPKT2.ELCNT = 1;/*元素计数*/
G_dmaCTRLPKT2.ELDOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT2.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKT2.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT2.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT2.PORTASGN = 4;/*仅 PORTB *
G_dmaCTRLPKT2.RDSIZE = ACCESS_8_BIT;/*读取大小*
G_dmaCTRLPKT2.WRSIZE = ACCESS_8_BIT;/*写入大小*
G_dmaCTRLPKT2.tType = FRAME_TRANSFSION;/* TRANSFSION TYPE *
G_dmaCTRLPKT2.ADDMODERD = ADDR_FIXED;/*地址模式读取*/
G_dmaCTRLPKT2.ADDMODEWR = ADDR_INC1;/*地址模式写入*
G_dmaCTRLPKT2.AUTOINIT = AUTOINIT_OFF;/*自动初始化*
/*为通道 x*/设置 Rx 控制数据包
dmaSetCtrlPacket (Rx_CHX、g_dmaCTRLPKT2);
/*启用 uartx 接收 DMA 请求*/
uartREG[uartx]->SETINT |= SCI_SET_RX_DMA | SCI_SET_RX_DMA_ALL;

/*启用 DMA*/
dmaEnable();


uint8_t bsp_dma_send_data (uint16_t txSize、uint16 TX_CHX)

uint32_t * ptr;
uint32_t i;
/*设置 DMA TX 帧计数*/
dmaRAMREG->PCP[TX_CHX].ITCOUNT =(txSize<16)|0x01;
/*启用 DMA TX 通道以在硬件请求时触发*/
dmaSetChEnable (TX_CHX、DMA_HW);
/*等待完成*/
while ((dmaREG->BTFFLAG&(uint32_t) 1< }
dmaREG->BTFLAG ||((uint32_t) 1<BTFLAG <tx_CHx);
返回0;

延迟设置如图所示:

我用示波器抓取了波形。

当调试引脚131/132的 LIN 端口 SCI 模式时、这是无延迟的正常输出波形。 发送的数据为(0x55、0xAA)、正常接收数据为(0x55、0xAA)。


这是设置延迟然后发送数据(0x55、0xAA)(随机代码段)的起始状态波形。

这是设置延迟并发送数据(0x55、0xAA)一段时间后的波形。 在延迟的空闲状态中、如图所示、始终存在低电平、类似于始终发送 FF 信号。