Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65181
  • 博文数量: 72
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 12
  • 用 户 组: 普通用户
  • 注册时间: 2014-12-04 23:21
文章分类
文章存档

2015年(72)

我的朋友

分类: 嵌入式

2015-04-15 10:48:00

原文地址:DMA有限状态机 作者:lingyunwmr

注意:只有在DCON[23]设置为1,表示使用硬件中断模式时,请求源才有效。

3. DMA有限状态机

DMA使用3状态的有限状态机来进行操作:

状态一:初始状态。DMA控制器等待DMA请求,DMA ACK和INT REQ都是0。一旦请求到达,则进入状态二。

状态二:ACK变为1,从DCON[19:0]装载传输计数值到CURR_TC。注意:ACK保持为1直到随后清除它。

状态三:在此状态下,初始化进行原子操作的子有限状态机。子有限状态机(sub-FSM)从源地址读取数据,写入到目的地址(原子操作)。这个操作会考虑数据尺寸和传输尺寸(单步还是突发)。在完全服务模式(whole service mode)下,此操作会重复直到传输计数值CURR_TC变为0;在单步服务模式下,此操作只进行一次。子有限状态机每完成一次原子操作,主有限状态机会让CURR_TC减1。如果CURR_TC变为0,又在DCON[29]设置了启用中断,则DMA控制器会发起DMA中断请求。此时,如果满足下列条件之一,还会清除DMA ACK:

(1)在完全服务模式下CURR_TC变为0

(2)在单步服务模式下原子操作完成

   在单步服务模式下,主有限状态机分别经历这三个状态一次,然后传输停止,等待下一个DMA请求。下一个请求到达时,会重复这三个状态一次。因此,对于每次原子操作,ACK都会被设置然后被清除。相反,在完全服务模式下,主有限状态机会保持在状态三直到CURR_TC变为0。在整个传输过程中,ACK保持为1,直到传输完成,ACK才变为0。然而,无论是单步服务模式还是完全服务模式,都只在CURR_TC变为0时才发起DMA中断请求。

4. 寄存器

    S3C2440A对于每个DMA通道有9个寄存器,4个通道共使用了36个寄存器。9个寄存器中有6个是控制寄存器,用于控制DMA传输;3个是状态寄存器,用于监测DMA传输状态。

    实际传输的字节数 = DCON[19:0] * DSZ * TSZ

    DCON[19:0]初始传输计数;DSZ = DCON[21:20],传输的数据单元尺寸,类似C标准库中fread()函数第二个参数;TSZ = DCON[28],0表示每次进行一个单元传输,1表示每次进行(突发的)4个单元传输。

    软硬件方式选择:

    DCON[23] = 0:软件方式,应该在源和目标地址寄存器中写入有效地址。

    DCON[23] = 1:硬件方式,由DCON[26:24]指明DMA请求源

    其他:

    DCON[29]表示是否在传输完成时发起DMA中断请求

    DCON[27]选择单步服务模式还是完全服务模式,一般单步服务模式仅用于调试,常用的是完全服务模式

    DCON[30]选择DREQ/ACK同步方式

    DCON[31]选择请求模式还是握手模式,建议使用握手模式

阅读(604) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~