Download presentation
Presentation is loading. Please wait.
1
S3C44B0X DMA功能及应用 SA 盛伟 SA 刘毅
2
内容提要 S3C44B0X DMA 概述 S3C44B0X ZDMA/BDMA 操作 S3C44B0X DMA 特殊功能寄存器
3
S3C44B0X DMA 概述 DMA 数量 描述 备注 ZDMA 2 BDMA 连接于 SSB 普通 DMA
在桥内,桥是SSB 和 SPB之间的接口层 桥 DMA
4
ZDMA概述 ZDMA 可从存储器到存储器、存储器到I/O 设备(固定的目的地址)和 I/O 设备到存储器传送数据
ZDMA 最重要的特征是 on-the-fly 模式,这种模式可减少需求 DMA 的周期数(BDMA无on-the-fly模式) 在 on-the-fly 模式下操作,源和目的总线宽度要匹配
5
on-the-fly模式概述 通常,DMA 传送包括两个独立的周期:一个是从源存储器或 I/O 设备读,另一个是向存储器或 I/O 设备写。执行这些操作,存储控制器先从数据总线上读出数据,再把这个数据写到数据线上 on-the-fly 模式有不可分的读/写周期。也就是说,存储控制器为源和目的设备读/写数据线上的数据产生应答信号,同时它为存储器的存取产生与读/写相关的控制信号
6
BDMA概述 BDMA 控制器只能从存储器到 I/O 设备和 I/O 设备到存储器传送数据,在这种情况下,I/O 设备意味着外围设备,像 SIO、IIS 和 UART 一样连接到 SPB ZDMA 和 BDMA 的操作由 S/W 或来自内部设备或外部请求引脚(nXDREQ0/1)的请求来启动
8
S3C44B0X ZDMA/BDMA 操作 ZDMA BDMA 外部 DMA REQ/ACK 协议 DMA 传送方式 DMA 请求源的选择
自动重装模式
9
术语解释 周期窃取(cycle stealing):DMA 窃取若干周期,每个周期传送一个字节(I/O 带宽比总线带宽小)
突发模式(burst mode):DMA 控制器通知设备获得总线,发起一连串的传送,然后释放总线(I/O 带宽与总线带宽匹配)
10
ZDMA ZDMA 可在外部存储器之间传送数据 DMA 操作由 S/W 或外部 DMA 请求信号来启动
S3C44B0X 有一个 4 字 FIFO 类型的缓冲器来支持 4 字突发模式的 DMA 传送。例如,在存储器之间的 DMA 操作中,4 字突发写发生在 4 字突发读之后
11
ZDMA 控制器框图
12
BDMA 定时器可在任何时候请求 DMA 操作,这有利于 ADC 块的自动操作
主要作用是在连接于 SPB 的片内外围设备(如 UART、IIS 和 SIO 等)和外部存储器之间传送数据
13
BDMA(续) 不支持 4 字突发 DMA 操作(块传送模式),因为没有暂时缓冲器,而且连接于的 SPB 的外围设备速度太慢
能够支持从外部存储器到外部存储器的数据传送,但是外部存储器之间的数据传送一般还是用 ZDMA 来实现 如果需要更多的 DMA 通道用于外部存储器之间( ZDMA 应用最多有两个通道)的数据传送 ,则可以用 BDMA
14
BDMA 控制器框图
15
外部 DMA REQ/ACK 协议 握手模式 单步模式 完整服务模式 需求模式
16
握手模式 一次 DMA 操作表示在 DMA 操作中的一对或不可分的读和写周期
由 nXDREQ 产生的请求引起一个字节、一个半字或一个字被传送出去 每一个数据的传送都需要 DMA 请求
17
握手模式时序图
18
单步模式 一次 DMA 操作包括可分开的读或写周期 通常用于测试或调试
在 nXDACK 的非有效区,总线控制器将再次评估总线优先级,以决定新的总线控制权 单步模式下的数据传输将慢于握手模式下的数据传输
19
单步模式(续) 当 DMA 请求信号变低时,如果没有高优先级的总线请求,则总线通过降低 DMA 应答信号来表明对 DMA 操作的总线分配
在 DMA 读周期后,应答信号将有一个上升沿来表示 DMA 读周期的结束;同时,如果在 DMA 应答信号上升时 DMA 请求信号一直为高电平,则 DMA 写周期将会延迟到新的 DMA 请求信号被激活
20
单步模式时序图1
21
单步模式时序图2
22
完整服务模式 一次 DMA 请求将产生连续的 DMA 传输,直到规定的 DMA 传输数据传输完,也就是基于传送计数的 DMA 操作将由单一 DMA 请求信号激活来启动,不需要进一步的 DMA 请求信号也可继续执行下去 nXDACK 信号一直有效,直到整个 DMA 操作结束
23
完整服务模式(续) 每传送完一个单元,将释放总线控制权 可提供最佳的总线共享,防止总线控制权被垄断
如果其他控制者截取了总线控制权,则在完成该服务后将继续执行剩余的操作,且不需要再次激活 nXDREQ
24
完整服务模式时序图1
25
完整服务模式时序图2
26
需求模式 与完整服务模式不同,需求模式不允许将总线控制权交给高优先级的总线控制者
在需求模式下进行 DMA 操作要特别小心,因为这种垄断模式可能对最佳总线共享的其他控制者产生意料不到的故障
27
需求模式时序图
28
DMA 传送方式 单元 (unit) 传送方式 块 (block) 传送方式 on-the-fly 传送方式
29
DMA 传送方式下的读/写 DMA 传送方式 读/写 单元(unit)传送 块(block)传送 on-the-fly 传送
1个单元读,然后1个单元写 块(block)传送 4个单元突发模式读,然后4个单元突发模式写 on-the-fly 传送 1个单元读或一个单元写(读与写分开)
30
单元(unit)传送方式 每个请求对应一个读/写周期,即一个单位读,然后一个单位写
31
用握手模式进行单元传送时序图
32
块(block)传送方式 块(4个字)传送方式表示在连续 4 个字的写周期前有连续 4 个字的 DMA 读周期,即 4 个字突发读,然后 4 个字突发写,因此传输的数据个数应是 16 字节的倍数 在块传送方式下,遇到 16 字节对齐的情况时,ADDR[3:0] 应置为 0
33
块(block)传送方式—举例 假设传送 100 字节(即 DMA 计数值为100),则 6×16=96 字节能够被传送,但剩余的 4 字节将不能被传送,因为在传送了 96 字节之后,DMA 操作就会停止
34
用单步模式进行块传送时序图
35
on-the-fly 传送方式 当 DMA 读/写数据时,具有固定地址的外部设备通过 DMA 应答信号 (nXDACK0/1)来写/读这个数据 DMA 在写数据前要先读数据
36
on-the-fly 传送方式(续) 读和写操作同时进行。DMA 应答信号通知外部设备去读或写。同时,存储控制器将产生与读/写相关的控制信号给外部存储器 。如果外部存储器能够支持 on-the-fly 方式(即能由 DMA 应答信号来读/写数据),则数据的传送率将加倍 在传送周期内,数据总线处于高阻状态
37
用完整模式进行on-the-fly传送时序图
38
DMA 请求源的选择 ZDMA BDMA
39
ZDMA DMA 请求源:S/W 或 H/W 产生 nXDREQ信号(外部 DMA 请求信号)
S/W 的触发可通过写 01 到 ZDCON0/1 寄存器的域来完成
40
ZDMA(续) 在 S/W 触发下,只要突发控制权分配给了 DMA 控制者,操作就将继续进行。只要 DMA 传送计数值或 TC(终端计数值)达到零,则表示 DMA 操作完成。如果高优先级的总线控制者得到总线控制权,则在高优先级的服务程序结束后,DMA操作将继续进行。
41
ZDMA (续) 如果 DMA 配置为外部触发模式,即通过写 1 到 ZDCON0/1 寄存器的 QDS 位来使能外部 DMA 请求,那么操作也可由nXDREQ (外部 DMA 请求信号)和S/W来初始化
42
BDMA 有6个硬件请求源:UART0、UART1、SIO、Timer 和 IIS等。 与 ZDMA 一样可由软件初始化
通过向 BDICNT 寄存器的 QSC 区域写入数值来选择这些请求源
43
自动重装模式 当 DMA 计数值减小到 0 时,Z(B)DISRCn、 Z(B)DIDESn 和 Z(B)DICNTn 的寄存器内容将被重新装入 Z(B)DCSRCn、 Z(B)DCDESn和 Z(B)DCCNTn 寄存器中 参量的这种自动重装不能保证在当前DMA操作之后,DMA 能自动重载运行,它是否重新运行取决于 Z(B)DCONn 中的 CMD 区域被重新写入或外部 DMA 请求出现
44
自动重装模式(续) 为了支持自动重装模式,DMA 设置了两个寄存器组
寄存器 Z(B)DISRCn、 Z(B)DIDESn 和 Z(B)DICNTn 包含 DMA 操作的初始化配置 寄存器 Z(B)DCSRCn、 Z(B)DCDESn 和 Z(B)DCCNTn 包含反映当前 DMA 操作的配置
45
自动重装的产生条件 自动重装(AR)等于 1 和 DMA 计数值达到 0
向 Z(B)DISRC0、 Z(B)DIDES0 和Z(B)DICNT0 写入新的配置 若 DMA 被激活,即寄存器中的 EN 位由 0 变为 1 S/W 命令被取消,当在 ZDCON0/1 中的CMD 域写入11时
46
S3C44B0X DMA 特殊功能寄存器 ZDMA控制寄存器(ZDCONn)
ZDMA0/1初始源/目的地址和计数寄存器及ZDMA0/1当前源/目的地址和计数寄存器 ZDMAn初始/当前源地址寄存器(ZDISRC、ZDCSRC) ZDMAn初始/当前目的地址寄存器(ZDIDES、ZDCDES) ZDMAn初始/当前目的计数寄存器(ZDICNT、ZDCCNT) BDMAn控制寄存器(BDCON) ZDMAn初始/当前源地址寄存器(BDISRC、BDCSRC) ZDMAn初始/当前目的地址寄存器(BDIDES、BDCDES) ZDMAn初始/当前目的计数寄存器(BDICNT、BDCCNT)
47
ZDMAn控制寄存器
48
ZDMAn控制寄存器(续)
49
ZDMA0初始/当前源/目的地址和计数寄存器
50
ZDMA1初始/当前源/目的地址和计数寄存器
51
ZDMAn初始/当前源地址寄存器
52
ZDMAn初始/当前目的地址寄存器
53
ZDMAn初始/当前计数寄存器
54
ZDMAn初始/当前计数寄存器(续)
55
ZDMAn初始/当前计数寄存器(续)
56
ZDMAn初始/当前计数寄存器(续)
57
BDMAn控制寄存器
58
BDMAn控制寄存器(续)
59
BDMA0初始/当前源/目的地址和计数寄存器
60
BDMA1初始/当前源/目的地址和计数寄存器
61
BDMAn初始/当前源地址寄存器
62
BDMAn初始/当前目的地址寄存器
63
BDMA0初始/当前计数寄存器
64
BDMA0初始/当前计数寄存器(续)
65
BDMA1初始/当前计数寄存器
66
BDMA1初始/当前计数寄存器(续)
67
S3C44B0X DMA 应用编程 ZDMA BDMA
68
ZDMA 本实验通过 DMA 方式实现存储器到存储器的数据传送,并将其与常规的内存拷贝操作进行比较(实验来源文献[4])
69
包含文件 #include "44b.h" #include "44blib.h" #include "rtc.h"
typedef (*ISR_ROUTINE_ENTRY)(void); #define Printf Uart_Printf void Zdma0(int srcAddr, int dstAddr, int length); void Zdma0Done(void); void Test_Zdma0(void); void isr_dma0(void); volatile int zdma0Done; void IsrIRQ() _attribute_ ((interrupt("IRQ")));
70
DMA 测试程序主函数 int Main(void) { Uart_Select(0); Uart_Init(MCLK, 115200);
Uart_Printf("DMA TEST PROGRAM\n"); rINTCON = 0x7; init_interrupt_handler((unsigned int)IsrIRQ); install_isr_handler(HandleZDMA0, (void *)isr_dma0); / ****设置所有中断为IRQ模式**** / rINTMOD = 0x0; / ***** *使能TICK模式**** ** / rINTMSK = (0x07FFFFFF&~(BIT_GLOBAL|BIT_ZDMA0)); / *****打开IRQ模式的中断***** / rINTCON = 0x5; Test_Zdma0(); while(1); }
71
Test_Zdma0 void Test_Zdma0(void) { unsigned char *src,*dst; int i;
unsigned int memSum; Uart_Printf("[ZDMA0 MEM2MEM Test]\n"); dst=(unsigned char*)malloc(0x80000); src=(unsigned char*)malloc(0x80000); / ***将区域设置为非Cacheable区域,关闭Cache ***/ rNCACHBE1=(((((unsigned)dst+0x100000)>>12)+1)<<16)| ((unsigned)dst>>12); Uart_Printf("dst=%x,src=%x\n",(int)dst,(int)src); Zdma0((int)src,(int)dst,0x80000); free(src); free(dst); }
72
Zdma0 void Zdma0(int srcAddr,int dstAddr,int length) { int time;
/ ***将目标地址设置为非Cache区****/ rNCACHBE1=(((((unsigned)dstAddr+0x100000)>>12)+1)<<16)| ((unsigned)dstAddr>>12); / **启动定时器,精度128μs,用于计时**/ Timer_start(3); for(time=0;time<length;time++) *(unsigned char*)(dstAddr+time)=*(unsigned char*)(srcAddr+time); } time=Timer_Stop(); Uart_Printf("Copy Bytes:time=%f\n",time*128E-6);
73
Zdma0(续) / *****测试半字方式的拷贝时间**** / Timer_start(3);
for(time=0;time<length;time+=2) { *(unsigned short*)(dstAddr+time)=*(unsigned short*)(srcAddr+time); } time=Timer_Stop(); Uart_Printf("Copy short words:time=%f\n",time*128E-6); / *****测试字方式的拷贝时间***** / for(time=0;time<length;time+=4) *(unsigned long*)(dstAddr+time)=*(unsigned long*)(srcAddr+time); Uart_Printf("Copy Words:time=%f\n",time*128E-6);
74
Zdma0(续) / *****清除传输完毕标志*****/ zdma0Done = 0; /***设置传输的起止地址和长度***/
rZDISRC0=srcAddr|(2<<30)|(1<<28); rZDIDES0=dstAddr|(2<<30)|(1<<28); rZDICNT0=length|(2<<28)|(1<<26)|(3<<22)|(1<<20); / ******启动DMA传输***** / rZDCON0 = 0x1; Timer_Start(3); / *****等待传输完成******/ while(zdma0Done==0); time=Timer_Stop(); Uart_Printf("ZDMA0:time=%f\n",time*128E-6); rINTMSK=BIT_GLOBAL; }
75
ZDMA0 中断处理函数 void isr_dma0(void) { /**清除DMA中断标志**/ rI_ISPC=BIT_ZDMA0;
/**设置传输完毕标志**/ zdma0Done=1; }
76
输出结果 DMA TEST PROGRAM [ZDMA0 MEM2MEM TEST] Dst = c00a400,src = c08a408
Copy Bytes : time = Copy short words : time = Copy words : time = ZDMA0 : time =
77
BDMA 编写程序播放一段由 wav 文件保存的录音(实验来源文献[2] )
78
IIS IIS 是一种串行总线设计技术,是 SONY 和 PHILIPS 等公司共同推出的接口标准,主要针对数字音频处理技术和设备
在实验中,IIS 总线接口由处理器S3C44B0X 的 IIS 模块和音频芯片UDA1341 硬件来实现
79
UDA1341TS 电路中使用的音频芯片是 PHILIPS 公司的 UDA1341TS 音频数字信号编译码器
UDA1341TS 可将立体声模拟信号转化为数字信号,同样也能把数字信号转换成模拟信号,并可用 PGA(可编程增益控制)和 AGC(自动增益控制)对模拟信号进行处理。 对于数字信号,该芯片提供了DSP(数字音频处理)功能。
80
IIS 接口电路
81
IIS 总线框图
82
IIS 总线和 MSB-Justified格式数据接口格式
83
编解码时钟
84
可用的串行位时钟频率
85
S3C44B0X IIS 接口工作模式 单独发送或接收模式 发送和接收模式(同时)
86
单独发送或接收模式 正常传输模式 DMA 传输模式
87
正常传输模式 如果发送队列非空,当队列发送数据准备就绪时,就绪标志位被置 1;如果发送队列为空,就绪标志位被置 0
如果接收队列未满,就绪标志位被置 1;如果接收队列为满,就绪标志位被置 0 这些标志位决定了 CPU 读或写队列的时间
88
DMA 传输模式 发送或接收队列的访问是由 DMA 控制器来完成的 在发送或接收模式中, DMA 服务请求由队列的就绪标志位自动给出
89
发送和接收模式(同时) IIS 总线接口能够同时发送和接收数据
因为只有一个 DMA 源,只能是一个通道用正常传输模式,另一个通道用 DMA 传输模式
90
IIS 功能测试函数 void Test_Iis(void) { //初始化IIS接口 IISInit(); //播放wav文件
Playwave(); }
91
初始化 IIS 接口 void IISInit(void) { //设置I/O口PE8输出CODECLK信号
rPCONE=(rPCONE&0xffff)+(2<<16); //初始化UDA1341芯片 Init1341(); }
92
初始化 UDA1341 芯片 void Init1341() { //配置与L3接口相连的I/O口 //设置PA9为输出,PA9连接L3D
rPCONA=0x1ff; //设置连接L3M的PB4和连接L3C的PB5端口 rPCONB=0x7CF; //设置起始L3M和L3C输出高电平 rPDATB=L3M | L3C;
93
初始化 UDA1341 芯片(续) //通过L3总线初始化1341芯片
_WrL3Addr(0x14+2) ; //写状态地址000101xx+10 _WrL3Data(0x60,0); //0,1,10,000,0复位,256fs, //无直流滤波器,IIS _WrL3Addr(ox14+2); //写状态地址000101xx+10 _WrL3Data(0x20,0); //0,0,10,000,0无复位,256fs, _WrL3Addr(0x14+2); //写状态地址000101xx+10 _WrL3Data(0x81,0); //1,0,0,0,0,0,11 OGS=0,IGS=0,ADC_NI //DAC_NI,sngl speed,AonDon _WrL3Addr(0x14+0); //写DATA0地址000101xx+10 _WrL3Data(0x0A,0); }
94
初始化 UDA1341 芯片(续) _WrL3Addr(U8 data) 是通过 L3 总线接口写控制数据地址 (data) 到 1341 芯片 _WrL3Data(U8 data,int halt) 是通过 L3总线接口写控制数据 (data 和停止操作)到 1341 芯片
95
播放wav声音文件 void Playwave( ) { int sound_len,i;
unsigned short* pWavFile; //wav文件数据首地址 pWavFile=(unsigned short *)0xC030000; rINTMOD=0x0; //使能中断 rINTCON=0x1; pISR_BDMA0=(unsigned)BDMA0_Done; //设置BDMA中断 rINTMSK=~(BIT_GLOBAL|BIT_BDMA0);
96
播放wav声音文件(续) //循环播放声音文件 for(;;) { //初始化变量 //初始化DMA中断结束标志 iDMADone=0;
//设置声音数据长度,未处理文件头 sound_len=155956; //DMA源:16位数据,增长方式,外存储区 rBDISRC0=(1<<30)+(1<<28)+((int)(pWavFile)); //DMA目的:M2IO,内部模块,IISFIF rBDIDES0=(1<<30)+(3<<28)+((int)rIISFIF); //设置DMA请求源为IIS,中断方式,自动重载,使能DMA rBDICNT0=(1<<30)+(1<<26)+(3<<22)+(0<<21)+(1<<20)+sound_len; rBDCON0=0X0<<2;
97
播放wav声音文件(续) //IIS初始化 //使能发送DMA,接收空闲,使能分频 rIISCON=0x22;
//主模式,发送,发送模式,左通道低电平,IIS格式,16位数据,2566fs,32fs rIISMOD=0xC9; //分频因子为6 rIISPSR=0x22; //接收、发送DMA模式,使能FIFO rIISFCON=0xF00; //使能IIS rIISCON|=0x1; //等待直到DMA传送结束 while(iDMADone==0); //禁止IIS rIISCON=0x0; }
98
BDMA0 中断处理函数 void BDMA0_Done(void) { //清除中断挂起位 rI_ISPC=BIT_BDMA0;
//设置中断结束标志 iDMADone=1; }
99
参考文献 [1] 田泽,嵌入式系统开发与应用教程,北京:北京航空航天大学出版社,2005
[2] 田泽,嵌入式系统开发与应用实验教程,北京:北京航空航天大学出版社,2005 [3] S3C44B0X RISC MICROPROCESSOR [4] 陈赜等,ARM嵌入式技术实验教程,北京:北京航空航天大学出版社,2005
100
谢谢 Thank you!
Similar presentations