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.
工具/软件: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 信号。
您好、Luke、
您是否尝试过此应用手册中的示例?
您好 QJ、
我找不到示例。 TMS570LS3137是否有任何 SCI 例程代码?
Luke、
以下是应用手册的链接: