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.

[参考译文] TMS570LC4357-EP:SCI 多缓冲模式

Guru**** 2478765 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/983374/tms570lc4357-ep-sci-multi-buffered-mode

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

您好!

在 SCI-A/LIN 上使用多缓冲模式时出现问题。

基本上、我希望每 n 个字节生成一个中断、以避免 CPU 过载过多。
我以为在多缓冲模式下、我可以在多少字节产生中断 RXDY 后进行选择、但它似乎不起作用。
以下是我的代码:

void sciInit (void)
{
/**-使 SCI1退出复位*/
SCI->GCR0=0U;
SCI->GCR0 = 1U;

/**-禁用所有中断*/
SCI->CLEARINT = 0xFFFFFFU;
SCI->CLEARINTLVL = 0xFFFFFFU;

/**-全局控制1 */
SCI->GCR1 =(uint32)((uint32) 1U <<25U)//启用发送*/
|(uint32)((uint32) 1U << 24U)/*启用接收*/
|(UINT32)((UINT32) 1U << 5U)//内部时钟(器件没有时钟引脚)*/
|(uint32)((uint32)(1U-1U)<<4U)/*停止位数*/
|(uint32)((uint32) 0U << 3U)/*偶校验、否则为奇数*/
|(uint32)((uint32) 0U << 2U)/*启用奇偶校验*/
|(uint32)((uint32) 1U << 1U)/*异步计时模式*/
|(uint32)((uint32) 1U << 16U)//启用了针对 test*/的回路模式
|(uint32)((uint32) 1U << 10U);//启用多缓冲模式

/**-设置波特率*/
SCI->BRS = 650U;/*波特率*/

/**-传输长度*/
SCI->format =/*0X0700 |*/(8U - 1U);/*长度(8个大小为8的字符,根据数据表)*/

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

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

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

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

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

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

/**-设置中断级别*/
SCI->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);/*中断检测*

/**-设置中断使能*/
SCI->SETINT =(uint32)((uint32) 0U <<26U)//帧错误
|(uint32)((uint32) 0U << 25U)/*溢出错误*/
|(uint32)((uint32) 0U << 24U)/*奇偶校验错误*/
|(uint32)((uint32) 1U <<9U)/*接收中断*/
|(uint32)((uint32) 0U << 1U)/*唤醒*/
|(uint32)((uint32) 0U << 0U);/*中断检测*

/**-最终启动 SCI1 */
SCI->GCR1 |= 0x80U;

} 

为了测试外设、我只发送一组虚拟字节并检查是否执行了 ISR (因为我正在回送中工作)。
如果没有多缓冲器、我可以每发送一个字节就有一个中断、并且运行正常、因此中断可以很好地进行配置、但在多缓冲模式下、ISR 永远不会执行(尽管 ISR 是每隔8个字节才执行一次)。

是否可以在不使用 DMA 的情况下在 n 个字节后生成中断? 如果是、如何获取数据? SCIRD 寄存器仅为1字节长度、我不知道数据将在哪里可用。

谢谢、

Marco。

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

    您好!

     您应该能够在不使用 DMA 的情况下执行多缓冲 SCI。  

    29.2.1.5 SCI 多缓冲模式
    为了在中断模式或 DMA 模式下接收或发送数据时减少 CPU 负载、SCI/LIN
    模块有八个独立的接收和发送缓冲器。 通过设置启用多缓冲模式
    Mbuf 模式位。
    多缓冲3位计数器对从 SCIRXSHF 寄存器传输到 RDY 的数据字节进行计数
    接收缓冲器和 TDY 发送缓冲器寄存器到 SCITXSHF 寄存器。 3位比较寄存器
    包含预期接收或发送的数据字节数。 中的长度值
    SCIFORMAT 寄存器指示预期的长度、用于装载3位比较寄存器。
    接收中断(RX 中断;请参阅 SCIINTVECT0和 SCIINTVECT1寄存器)和接收就绪
    SCIFLR 寄存器中的 RXRDY 标志置位、以及接收到 DMA 后可能产生的 DMA 请求(RXDMA)
    如果帧没有响应接收错误(例如、存在帧错误和溢出)、则响应
    错误)。

    29.2.4.1.2在多缓冲模式下接收数据
    当 Mbuf 模式位为1时、选择多缓冲模式。 在该模式下、当时 SCI 置位 RXRDY 位
    在接收缓冲器、即整个帧中接收到编程的数据数量。 错误条件
    检测逻辑与单缓冲模式相同、不同之处在于它监视整个帧。 如单个
    缓冲模式下、您可以使用中断、DMA 或轮询方法来读取数据。 接收到的数据
    从 LINRD0和 LINRD1寄存器中读取、具体取决于字节数。 长度小于的情况
    读 LINRD0寄存器将清零"RXRDY"标志。 如果长度大于4、则读取至
    LINRD1寄存器将清除“RXRDY”标志。

    我想您没有定义长度、长度指示从移位寄存器传输到接收缓冲区的字节数。  

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

    您好、Charles、

    在我之前发布的代码中、已注释掉了、但我已经完成了一组测试:

    /**-传输长度*/
    SCI->format = 0x0700 |(8U - 1U);/* length */ 

    此行会使长度= 8、字符= 8、因此我需要8个字节。

    在该配置中

    /**-全局控制1 */
    SCI->GCR1 =(uint32)((uint32) 1U <<25U)//启用发送*/
    |(uint32)((uint32) 1U << 24U)/*启用接收*/
    |(UINT32)((UINT32) 1U << 5U)//内部时钟(器件没有时钟引脚)*/
    |(uint32)((uint32)(1U-1U)<<4U)/*停止位数*/
    |(uint32)((uint32) 0U << 3U)/*偶校验、否则为奇数*/
    |(uint32)((uint32) 0U << 2U)/*启用奇偶校验*/
    |(uint32)((uint32) 1U << 1U)/*异步计时模式*/
    |(uint32)((uint32) 1U << 16U)/*环回模式*/
    |(uint32)((uint32) 1U << 10U);//多缓冲*/**
    -传输长度*/
    SCI->format = 0x0700 |(8U - 1U);/* length */ 

    不起作用、但在此配置中:

    /**-全局控制1 */
    SCI->GCR1 =(uint32)((uint32) 1U <<25U)//启用发送*/
    |(uint32)((uint32) 1U << 24U)/*启用接收*/
    |(UINT32)((UINT32) 1U << 5U)//内部时钟(器件没有时钟引脚)*/
    |(uint32)((uint32)(1U-1U)<<4U)/*停止位数*/
    |(uint32)((uint32) 0U << 3U)/*偶校验、否则为奇数*/
    |(uint32)((uint32) 0U << 2U)/*启用奇偶校验*/
    |(uint32)((uint32) 1U << 1U)/*异步计时模式*/
    |(uint32)((uint32) 1U << 16U)/*环回模式*/
    |(uint32)((uint32) 1U << 10U);//多缓冲*/**
    -传输长度*/
    SCI->format =(8U - 1U);/* length */ 

    工作。

    发送字节的代码如下所示简单:

    int i、m;
    for (i=0;i<200;i++)
    {
    sciSendByte (sciREG1、dummy + i);
    for (n = 0;n<1000;n++)/*尝试输入延迟*/
    {
    M++;
    }
    } 

    接收中断的代码由 HalCoGen 自动生成、并且是:

    void lin1HighLevelInterrupt (void)
    {
    uint32 vec = sciREG1->INTVECT0;
    uint8字节;
    //用户代码开始(28)*/
    imHere = 1;
    //用户代码结束*/
    
    开关(VEC)
    {
    案例1U:
    sciNotification (sciREG1、(uint32) SCI_WAKE_INT);
    中断;
    案例3U:
    sciNotification (sciREG1、(uint32) SCI_PE_INT);
    中断;
    案例6U:
    sciNotification (sciREG1、(uint32) SCI_FE_INT);
    中断;
    案例7U:
    sciNotification (sciREG1、(uint32) SCI_break_INT);
    中断;
    案例9U:
    sciNotification (sciREG1、(uint32) SCI_OE_INT);
    中断;
    
    案例11U:
    /*接收*/
    字节=(uint8)(sciREG1->RD & 0x000000FFU);
    
    如果(g_sciTransfer_t[0U].rx_length > 0U)
    {
    *g_sciTransfer_t[0U].rx_data =字节;
    G_sciTransfer_t[0U].rx_data++;
    
    g_sciTransfer_t[0U].rx_length--;
    如果(g_sciTransfer_t[0U].rx_length == 0U)
    {
    sciNotification (sciREG1、(uint32) SCI_RX_INT);
    }
    }
    
    中断;
    
    案例12U:
    /*发送*/*SAFETYMCUSW
    30 S MR:12.2、12.3 "用于发送/接收轮询和中断模式下的数据计数"*/
    -g_sciTransfer_t[0U].TX_length;
    如果(g_sciTransfer_t[0U].TX_length > 0U)
    {
    uint8 txdata =* g_sciTransfer_t[0U].TX_data;
    sciREG1->TD =(uint32) txdata;
    G_sciTransfer_t[0U].TX_DATA++;
    }
    其他
    {
    sciREG1->CLEARINT = SCI_TX_INT;
    sciNotification (sciREG1、(uint32) SCI_TX_INT);
    }
    中断;
    
    默认值:
    /*幻象中断、清除标志并返回*/
    sciREG1->FLR = sciREG1->SETINTLVL & 0x07000303U;
    中断;
    }
    /*用户代码开始(29)*/*
    用户代码结束*/
    }
    

    最后、我的 VIN 初始化函数显示如下:(不确定是否缺少某些内容、但同样、具有单字节的中断工作正常:

    void vimInit (void)
    {
    //用户代码开始(1)*/
    //用户代码结束*/
    
    /*为 VIM RAM 启用 ECC */
    /*勘误表 VIM#28权变措施:禁用单位错误校正*/
    vimREG->ECCCTL =(uint32)((uint32) 0xAU << 0U)|(uint32)(((uint32) 0x5U << 16U);
    
    /*初始化 VIM 表*/
    {
    uint32 i;
    
    对于(I = 0U;I < VIM_CHANNELS;I++)
    {
    vimRAM->ISR[i]= s_vim_init[i];
    }
    }
    vimREG->FBVECADDR =(uint32)&vimECCErorHandler;
    
    /*设置 IRQ/FIQ 优先级*/
    vimREG->FIRQPR0 =(uint32)((uint32) SYS_FIQ << 0U)
    |(UINT32)((UINT32) SYS_FIQ << 1U)
    |(UINT32)((UINT32) SYS_IRQ << 2U)
    |(UINT32)((UINT32) SYS_IRQ << 3U)
    |(UINT32)((UINT32) SYS_IRQ << 4U)
    |(UINT32)((UINT32) SYS_IRQ << 5U)
    |(UINT32)((UINT32) SYS_IRQ << 6U)
    |(UINT32)((UINT32) SYS_IRQ << 7U)
    |(UINT32)((UINT32) SYS_IRQ << 8U)
    |(UINT32)((UINT32) SYS_IRQ << 9U)
    |(UINT32)((UINT32) SYS_IRQ << 10U)
    |(UINT32)((UINT32) SYS_IRQ << 11U)
    |(UINT32)((UINT32) SYS_IRQ << 12U)
    |(UINT32)((UINT32) SYS_IRQ << 13U)
    |(UINT32)((UINT32) SYS_IRQ << 14U)
    |(UINT32)((UINT32) SYS_IRQ << 15U)
    |(UINT32)((UINT32) SYS_IRQ << 16U)
    |(UINT32)((UINT32) SYS_IRQ << 17U)
    |(UINT32)((UINT32) SYS_IRQ << 18U)
    |(UINT32)((UINT32) SYS_IRQ << 19U)
    |(UINT32)((UINT32) SYS_IRQ << 20U)
    |(UINT32)((UINT32) SYS_IRQ << 21U)
    |(UINT32)((UINT32) SYS_IRQ << 22U)
    |(UINT32)((UINT32) SYS_IRQ << 23U)
    |(UINT32)((UINT32) SYS_IRQ << 24U)
    |(UINT32)((UINT32) SYS_IRQ << 25U)
    |(UINT32)((UINT32) SYS_IRQ << 26U)
    |(UINT32)((UINT32) SYS_IRQ << 27U)
    |(UINT32)((UINT32) SYS_IRQ << 28U)
    |(UINT32)((UINT32) SYS_IRQ << 29U)
    |(UINT32)((UINT32) SYS_IRQ << 30U)
    |(UINT32)((UINT32) SYS_IRQ << 31U);
    
    vimREG->FIRQPR1 =(uint32)((uint32) SYS_IRQ << 0U)
    |(UINT32)((UINT32) SYS_IRQ << 1U)
    |(UINT32)((UINT32) SYS_IRQ << 2U)
    |(UINT32)((UINT32) SYS_IRQ << 3U)
    |(UINT32)((UINT32) SYS_IRQ << 4U)
    |(UINT32)((UINT32) SYS_IRQ << 5U)
    |(UINT32)((UINT32) SYS_IRQ << 6U)
    |(UINT32)((UINT32) SYS_IRQ << 7U)
    |(UINT32)((UINT32) SYS_IRQ << 8U)
    |(UINT32)((UINT32) SYS_IRQ << 9U)
    |(UINT32)((UINT32) SYS_IRQ << 10U)
    |(UINT32)((UINT32) SYS_IRQ << 11U)
    |(UINT32)((UINT32) SYS_IRQ << 12U)
    |(UINT32)((UINT32) SYS_IRQ << 13U)
    |(UINT32)((UINT32) SYS_IRQ << 14U)
    |(UINT32)((UINT32) SYS_IRQ << 15U)
    |(UINT32)((UINT32) SYS_IRQ << 16U)
    |(UINT32)((UINT32) SYS_IRQ << 17U)
    |(UINT32)((UINT32) SYS_IRQ << 18U)
    |(UINT32)((UINT32) SYS_IRQ << 19U)
    |(UINT32)((UINT32) SYS_IRQ << 20U)
    |(UINT32)((UINT32) SYS_IRQ << 21U)
    |(UINT32)((UINT32) SYS_IRQ << 22U)
    |(UINT32)((UINT32) SYS_IRQ << 23U)
    |(UINT32)((UINT32) SYS_IRQ << 24U)
    |(UINT32)((UINT32) SYS_IRQ << 25U)
    |(UINT32)((UINT32) SYS_IRQ << 26U)
    |(UINT32)((UINT32) SYS_IRQ << 27U)
    |(UINT32)((UINT32) SYS_IRQ << 28U)
    |(UINT32)((UINT32) SYS_IRQ << 29U)
    |(UINT32)((UINT32) SYS_IRQ << 30U)
    |(UINT32)((UINT32) SYS_IRQ << 31U);
    
    
    vimREG->FIRQPR2 =(uint32)((uint32) SYS_IRQ << 0U)
    |(UINT32)((UINT32) SYS_IRQ << 1U)
    |(UINT32)((UINT32) SYS_IRQ << 2U)
    |(UINT32)((UINT32) SYS_IRQ << 3U)
    |(UINT32)((UINT32) SYS_IRQ << 4U)
    |(UINT32)((UINT32) SYS_IRQ << 5U)
    |(UINT32)((UINT32) SYS_IRQ << 6U)
    |(UINT32)((UINT32) SYS_IRQ << 7U)
    |(UINT32)((UINT32) SYS_IRQ << 8U)
    |(UINT32)((UINT32) SYS_IRQ << 9U)
    |(UINT32)((UINT32) SYS_IRQ << 10U)
    |(UINT32)((UINT32) SYS_IRQ << 11U)
    |(UINT32)((UINT32) SYS_IRQ << 12U)
    |(UINT32)((UINT32) SYS_IRQ << 13U)
    |(UINT32)((UINT32) SYS_IRQ << 14U)
    |(UINT32)((UINT32) SYS_IRQ << 15U)
    |(UINT32)((UINT32) SYS_IRQ << 16U)
    |(UINT32)((UINT32) SYS_IRQ << 17U)
    |(UINT32)((UINT32) SYS_IRQ << 18U)
    |(UINT32)((UINT32) SYS_IRQ << 19U)
    |(UINT32)((UINT32) SYS_IRQ << 20U)
    |(UINT32)((UINT32) SYS_IRQ << 21U)
    |(UINT32)((UINT32) SYS_IRQ << 22U)
    |(UINT32)((UINT32) SYS_IRQ << 23U)
    |(UINT32)((UINT32) SYS_IRQ << 24U)
    |(UINT32)((UINT32) SYS_IRQ << 25U)
    |(UINT32)((UINT32) SYS_IRQ << 26U)
    |(UINT32)((UINT32) SYS_IRQ << 27U)
    |(UINT32)((UINT32) SYS_IRQ << 28U)
    |(UINT32)((UINT32) SYS_IRQ << 29U)
    |(UINT32)((UINT32) SYS_IRQ << 30U)
    |(UINT32)((UINT32) SYS_IRQ << 31U);
    
    vimREG->FIRQPR3 =(uint32)((uint32) SYS_IRQ << 0U)
    |(UINT32)((UINT32) SYS_IRQ << 1U)
    |(UINT32)((UINT32) SYS_IRQ << 2U)
    |(UINT32)((UINT32) SYS_IRQ << 3U)
    |(UINT32)((UINT32) SYS_IRQ << 4U)
    |(UINT32)((UINT32) SYS_IRQ << 5U)
    |(UINT32)((UINT32) SYS_IRQ << 6U)
    |(UINT32)((UINT32) SYS_IRQ << 7U)
    |(UINT32)((UINT32) SYS_IRQ << 8U)
    |(UINT32)((UINT32) SYS_IRQ << 9U)
    |(UINT32)((UINT32) SYS_IRQ << 10U)
    |(UINT32)((UINT32) SYS_IRQ << 11U)
    |(UINT32)((UINT32) SYS_IRQ << 12U)
    |(UINT32)((UINT32) SYS_IRQ << 13U)
    |(UINT32)((UINT32) SYS_IRQ << 14U)
    |(UINT32)((UINT32) SYS_IRQ << 15U)
    |(UINT32)((UINT32) SYS_IRQ << 16U)
    |(UINT32)((UINT32) SYS_IRQ << 17U)
    |(UINT32)((UINT32) SYS_IRQ << 18U)
    |(UINT32)((UINT32) SYS_IRQ << 19U)
    |(UINT32)((UINT32) SYS_IRQ << 20U)
    |(UINT32)((UINT32) SYS_IRQ << 21U)
    |(UINT32)((UINT32) SYS_IRQ << 22U)
    |(UINT32)((UINT32) SYS_IRQ << 23U)
    |(UINT32)((UINT32) SYS_IRQ << 24U)
    |(UINT32)((UINT32) SYS_IRQ << 25U)
    |(UINT32)((UINT32) SYS_IRQ << 26U)
    |(UINT32)((UINT32) SYS_IRQ << 27U)
    |(UINT32)((UINT32) SYS_IRQ << 28U)
    |(UINT32)((UINT32) SYS_IRQ << 29U)
    |(UINT32)((UINT32) SYS_IRQ << 30U)
    |(UINT32)((UINT32) SYS_IRQ << 31U);
    
    
    /*启用中断*/
    vimREG->REQMASKSET0 =(uint32)((uint32) 1U <<0U)
    |(uint32)((uint32) 1U << 1U)
    |(uint32)((uint32) 1U << 2U)
    |(UINT32)((UINT32) 0U << 3U)
    |(uint32)((uint32) 0U << 4U)
    |(UINT32)((UINT32) 0U << 5U)
    |(UINT32)((UINT32) 0U << 6U)
    |(UINT32)((UINT32) 0U << 7U)
    |(UINT32)((UINT32) 0U << 8U)
    |(UINT32)((UINT32) 0U << 9U)
    |(UINT32)((UINT32) 0U << 10U)
    |(UINT32)((UINT32) 0U << 11U)
    |(UINT32)((UINT32) 0U << 12U)
    |(uint32)((uint32) 1U <<13U)
    |(UINT32)((UINT32) 0U << 14U)
    |(UINT32)((UINT32) 0U << 15U)
    |(UINT32)((UINT32) 0U <<16U)
    |(UINT32)((UINT32) 0U << 17U)
    |(UINT32)((UINT32) 0U << 18U)
    |(UINT32)((UINT32) 0U << 19U)
    |(UINT32)((UINT32) 0U << 20U)
    |(UINT32)((UINT32) 0U << 21U)
    |(UINT32)((UINT32) 0U << 22U)
    |(UINT32)((UINT32) 0U <<23U)
    |(UINT32)((UINT32) 0U << 24U)
    |(UINT32)((UINT32) 0U << 25U)
    |(UINT32)((UINT32) 0U << 26U)
    |(UINT32)((UINT32) 0U << 27U)
    |(UINT32)((UINT32) 0U << 28U)
    |(UINT32)((UINT32) 0U << 29U)
    |(UINT32)((UINT32) 0U << 30U)
    |(uint32)((uint32) 0U << 31U);
    
    vimREG->REQMASKSET1 =(uint32)((uint32) 0U << 0U)
    |(uint32)((uint32) 0U << 1U)
    |(uint32)((uint32) 0U << 2U)
    |(UINT32)((UINT32) 0U << 3U)
    |(uint32)((uint32) 0U << 4U)
    |(UINT32)((UINT32) 0U << 5U)
    |(UINT32)((UINT32) 0U << 6U)
    |(UINT32)((UINT32) 0U << 7U)
    |(UINT32)((UINT32) 0U << 8U)
    |(UINT32)((UINT32) 0U << 9U)
    |(UINT32)((UINT32) 0U << 10U)
    |(UINT32)((UINT32) 0U << 11U)
    |(UINT32)((UINT32) 0U << 12U)
    |(UINT32)((UINT32) 0U << 13U)
    |(UINT32)((UINT32) 0U << 14U)
    |(UINT32)((UINT32) 0U << 15U)
    |(UINT32)((UINT32) 0U <<16U)
    |(UINT32)((UINT32) 0U << 17U)
    |(UINT32)((UINT32) 0U << 18U)
    |(UINT32)((UINT32) 0U << 19U)
    |(UINT32)((UINT32) 0U << 20U)
    |(UINT32)((UINT32) 0U << 21U)
    |(UINT32)((UINT32) 0U << 22U)
    |(UINT32)((UINT32) 0U <<23U)
    |(UINT32)((UINT32) 0U << 24U)
    |(UINT32)((UINT32) 0U << 25U)
    |(UINT32)((UINT32) 0U << 26U)
    |(UINT32)((UINT32) 0U << 27U)
    |(UINT32)((UINT32) 0U << 28U)
    |(UINT32)((UINT32) 0U << 29U)
    |(UINT32)((UINT32) 0U << 30U)
    |(uint32)((uint32) 0U << 31U);
    
    vimREG->REQMASKSET2 =(uint32)((uint32) 0U << 0U)
    |(uint32)((uint32) 0U << 1U)
    |(uint32)((uint32) 0U << 2U)
    |(UINT32)((UINT32) 0U << 3U)
    |(uint32)((uint32) 0U << 4U)
    |(UINT32)((UINT32) 0U << 5U)
    |(UINT32)((UINT32) 0U << 6U)
    |(UINT32)((UINT32) 0U << 7U)
    |(UINT32)((UINT32) 0U << 8U)
    |(UINT32)((UINT32) 0U << 9U)
    |(UINT32)((UINT32) 0U << 10U)
    |(UINT32)((UINT32) 0U << 11U)
    |(UINT32)((UINT32) 0U << 12U)
    |(uint32)((uint32) 1U <<13U)
    |(UINT32)((UINT32) 0U << 14U)
    |(uint32)((uint32) 1U <<15U)
    |(UINT32)((UINT32) 0U <<16U)
    |(UINT32)((UINT32) 0U << 17U)
    |(UINT32)((UINT32) 0U << 18U)
    |(UINT32)((UINT32) 0U << 19U)
    |(UINT32)((UINT32) 0U << 20U)
    |(UINT32)((UINT32) 0U << 21U)
    |(UINT32)((UINT32) 0U << 22U)
    |(UINT32)((UINT32) 0U <<23U)
    |(UINT32)((UINT32) 0U << 24U)
    |(UINT32)((UINT32) 0U << 25U)
    |(UINT32)((UINT32) 0U << 26U)
    |(UINT32)((UINT32) 0U << 27U)
    |(UINT32)((UINT32) 0U << 28U)
    |(UINT32)((UINT32) 0U << 29U)
    |(UINT32)((UINT32) 0U << 30U)
    |(uint32)((uint32) 0U << 31U);
    
    vimREG->REQMASKSET3 =(uint32)((uint32) 0U << 0U)
    |(uint32)((uint32) 0U << 1U)
    |(uint32)((uint32) 0U << 2U)
    |(UINT32)((UINT32) 0U << 3U)
    |(uint32)((uint32) 0U << 4U)
    |(UINT32)((UINT32) 0U << 5U)
    |(UINT32)((UINT32) 0U << 6U)
    |(UINT32)((UINT32) 0U << 7U)
    |(UINT32)((UINT32) 0U << 8U)
    |(UINT32)((UINT32) 0U << 9U)
    |(UINT32)((UINT32) 0U << 10U)
    |(UINT32)((UINT32) 0U << 11U)
    |(UINT32)((UINT32) 0U << 12U)
    |(UINT32)((UINT32) 0U << 13U)
    |(UINT32)((UINT32) 0U << 14U)
    |(UINT32)((UINT32) 0U << 15U)
    |(UINT32)((UINT32) 0U <<16U)
    |(UINT32)((UINT32) 0U << 17U)
    |(UINT32)((UINT32) 0U << 18U)
    |(UINT32)((UINT32) 0U << 19U)
    |(UINT32)((UINT32) 0U << 20U)
    |(UINT32)((UINT32) 0U << 21U)
    |(UINT32)((UINT32) 0U << 22U)
    |(UINT32)((UINT32) 0U <<23U)
    |(UINT32)((UINT32) 0U << 24U)
    |(UINT32)((UINT32) 0U << 25U)
    |(UINT32)((UINT32) 0U << 26U)
    |(UINT32)((UINT32) 0U << 27U)
    |(UINT32)((UINT32) 0U << 28U)
    |(UINT32)((UINT32) 0U << 29U)
    |(UINT32)((UINT32) 0U << 30U)
    |(uint32)((uint32) 0U << 31U);
    
    /*设置捕获事件源*/
    vimREG->CAPEVT =((uint32)((uint32) 0U << 0U)
    |(uint32)((uint32) 0U << 16U);
    
    /*用户代码开始(2)*/
    /*用户代码结束*/
    }
    

    我注意到的另一个区别是我的第29.2.4.1.2段与你的段落有很大不同:

    29.2.4.1.2在多缓冲模式下接收数据
    当 SCIGCR1中的 Mbuf 模式位设置为1时、选择多缓冲模式下的接收数据。 在这种模式
    下、SCI 在接收到接收缓冲区中已编程的数据数量、即整个帧后将 RXRDY 位置位。
    错误条件检测逻辑与单缓冲模式相似、不同之处在
    于它监视整个帧。 与单缓冲模式类似、您可以使用轮询、中断或 DMA 方法来读取
    数据。 读取 SCIRD 中的新数据后、SCI 将 RXRDY 位清零。 

    我使用 的是 TMS570LC43x 16/32位 RISC 闪存微控制器-技术参考手册"、2018年3月。

    问题出在哪里?

    感谢您的帮助、

    Marco。

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

    尊敬的 Marco:

     我想确保您使用的是 SCI/LIN 模块还是 SCI 模块。 请参阅数据表中的以下4个模块。 SCI3和 SCI4将不支持多缓冲模式。 只有处于 SCI 模式的 LIN1和 LIN2才能支持多缓冲器。  

    另请参阅以下文章、了解一些澄清信息。  

    https://e2e.ti.com/support/microcontrollers/hercules/f/312/t/928837?tisearch=e2e-sitesearch&keymatch=multi%252520buffer%252520sci

    [引用用户="Marco Semenzato"]

    我注意到的另一个区别是我的第29.2.4.1.2段与你的段落有很大不同:

    1
    2.
    3.
    4.
    5.
    6.
    29.2.4.1.2 Receiving Data in Multi-Buffer Mode
    Multi-buffer mode is selected when the MBUF MODE bit in SCIGCR1 is set to 1. In thismode, SCI sets
    the RXRDY bit after receiving the programmed number of data in the receive buffer, the complete frame.
    The error condition detection logic is similar to the single-buffer mode, except that it monitors forthe
    complete frame. Like single-buffer mode, you can use the polling, interrupt, or DMA method to read the
    data. The SCI clears the RXRDY bit after the newdata in SCIRD has been read.

    我使用 的是 TMS570LC43x 16/32位 RISC 闪存微控制器-技术参考手册"、2018年3月。

    [/报价]

    抱歉、我使用的是2014年5月的早期版本(SPNU56.pdf) TRM。 请使用2018年3月最新的 TRM (SPNU563A.pdf)。

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

    您好、Charles、

    感谢您的回答。

    我验证了寄存器的地址、看起来正常:

    我检查了您提供的链接、设置是相同的(在 GR1 +数据格式上启用)。

    在 CPU 级别可能还有其他设置? VIM 中可能有什么问题吗? 我真的不知道

    /**@def sciREG1
    *@简要寄存器帧指针
    *
    * SCI 驱动程序使用此指针来访问 SCI1模块寄存器。
    *
    #define sciREG1 ((sciBASE-t *) 0xFFF7E400U)

    P.S. 好的、没问题。 我一直使用我的参考手册版本。

    感谢您的回复和问候、

    Marco。

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

    您好!

     您可以向我发送完整的 CCS 项目吗? 我想运行您的项目。

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

    您好!

     我编写了一段简单的代码。 如果我不启用多缓冲模式、那么我将获得中断并正确接收每个字符。 但是、一旦我启用多缓冲模式、就不会产生中断。 似乎存在一些硬件问题。 我需要与我的同事核实他们是否知道该问题或他们是否知道一些软件解决方法。 同时、我建议您使用单缓冲模式。  

    /*用户代码开始(0)*/
    #include "hL_system.h"
    #include "hL_sci.h"

    /*用户代码结束*/

    /*包含文件*/

    #include "hL_sys_common.h"

    /*用户代码开始(1)*/
    INT UART_RX_RDY = 0;
    /*用户代码结束*/

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

    /*用户代码开始(2)*/
    #define SIZE1 8.
    uint8 text1[TIZE1]={0x11、0x22、0x33、0x44、0x55、0x66、0x77、0x88};
    uint8 pData[TMSIZEE1]={0};

    /*用户代码开始(4)*/
    void sciDisplayText (sciBASE-t * sci、uint8 *文本、uint32长度)

    int i;
    while (length---)(while (l

    while ((sci->FLR & 0x4)== 4);//等待忙*/
    sciSendByte (sci、* text++);/*发送文本*/
    对于(i=0;i<=10000;i++);
    };

    void sciNotification (sciBASE-t * sci、uint32标志)

    /*在用户代码开始和用户代码结束之间输入用户代码。 *
    /*用户代码开始(29)*/
    UART_RX_RDY = 1;
    sciREG1->CLEARINT = SCI_RX_INT;

    /*用户代码结束*/

    int main (空)

    /*用户代码开始(3)*/
    /*启用中断。 *
    _enable_IRQ_interrupt_();

    sciInit();
    sciREG1->GCR1 |=((uint32) 1U <<16U
    |(uint32)(Uint32)1U <<10U));//为测试启用回送模式,启用多缓冲模式,
    sciREG1->format |=(7U <<16U);//在中断前传输8个字符
    sciREG1->SETINT |=(1U <<17U);//启用 RX DMA
    sciEnableNotification (sciREG1、SCI_RX_INT);
    sciReceive (sciREG1、TIZE1、pData);
    sciDisplayText (sciREG1、&text1[0]、TMSIZEE1);//发送文本代码1 *
    while (UART_RX_RDY = 0U);/*等待*/
    UART_RX_RDY = 0;

    while (1);
    /*用户代码结束*/

    返回0;


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

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

    您好!

    www.ti.com/.../spna213

    本应用手册中的示例使用 SCI 在多缓冲模式下传输数据。  

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

    大家好、感谢您提供的示例。 我将尝试在我的固件中重现它。

    谢谢、

    Marco。