DMA操作模式
DMA用于无需CPU的介入而直接由专用控制器建立源与目的传输的应用,因此,在大量数据传输中解放了CPU。PIC32微控制器中的DMA可用于映射到内存空间中的不同外设,如从存储区到SPI,UART或I2C等设备。DMA特性详见器件参考手册,这里仅对一些基本原理与功能做一个简析。
PIC32中DMA的传输涉及到几个基本的术语。
Event:事件,触发控制器启动或停止DMA传输的操作;
Transaction:事物,单字传输(最多可以到4个字节),由读/写组成;
Cell transfer:元传输,单次共DCHXCSIZE个字节的数据传输。元传输由单个或多个事务组成。
Block transfer:块传输,块传输总的字节数由DCHXSSIZ或DCHXDSIZ决定。块传输由单个或多个元传输组成。
事件是触发DMA控制器产生动作的方式,分为,START EVENT->启动传输;ABORT EVENT->取消传输;STOP EVENT->停止传输;为了有一个完整的概念认识,可以把用户软件的操作,如置位启动传输位等也包含在事件范围内。由此,可以看处,任何一个DMA动作都是由事件触发完成的。用户在使用DMA控制器时只需设计好事件与DMA操作的关联即可。要充分的使用DMA控制器,熟悉DMA各种工作模式的原理是很有必要的。
PIC32的手册列举了5中模式,然而这5种模式并不是互斥的。为了解决不同的问题,可以将几种模式综合起来使用。
传输模式一:基本操作模式。
起始事件触发启动DMA;如有ABORT事件发生,则传输取消,源和目的指针复位;Cell Transfer事件发生,等待下一次Cell Transfer(前提是本次Block transfer没有结束)触发DMA;Block transfer结束,则传输停止(如果CHAEN没有使能);如果字符匹配使能的话,则发生字符匹配事件也会停止传输。
传输模式二:字符匹配终止模式
字符匹配模式用于传输不定长字节,而又有传输终止标识字节的应用环境中,Uart是这种模式的应用案例。举例如下:
假设某系统有一串字符消息发送到外部主机,最大的信息长度为86个字符,用户可以做如下配置。
DCHXSSIZ配置为87字节(如果因为缓冲区溢出导致不期望情况出现,CPU会被中断,并做相应的处理);
DCHXDSIZ设定为1个字节;
目标地址写入Uart TXREG;
DCHXDAT设定为匹配符0x00;
CHSIRQ设定为UART 发送缓冲区空事件;
SIRQEN设定为通道响应传输触发事件;
设定DCHXSAD为源数据地址;
使能CHEN通道;
软件驱动DMA发起传输;
UART发送缓冲区空会自动驱动DMA发起新一轮传输。
传输模式三:通道链模式
通道链模式用于两个具有联系功能的传输之间的耦合。通常一个为主通道(Master Channel),一个为从通道(Slave Channel)。两个通道肯定为优先级相邻的,即优先级0和
1或1和2或2和3组成主从通道。在初始化操作中,从通道处于禁能状态下;主通道块传输完成后,产生 Channel Chain Event,触发从通道处于使能状态;DMA模块的通道具有侦听事件的能力,即使通道禁能,当CHAED置1时,通道仍旧能监听到事件,虽然不会做出反应(如果在chain模式下且监听事件相同,例如,都是监听A/D转换结束,主通道的最后一个动作会与从通道的第一个动作相同,即主从通道都将从AD中获取同一次采样的数据)。如果CHAED置0,则仅当模块使能时,事件才有意义。如果主从通道激励事件不一致,CHAED可置1,否则,要置0。
DMA通道的自动使能模式
DMA每个通道在正常的块传输、终结字符匹配后或者因异常ABORT后,通道自动禁能。如果该通道有多次的块传输,需要手动的使能通道;为了省却该操作,DCHXCON寄存器提供了允许自动使能通道的位CHAEN(channel auto enable)。通道使能位CHEN在取消传输或ABORT事件发生时会被置为0。
注:
1、通道起始/终止/停止中断事件独立于中断控制器,因此相应的中断无需使能,也无需在DMA传输后清除相应的位;
2、通道优先级和选择
DMA控制器每个通道有一个自然的优先级,CH0默认为最高,CH4默认为最低;通道寄存器DCHXCON中提供了修改优先级的控制位。优先级控制了通道的传输顺序。
具有最高优先级的通道往往优先占用资源完成Cell传输(前提是没有接着发生发起Cell transfer的事件);如果多个通道被设定为相同的优先级,控制器会在这个级别上平均
分配总线访问资源;较高优先级别的通道在请求传输时,如果有较低先级别的通道在使用DMA通道,则会将本次传输完成,然后再切换。见图1,通道优先级别动作。
3、DMA传输中的字节对齐
PIC32采用的数据总线是32位,4字节;无疑访问地址为4字节对齐的访问效率最高,但是,如果把所有的常量或变量存储地址都限制在4字节对齐显然是不可能的;DMA中在处理这个问题上采用的字节对齐方法(存储方式为LSB)。举例来说,如果当前物理地址与4的模为0,则取4字节;模为1,则取高3字节;模为2,则取高2字节;模为3,则取高1字节。
物理地址为0x1230,模为0,则取从0x1230处4字节数据;
物理地址为0x1231,模为1,则取从0x1231处3字节数据;
物理地址为0x1232,模为2,则取从0x1232处2字节数据;
物理地址为0x1233,模为3,则取从0x1233处1字节数据;
读/写过程均采取相同的字节对齐机制。DMA传输中的字节对齐过程如图2.
在本例中,源的基地址(存储在CHXSSA寄存器中,x代表通道)为0x1000,偏移量为9;目的的基地址(存储在CHXDSA寄存器中,x代表通道)为0x43F9,偏移量为11;传输数据量为9个字节
从图中可以看出,偏移量的更新发生在写目的地址后。
在Transaction 1中,要读取的数据地址为0x1009,与4的模为1,则从0x1009处读取高位3个字节的数据,即0x332211。而要写入的数据地址为0x440A,与4的模为2,因此3个数据中只能写入到0x440A起始地址处两个字节。写入后,偏移量更新(+2),剩下的一个字节再行写入。
在Transaction 2中,要读取的数据地址为0x100C,与4的模为0,则从0x100C处读取4个字节的数据,即0x77665544。而要写入的数据地址为0x440D,与4的模为3,因此4个数据中只能写入到0x440D起始地址处3个字节。写入后,偏移量更新(+3),剩下的一个字节再行写入。
在Transaction 3中,要读取的数据地址为0x1010,与4的模为0,则从0x1010处应读取2(共需传输9个字节,已经传输7个)个字节的数据,即0x9988。而要写入的数据地址为0x4411,与4的模为2,因此4个数据中只能写入到0x441起始地址处2个字节。写入后,偏移量更新(+2).
用户377235 2013-1-28 21:16
你把手册的抄一遍干嘛?你这个呆逼
用户155195 2008-9-19 07:59
用户162720 2008-9-17 23:27
用户656259 2008-9-9 12:51
用户485340 2008-9-8 15:43
jizzll_617398179 2008-9-8 00:26
sunke9_998892717 2008-9-5 21:17
用户461316 2008-9-4 18:54
用户1275742 2008-9-1 17:40