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.

[参考译文] MSP430FR5994:重复突发块 DMA

Guru**** 2560390 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/601777/msp430fr5994-repeated-burst-block-dma

器件型号:MSP430FR5994

我使用 重复突发块将 DMA Rx 连接到存储器。

文档内容为:"在重复突发块模式下、CPU 以20%的容量持续执行、直到重复突发块传输停止。"

停止意味着:

1)-直到 Rx 字节被传输

2)-直到 DMA 控制器停止

(如果为2)在低波特率下的性能影响非常差:-)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您只想从串行(或 I2C/SPI)接收端口移动数据、则更有可能需要使用模式000 -单次传输模式。 这将触发将一段数据从源传输到目的*每个触发器*,并在 N 次传输后停止。 否则,您将在每次触发时传输对*相同寄存器*重复读取的块长度数。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我在存储器中设置了一个环形缓冲器、尾位于 DMAxSZ 之后。  非常简单。

    问题仍然是、在低波特率、80%的性能冲击下、会产生什么影响?

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

    突发块模式实际上是为了尽可能快地传输大量存储器。 80%的量是允许 CPU 响应外部中断、否则在传输过程中将没有 CPU 带宽进行响应。 但它不适用于在每个数据事件触发时发起的单字节/字传输。 我包含一些用于将 SPI 端口驱动为背板通信通道的实时代码、您可能会在其中找到有用的内容。 此代码在发送或接收时使用相同的 DMA 通道之间翻转-接收从模式。

    // DMA。
    //--

    //警告有影响此模块运行的 DMA 勘误表(DMA4)。
    //在发生 DMA 操作时修改 DMA 寄存器会导致损坏。

    //警告!!!! MSP430中的 DMA 实现可非常轻松地使 CPU 具有核能力。
    //====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //如果在 DMA 处于活动状态时对其设置进行了更改,
    //它严重地破坏了 CPU 的内部状态。
    //到目前为止,已经看到至少会影响 SPI 和 CRC 块。
    //除了复位之外,此情况似乎没有恢复。
    //勘误表 DMA4表示这只适用于20位 DMA 寄存器访问,
    //但它似乎也适用于16位,变通办法似乎不起作用。

    // MISO 有一个问题、即如果启用了 SPI、它会拉低。
    //因此我们禁用外设引脚功能以使其浮动。

    //请注意,DMA 时序有一些问题。
    //由于 SPI 硬件会缓冲传出数据,DMA 会在数据之前完成。
    //实际上、DMA 在最后两个字节消失之前完成、
    //因为 DMA 在最后一次写入缓冲区时完成。
    //因此我们发送两个额外的字节(标称值),并且知道当 DMA 完成时,
    //这是因为缓冲区中现在有两个虚拟字节。
    //这些字节将被发送方截断,
    //或接收器接收和忽略的数据。

    // BP DMA。
    //----
    
    inline void bp_dma_mst_enable (void){
    DMA1CTL |= DMAEN;
    }
    inline void bp_dma_slv_enable (void){
    DMA1CTL |= DMAEN;
    }
    inline
    
    
    void bp_dma_dadisable (void){ DMA1CTL &=~DMAEN;} inline void bp_DMAD_DM_DMA0_DMADDR_D0 + DMADDR_D0 + DMADDR_ADDR_D0 + DMADDR_DCR_ADDR_0 + DMADDR_ADDR_0 + DMADDR_ADDR_ADDR_0 + DM
    
    DMA1SA =(__SFR_FARPTR)((void *)&UCB1RXBUF);
    DMA1DA =(__SFR_FARPTR)(((void *) A_dst_p);
    //允许的最大数据接收。
    DMA1SZ = frm_max_size();
    DMACTL0 =(DDMACTL0 & 0xFF)| DMA1TSEL_USCI1RX;
    }
    内联 void BP_DMA_mast_reload _data (void * A_src_p,int a_size){
    DMA1CTL = DMART_0 + DMART_DRC_DRV0+(
    
    * ADDR_ADDR_DR_DR_A)+(void * ADDRC_DRV_DRV_DRV_DRV0_DRV0_DRV_DRV_DRV_DRV_DRV_R)+(*(_DRV_ADDRV_ADDRV_ADC_)+ DMART_DRV_ADC_(_ADDR_ADDR_ADDR_INDR_ADDR_INDB_ADR
    DMA1SZ = A_SIZE + 2;
    DMACTL0 =(DMACTL0和0xFF)| DMA1TSEL__USCIB1TX;
    }
    
    
    void bp_spi_init (void){
    
    bp_dma_disable(); 

    (笑声) // SPI DMA 的初始设置(DMA0/1=RX/TX)。 //-------------------------------------------------------- //无 NI-CAN-abort,在 R/M/W CPU 操作期间禁用 DMA。 DMACTL4 = DMARMWDIS; //为主/从使用设置 DMA。 DMA1CTL = DMADD_0 + DMASBDB + DMAIE; (笑声)