[TMS320F28003x用户手册][CAN协议][DMA功能]

目录

前言

一、DMA触发输出

1. IF1 和 IF2 的 DMA 触发:

2. IF3 的 DMA 触发: 

二、DMA请求触发

1. IF1 和 IF2 的更新:  

2. IF3 的自动更新:

三、DMA流程

1.启用DMA请求:

2.触发 DMA 请求:

3.DMA数据传输:

4.传输完成处理:        

四、DMA 功能的配置示例

1. 启用 IF1 的 DMA 请求

2. 配置 IF1 命令寄存器以触发 DMA 请求

3. 处理 DMA 传输完成中断 


本人萌新小白,请各位大佬多多指教。

代码未经实践,且主包经验不足,代码请忽略。

手册链接:https://www.ti.com.cn/cn/lit/pdf/spruiw9 本章对应手册的28.6 DMA Functionality


前言

CAN 模块支持 DMA(直接内存访问)功能,这使得数据能够在 CAN 模块和其他内存区域之间高效传输,而无需 CPU 的频繁干预。这显著提高了数据传输效率,减轻了 CPU 的负担,特别适用于需要大量数据传输的应用场景。


一、DMA触发输出

CAN 模块提供了三个 DMA 触发输出,分别对应三个接口寄存器(IF1、IF2 和 IF3)。这些触发输出可以通过设置 CAN 控制寄存器(CAN_CTL)中的 DE1、DE2 和 DE3 位来启用。

1. IF1 和 IF2 的 DMA 触发

  • IF1 和 IF2 的 DMA 请求通过设置相应的 DE1 和 DE2 位启用。

  • 当 IF1 或 IF2 的命令寄存器(IF1CMD或IF2CMD)被写入时,DMA 请求会在下一个可用的接口周期触发。

2. IF3 的 DMA 触发: 

  • IF3 的 DMA 请求通过设置 DE3 位启用。

  • IF3 的内容可以在接收到 CAN 消息时自动更新,如果启用了 IF3 自动更新功能,所有 IF3 更新都会触发 DMA 请求。

二、DMA请求触发

1. IF1 和 IF2 的更新:  

  • IF1 和 IF2 的更新由写入命令寄存器(IFxCMD)触发。

  • 一旦启用 DMA 请求,设置 IF1CMD 或 IF2CMD 寄存器中的 DMAactive 位会在 IFx 接口下次可用时触发 DMA 请求。

2. IF3 的自动更新

  • IF3 的自动更新功能允许在接收到 CAN 消息时自动将消息对象传输到 IF3 寄存器集。

  • 如果启用了 IF3 自动更新功能,所有 IF3 更新都会触发 DMA 请求。DMA 请求保持活跃状态,直到第一次读取或写入 IF3 寄存器集。

三、DMA流程

1.启用DMA请求:

  • 设置 CAN_CTL 寄存器中的 DE1、DE2 或 DE3 位以启用 IF1、IF2 或 IF3 的 DMA 请求。

2.触发 DMA 请求:

  • 对于 IF1 和 IF2:写入 IFxCMD 寄存器以触发 DMA 请求。

  • 对于 IF3:启用 IF3 自动更新功能后,接收到的消息对象自动更新 IF3 寄存器集,触发 DMA 请求。

3.DMA数据传输:

  • DMA 控制器接管数据传输,将数据从 CAN 模块传输到目标内存区域,或反之。

4.传输完成处理:        

  • DMA 传输完成后,DMA 控制器发出完成信号,应用程序可以处理传输完成后的数据。

四、DMA 功能的配置示例

1. 启用 IF1 的 DMA 请求

CAN_CTL.BIT.DE1 = 1;  // 启用 IF1 的 DMA 请求

2. 配置 IF1 命令寄存器以触发 DMA 请求

CAN_IF1CMD.BIT.MSG_NUM = 0x01;  // 选择消息对象 1
CAN_IF1CMD.BIT.DIR = 0;         // 读取操作
CAN_IF1CMD.BIT.DATA_A = 1;      // 传输数据部分 A
CAN_IF1CMD.BIT.DATA_B = 1;      // 传输数据部分 B

3. 处理 DMA 传输完成中断 

void DMA_ISR(void) {
    // 处理 DMA 传输完成后的数据
    uint32_t dataA = CAN_IF1DATA;
    uint32_t dataB = CAN_IF1DATB;

    // 清除 DMA 完成标志
    DMA_Control.BIT.DMA_Complete = 0;
}

你可能感兴趣的:(嵌入式开发,单片机,嵌入式硬件,stm32)