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/TMS570LS3134:LIN-DMA 接口驱动程序延迟乱码

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/827014/ccs-tms570ls3134-lin-dma-interface-driver-delay-garbled-code

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

工具/软件:Code Composer Studio

配置 TMS570ls31 LIN-DMA 后、如果延迟增加、将发送一个乱码;如果删除了延迟、将正常发送。请问原因是什么?

软件配置如下:

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

* UART 初始化

*@参数:

* uartx:序列号、0或1

* buad_rate:串行端口波特率

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

下图是延迟后打印的乱码

这是无延迟打印的正常结果

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

    软件配置如下:

    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;

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

    • 延迟设置如图所示:

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

    Luke、

    uartREG[uartx]->TD = 48;在 DMA 设置中是什么? 只要 TXRDY 位置位、就会产生 TX DMA 请求。 DCI 模块初始化后、TXRDY 会自动置位。 对于第一次传输、您无需将数据写入 TD 寄存器。 请删除此说明。

    只启用 TX DMA (硬件触发)、但不启用 RX 的 DMA。

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

    您好 QJ,

    "UartREG [uartx]->SETINT |=((uint32_t) 1 < 8);

    UartREG [uartx]->TD = 48;"

    是在调试 LIN 端口时添加的语句。 调试 SCI 时、此指令代码不存在。

    如果 LIN 端口发送时没有此语句、则无法发送数据。

    但是、如果延迟增加、将发送乱码。

    我是否可以问造成这种情况的原因? 如何解决此问题?

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

    您好、Luke、

    Yo 说"UartREG [uartx]->TD = 48;"用于 LIN 模式。 但您的代码无法启用 LIN 模式。 通过设置 SCIGCR1寄存器的位6来启用 LIN 模式。

    您的 DMA 配置使用 LINTD1作为目标地址、但您的 SCI/LIN 配置不启用多缓冲模式。 编译工程时是否使用任何代码优化?

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

    您好 QJ,

    很抱歉、我没有说明自己。 我使用了 TMS570LS3137。

    "UartREG [uartx]->TD = 48;"

    调试38/39引脚的 SCI 模式时、未添加此指令代码。 当调试131/132引脚 LIN 端口的 SCI 模式时、如果未发送此语句、则无法发送数据。

    这句话仅供测试使用、即发送 ASCII 代码"0"。 正常初始化后、不会触发 LIN 的 DMA。 如果添加了一句话、则可以发送 DMA。

    顺便说一下、在该函数中、"void bsp_UART_open (uint8 uartx、uint32 buad_rate、sint8 rate);"、uartx 为1、表示131/132引脚 LIN 端口。

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

    程序可能有问题。 TMS570LS3137是否有任何 SCI 例程代码?

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

    Luke、

    请参阅以下使用带有 DMA 的 SCI 的应用手册:

    http://www.ti.com/lit/an/spna213/spna213.pdf

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

    您好 QJ,

    我在您提供的文档中使用的方法仍然不起作用。

    我用示波器抓取了波形。

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


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

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

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

    器件型号: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 信号。

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

    您好!

    我将代码复制到 HALCoGen 生成的项目中、但无法正常工作。 您能否发布整个项目?

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

    您好!

    我假设您已经解决了这个问题。