我使用 重复突发块将 DMA Rx 连接到存储器。
文档内容为:"在重复突发块模式下、CPU 以20%的容量持续执行、直到重复突发块传输停止。"
停止意味着:
1)-直到 Rx 字节被传输
2)-直到 DMA 控制器停止
(如果为2)在低波特率下的性能影响非常差:-)
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.
我使用 重复突发块将 DMA Rx 连接到存储器。
文档内容为:"在重复突发块模式下、CPU 以20%的容量持续执行、直到重复突发块传输停止。"
停止意味着:
1)-直到 Rx 字节被传输
2)-直到 DMA 控制器停止
(如果为2)在低波特率下的性能影响非常差:-)
突发块模式实际上是为了尽可能快地传输大量存储器。 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; (笑声)
}