嵌入式系统讲义 第4章 S3C2410X系统结构 周国运 2007.3
第三章习题解答 1、 ARM指令中的第二操作数“operand2”有哪些具体形式? 解:有三种:寄存器、寄存器移位、8位位图立即数。
解:(1)基地址可以是通用寄存器R0---R15中的任意一个。 (2)偏移地址可以有三种形式:12位立即数、寄存器、寄存器移位。 2、 对于ARM的变址寻址方式,有基地址和偏移地址两部分组成。(1)基地址可以是哪些寄存器?(2)偏移地址可以有哪些形式?(3)总地址的计算方法有哪些?怎么表示?(4)变址寻址应用于哪些指令? 解:(1)基地址可以是通用寄存器R0---R15中的任意一个。 (2)偏移地址可以有三种形式:12位立即数、寄存器、寄存器移位。 (3)总地址的计算方法。有三种:前索引偏移、后索引偏移、程序相对偏移。 即偏移地址的计算方法 前索引偏移:即先使用偏移,后传送数据。不定修改基地址。 如:LDR Rd,[Rn,#m]; STR Rd,[Rn,#m]!(修改基地址) 后索引偏移:即先传送数据,后先使用偏移,修改基地址。 如:LDR Rd,[Rn],#m 相对偏移:寻址地址在PC中,以当前指令为基地址,±4KB内。 如:LDR Rd,lable ;lable为程序标号 (4) 有4条指令: LDR、STR、LDM、STM
3、 存储器从0x400000开始的100个单元中存放着ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其它的ASCII码不做变换。 解: MOV R0,#0x400000 MOV R1,#0 LP LDRB R2,[R0,R1] CMP R2,#0x61 BLO NEXT CMP R2,#0x7B ;0x61---0x7A为小写字母的ASC SUBLO R2, R2,#0x20 STRBLO R2,[R0,R1] NEXT ADD R1, R1,#1 CMP R1,#100 BNE LP
4、 编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。 解: MOV R0,#0x400000 LDR R1,[R0] ;取第1个数 LDR R2,[R0,#4] ;取第2个数 CMP R1,R2 ;两个数相比较 MOVHI R1,#1 ;R1大 MOVLO R1,# -1 ;R1小 MOVEQ R1,#0 ;两个数相等 STR R1,[R0,#8]
7、 编写一程序,存储器中从0x400200开始有一个64位数。(1)将取反,再存回原处;(2)求其补码,存放到0x400208处 。 解: LDR R0,=0x400200 LDR R2,=0xFFFFFFFF LDR R1,[R0] ;取低32位数 EOR R1,R1,R2 ;取反 STR R1,[R0] ;存低32位反码 ADDS R1,R1,#1 ;又加1为求补 STR R1,[R0,#8] ;存低32位补码 LDR R1,[R0,#4] ;取高32位数 STR R1,[R0,#4] ;存高32位反码 ADC R1,R1,#0 ;高32位求补 STR R1,[R0,#12] ;存高32位补码
8、 编写一简单ARM汇编程序段,实现1+2+…+100的运算。 解: MOV R2,#100 MOV R1,#0 LOOP ADD R1,R1,R2 ;R1中为累加和 SUBS R2,R2,#1 ;R2控制循环 BNE LOOP
习 题 本章作业:2、3、5、7、10、12、15 1、S3C2410X主要特性有哪些? 习 题 本章作业:2、3、5、7、10、12、15 1、S3C2410X主要特性有哪些? 2、S3C2410X的结构分为几个部分?每一部分主要由哪些部件构成? 3、S3C2410X的存储器由哪几部分构成,每一部分有什么特点?存储器主要有哪些控制寄存器? 4、S3C2410X的Flash有哪些特点? 5、S3C2410X的DMA有哪些特点?其工作过程是怎样的?每个通道配置有哪些寄存器? 6、S3C2410X的A/D转换器有哪些特点?有哪些相关的寄存器? 7、编写一程序,用查询的方式,对S3C2410X的A/D转换器的第0通道连续进行100次A/D转换,然后将其结果求平均值。注意:A/D转换器有独立的模拟信号输入引脚AIN0---AIN9。
8、S3C2410X的中断系统有哪些特点?相关的寄存器有哪些? 9、S3C2410X的中断控制器的工作过程是怎样的?对于IRQ,整个中断过程是怎样的(中断控制器处理,向CPU请求,转到中断入口,转去获得中断服务程序的首地址,执行中断服务程序)? 10、编写一程序,使用外部中断EINT0,用中断方式对端口C做数据输入。(注意对中断系统和相关引脚进行初始化) 提示:C语言指向特定地址的方法: (1)#define rGPCDAT (*(volatile unsigned *)0x56000024) (2)int *rGPCDAT=0x56000024; (3)int *rGPCDAT; rGPCDAT=0x56000024; 用第一种方法为好。 11、S3C2410X的定时器系统有哪些特点?由哪几部分构成?相关的寄存器有哪些?是如何工作的?
14、S3C2410X的串行接口UART有哪些特点?由哪几部分构成?相关的寄存器有哪些?是如何工作的? 12、编写一程序,使用timer0产生并输出频率为10KHz、占空比为1/2的方波。设f pclk=50MHz。(注意对timer0和相关引脚初始化) 13、编写一程序,利用S3C2410X的PWM功能对一直流电机进行调速,要求使用timer1产生并输出频率为10KHz、占空比可变的方波进行控制,电机的转速变化如下图所示。设f pclk=50MHz。(注意对timer0和相关引脚初始化) 14、S3C2410X的串行接口UART有哪些特点?由哪几部分构成?相关的寄存器有哪些?是如何工作的? t0 2*t0 t v
15、编写一程序,使用S3C2410X的UART2进行串行数据收发,要求用脉冲请求中断的方式、使用收/发FIFO,8个数据位、1个停止位、不校验,波特率为125kb/s。设Pclk为50MHz。(提示:主程序对UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行收发,并且清除中断请求标志和中断服务标志) 16、S3C2410X的SPI接口有哪些特点?由哪几部分构成?相关的寄存器有哪些?是如何工作的? 17、编写一程序,使用S3C2410X的UART2进行串行数据收发,要求用脉冲请求中断的方式、使用收/发FIFO,8个数据位、1个停止位、不校验,波特率为125kb/s。设Pclk为50MHz。(提示:主程序对UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行收发,并且清除中断请求标志和中断服务标志)
18、 把S3C2410的SPI0设为主设备,同时把SPI1设为从设备,将二者的MOSI、MISO交叉相连,二者的SCL对连, 用GPG0引脚控制nSS1。编写程序, SPI0用中断方式、 SPI1用查询方式,采用格式B、1Mb/s的波特率,SPI0发送数据、SPI1接收数据,发送、接收100个字节的数据。设系统Pclk=50MHz。
第4章 S3C2410X系统结构 主要内容 4.1 S3C2410X概述 4.2 存储器配置 4.8 UART接口 4.3 DMA 4.2 存储器配置 4.3 DMA 4.4 ADC和触摸屏接口 4.5 中断控制器 4.6 I/O端口 4.7 PWM 主要内容 4.8 UART接口 4.9 SPI接口 4.10 IIC接口 4.11 RTC 4.12时钟和电源管理 4.13看门狗 4.14 其它接口
4.14 其它接口 1、 USB接口 2、 LCD控制器 3、 SD接口 4、 IIS接口
4.1 S3C2410X概述 主要内容 主要特性 系统结构 引脚信号
4.1 S3C2410X概述 S3C2410X是韩国三星公司推出的16/32位RISC微控制器,其CPU采用的是ARM920T内核,加上丰富的片内外设,为手持设备和其它应用,提供了低价格、低功耗、高性能微控制器的解决方案。 一、主要特性 具有16KB指令Cache、 16KB数据Cache和存储器管理单元MMU。 外部存储器控制器,可扩展8组,每组128MB,总容量达1GB;支持从Nand flash存储器启动。
55个中断源,可以设定1个为快速中断,有24个外部中断,并且触发方式可以设定。 4通道的DMA,并且有外部请求引脚。 3个通道的UART,带有16字节的TX/RX FIFO,支持IrDA1.0功能。 具有2通道的SPI、1个通道的IIC串行总线接口和1个通道的IIS音频总线接口。 有2个USB主机总线的端口,1个USB设备总线的端口。 有4个具有PWM功能的16位定时器和1个16位内部定时器。 8通道的10位A/D转换器,最高速率可达500kB/s;提供有触摸屏接口。 具有117个通用I/O口和24通道的外部中断源。
兼容MMC的SD卡接口。 具有电源管理功能,可以使系统以普通方式、慢速方式、空闲方式和掉电方式工作。 看门狗定时器。 具有日历功能的RTC。 有LCD控制器,支持4K色的STN和256K色的TFT,配置有DMA通道。 具有PLL功能的时钟发生器,时钟频率高达203MHz。 双电源系统:1.8/2.0V内核供电,3.3V存储器和I/O供电。
二、系统结构 主要由两大部分构成: ARM920T内核 片内外设。
1、ARM920T内核 由三部分:ARM9内核ARM9TDMI、32KB的Cache、MMU。
2、片内外设 分为高速外设和低速外设,分别用AHB总线和APB总线。
三、引脚信号 S3C微控制器是272-FBGA封装。 其信号可以分成 addr0---addr26、 Data0---data31、 GPA0---GPA22 GPB10、GPC15、 GPD15、GPE15、 GPF7、GPG15、 GPH10、EINT23、 nGCS0—nGCS7、 AIN7、IIC、SPI、 OM0---OM3 等,大部分都是复用的
4.2 S3C2410X的存储器 主要内容 存储器配置 Flash及控制器 存储器概述 控制寄存器 Flash控制器概述 控制器主要特性 控制器的寄存器 控制器的工作原理
4.2 存储器配置 4.2.1 S3C2410X的存储器配置 一、概 述 S3C2410X的存储器管理器提供访问外部存储器的所有控制信号:26位地址信号、32位数据信号、8个片选信号、以及读/写控制信号等。 S3C2410X的存储空间分成8组,最大容量是1GB,bank0---bank5为固定128MB,bank6和bank7的容量可编程改变,可以是2、4、8、16、32、64、128MB,并且bank7的开始地址与bank6的结束地址相连接,但是二者的容量必须相等。 bank0可以作为引导ROM,其数据线宽只能是16位和32位,复位时由OM0、OM1引脚确定;其它存储器的数据线宽可以是8位、16位和32位。 S3C2410X的存储器格式,可以编程设置为大端格式,也可以设置为小端格式。
注意:补充引脚信号
二、存储器的控制寄存器 内存控制器为访问外部存储空间提供存储器控制信号, S3C2410X存储器控制器共有13个寄存器。 第9次到 此此 地 址 功 能 操作 复位值 BWSCON 0x48000000 总线宽度和等待控制 读/写 0x0 BANKCON0 0x48000004 BANK0控制 0x0700 BANKCON1 0x48000008 BANK1控制 BANKCON2 0x4800000C BANK2控制 BANKCON3 0x48000010 BANK3控制 BANKCON4 0x48000014 BANK4控制 BANKCON5 0x48000018 BANK5控制 BANKCON6 0x4800001C BANK6控制 0x18008 BANKCON7 0x48000020 BANK7控制 REFRESH 0x48000024 SDRAM刷新控制 0xAC0000 BANKSIZE 0x48000028 可变的组大小设置 MRSRB6 0x4800002C BANK6模式设置 xxx MRSRB7 0x48000030 BANK7模式设置
1、总线宽度和等待控制寄存器 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 ST7 WS7 DW7 ST6 WS6 DW6 ST5 WS5 DW5 ST4 WS4 DW4 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 ST3 WS3 DW3 ST2 WS2 DW2 ST1 WS1 DW1 X DW0 STn:控制存储器组n的UB/LB引脚输出信号。 1:使UB/LB与nBE[3:0]相连; 0:使UB/LB与nWBE[3:0]相连 WSn:使用/禁用存储器组n的WAIT状态 1:使能WAIT;0:禁止WAIT DWn:控制存储器组n的数据线宽 00:8位;01:16位;10:32位;11:保留
2、BANKn---存储器组控制寄存器(n=0--5) 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Tacs Tcos Tacc Tcoh Tcah Tacp PMC Tacs:设置nGCSn有效前地址的建立时间 00:0个;01:1个;10:2个;11:4个时钟周期 Tcos:设置nOE有效前片选信号的建立时间 Tacc:访问周期 000:1个;001:2个;010:3个;011:4个时钟 100:6个:101:8个;110:10个;111:14个
Tcoh:nOE无效后片选信号的保持时间 00:0个;01:1个;10:2个;11:4个时钟 Tcah: nGCSn无效后地址信号的保持时间 Tacp:页模式的访问周期 00:2个;01:3个;10:4个;11:6个时钟 PMC:页模式的配置,每次读写的数据数 00:1个;01:4个;10:8个;11:16个 注:00为通常模式。 注:紫色为实验箱上的配置,其值为0x0700
3、BANK6/7---存储器组6/7控制寄存器 31 …… 17 16 15 保留 MT 14 13 12 11 10 9 8 7 6 5 Tacs Tcos Tacc Tcoh Tcah Tacp/ Trcd PMC/ SCAN MT:设置存储器类型 00:ROM或者SRAM,[3:0]为Tacp和PMC; 11:SDRAM, [3:0]为Trcd和SCAN; 01、10:保留 Trcd:由行地址信号切换到列地址信号的延时时钟数 00:2个时钟;01:3个时钟;10:4个时钟 SCAN:列地址位数 00:8位; 01:9位; 10:10位
4、REFRESH---刷新控制寄存器 31 …… 24 23 22 21 20 19 18 17 16 保 留 Trp Tsrc 保留 REFEN TREFMD Trp Tsrc 保留 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 保 留 Refresh_count REFEN:刷新控制。 1:使能刷新;0:禁止刷新 TREFMD:刷新方式。 1:自刷新 0:自动刷新 Trp:设置SDRAM行刷新时间(时钟数) 00:2个时钟;01:3个;10:3个;11:4个时钟 Tsrc:设置SDRAM行操作时间(时钟数) 00:4个时钟;01:5个;10:6个;11:7个时钟 注: SDRAM的行周期= Trp + Tsrc。 Refresh_count:刷新计数值
刷新周期=(211- Refresh_count+1)/HCLK 计算公式: 刷新周期=(211- Refresh_count+1)/HCLK 例子:设刷新周期=15.6µs,HCLK=60MHz 则 刷新计数器值=211+1-60×15.6=1113 1113=0x459=0b10001011001
5、BANKSIZE---BANK6/7组大小控制寄存器 4 3 2 1 BURST_EN X SCKE_EN SCLK_EN BK76MAP 高24位未用。 BURST_EN:ARM突发操作控制 0:禁止突发操作;1:可突发操作 SCKE_EN:SCKE使能控制SDRAM省电模式 0:关闭省电模式;1:使能省电模式 SCLK_EN:SCLK省电控制,使其只在SDRAM访问周期内使能SCLK 0:SCLK一直有效;1:SCLK只在访问期间有效 BK76MAP:控制BANK6/7的大小及映射
BK76MAP:控制BANK6/7的大小及映射 100:2MB; 101:4MB; 110:8MB 111:16MB; 000:32MB; 001:64MB 010:128MB
6、MRSRB6/7---BANK6/7模式设置寄存器 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 WBL TM CL BT BL WBL:突发写的长度。0:固定长度;1:保留 TM:测试模式。 00:模式寄存器集;其它保留 CL:列地址反应时间 000:1个时钟;010:2个时钟; 011:3个时钟;其它保留 BT:猝发类型 0:连续; 1:保留 BL:猝发时间 000:1个时钟;其它保留
4.2.2 Nand Flash及其控制器 主要内容 1、Nand Flash控制器概述 2、控制器主要特性 3、控制器的寄存器 4、控制器的工作原理
4.2.2 Nand Flash及其控制器 一、Nand Flash控制器概述 Nor flash存储器:读速度高,而擦、写速度低,容量小,价格高。 Nand flash存储器:读速度不如Nor flash,而擦、写速度高,容量大,价格低。有取代磁盘的趋势。 因此,现在不少用户从Nand flash启动和引导系统,而在SDRAM上执 行主程序代码。 一、Nand Flash控制器概述 S3C2410X微控制器从Nand flash的引导功能:其内部有一个叫做“起步石(Steppingstone)”的 SRAM缓冲器,系统 启动时,Nand flash存储器的前面4KByte字节将被自动载入到起步石中,然后系统自动执行这些载入的引导代码。引导代 码执行完毕后,自动跳转到SDRAM执行。 Nand flash操作的校验功能:使用S3C2410X内部硬件ECC功能可以对Nand flash的数据进行有效性的检测。
二、 Nand Flash控制器主要特性 Nand Flash模式:支持读/擦/编程Nand flash存储器。 自动导入模式:复位后,引导代码被送入Steppingstone,传送后,引导代码在 Steppingstone中执行。 具有硬件ECC(纠错码)功能:硬件产生纠错代码。 内部4KB的SRAM缓冲器Steppingstone,在Nand flash引导后可以作为其他用途使用。
Nand Flash控制器功能框图 主要由6部分组成 引脚信号: CLE:命令锁存 R/nB :就绪/忙
三、Nand Flash 控制器的寄存器 寄存器 地 址 功 能 操作 复位值 NFCON 0x4E000000 Nand Flash配置 地 址 功 能 操作 复位值 NFCON 0x4E000000 Nand Flash配置 读/写 - NFCMD 0x4E000004 Nand Flash命令 NFADDR 0x4E000008 Nand Flash地址 NFDATA 0x4E00000C Nand Flash数据 NFSTAT 0x4E000010 Nand Flash状态 NFECC 0x4E000014 Nand Flash纠错
1、NFCON---Flash配置寄存器 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 NFEN X IECC NFCE TACLE TWRPH0 PWRPH1 - NFEN:NF控制器使能控制 0:禁止使用; 1:允许使用 IECC:初始化ECC编码/解码器控制位 0:不初始化ECC; 1:初始化ECC NFCE:NF片选信号nFCE控制位持续时间设置 0: nFCE为低有效; 0: nFCE为高无效 TACLE:CLE/ALE持续时间设置值(0---7) 持续时间= HCLK * (TACLS + 1) CLE/ALE :命令/地址锁存允许
2、NFCMD---Flash命令寄存器 TWRPH0:写信号持续时间设置值(0~7) 持续时间= HCLK * (TWRPH0+1) TWRPH1:写信号无效后CLE/ALE保持时间设置值(0~7) 持续时间= HCLK * (TWRPH1+1) 2、NFCMD---Flash命令寄存器 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 保 留 命令字
3、NFADDR---Flash地址寄存器 4、NFDATA---Flash数据寄存器 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 保 留 地址值 高24位未用,低8位为Flash存储器地址值 4、NFDATA---Flash数据寄存器 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 保 留 输入/输出数据 高24位未用,低8位为读入或者写出的数据
5、NFSTAT---Flash状态寄存器 6、NFECC---Flash错误校正码寄存器 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 保 留 RnB RnB:Nand Flash存储器状态位 0:存储器忙; 1:存储器准备好 6、NFECC---Flash错误校正码寄存器 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 保 留 错误校正码#2 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 错误校正码#1 错误校正码#0
四、Nand Flash 控制器的工作原理 1、自动导入启动代码步骤 完成复位。 如果自动导入模式使能,Nand flash存储器的前面4K字节被自动拷贝到Steppingstone 内部缓冲器中。 Steppingstone被映射到nGCS0对应的BANK0存储空间。 CPU在Steppingstone的4-KB内部缓冲器中开始执行引导代码。 注意: 在自动导入模式下,不进行ECC检测。因此,Nand flash的前4KB应确保不能有位错误(一 般Nandflash厂家都确保)。
2、Nand FLASH模式配置 通过NFCONF寄存器配置Nand flash; 写Nand flash命令到NFCMD寄存器; 写Nand flash地址到NFADDR寄存器; 在读写数据时,通过NFSTAT寄存器来获得Nand flash的状态信息。应该在读操作前或写入 之后检查R/nB信号(准备好/忙信号)。 在读写操作后要查询校验错误代码,对错误进行纠正。
OM[1:0] = 00b:使能Nand flash控制器自动导入模式; OM[3:0]为芯片引脚,设置引导模式、存储器bank0的数据宽度、时钟模式等。 OM[1:0] = 01b、10b: bank0数据宽度为16位、32位 OM[1:0]=11b:测试模式 Nand flash的存储页面大小应该为512字节。 NCON :Nand flash 寻址步骤数选择 0:3步寻址; 1:4步寻址
S3C2410A在写/读操作时,每512字节数据自动产生3字节的ECC奇偶代码(24位)。 4、Nand Flash操作的校验问题 S3C2410A在写/读操作时,每512字节数据自动产生3字节的ECC奇偶代码(24位)。 24位 ECC 奇偶代码=18位行奇偶 + 6位列奇偶 ECC产生模块执行以下步骤: 当MCU写数据到Nand时,ECC产生模块生成ECC代码。 当MCU从Nand读数据时,ECC产生模块生成ECC代码同时用户程序将它与先前写入时产 生的ECC代码比较。
4.3 DMA控制器 主要内容 1、概述 2、工作原理 3、寄存器
一、概 述 S3C2410X有4 个通道的DMA 控制器,其位于在系统总线和外设总线之间。 一、概 述 S3C2410X有4 个通道的DMA 控制器,其位于在系统总线和外设总线之间。 每个DMA 通道都能没有约束的实现系统总线或者外设总线之间的数据传输,即每个通道都能处理下面四种情况: (1) 源器件和目的器件都在系统总线 (2) 源器件在系统总线,目的器件在外设总线 (3) 源器件在外设总线,目的器件在系统总线 (4) 源器件和目的器件都在外设总线 DMA的主要优点是:可以不通过CPU的中断来实现数据的传输,DMA的运行可以通过软件或者通过外围设备的中断和请求来初始化。
二、DMA工作原理 1、DMA的服务对象 每个DMA通道都有4个DMA请求源,通过设置,可以从中挑选一个服务。每个通道的DMA 请求源如表4-1所示。 表4-1 各通道的DMA 请求源 通道 源 请求源0 请求源1 请求源2 请求源3 请求源4 通道0 nXDREQ0 UART0 SDI Timer USB设备EP1 通道1 nXDREQ1 UART1 IIS/SDI SPI0 USB设备EP2 通道2 IISSDO IISSDI USB设备EP3 通道3 UART2 SPI1 USB设备EP4
2、DMA的工作过程 一般DMA的工作过程如下面所示 (1) 外设向DMAC 发出请求 (2)DMAC通过HOLD 向CPU 发出总线请求; 5 (1) 外设向DMAC 发出请求 (2)DMAC通过HOLD 向CPU 发出总线请求; (3)CPU响应释放三总线,并且发应答HLDA (4)DMAC向外设发DMA应答 2 3 4 1 (5)DMAC发出地址、控制信号,为外设传送数据; (6)传送完规定的数据后,DMAC撤销HOLD信号,CPU也撤销HLDA信号,并且恢复对三总线的控制。
S3C2410X的DMA工作过程可以分为三个状态: 状态1:等待状态。DMA 等待一个DMA请求。如果有请求到来,将转到状态2。在这个状态下,DMA ACK和INT REQ为0。 状态2:准备状态。DMA ACK变为1,计数器(CURR_TC)装入DCON[19:0]寄存器。 注意:DMA ACK保持为1直至它被清除。 状态3:传输状态。DMA控制器从源地址读入数据并将它写到目的地址,每传输一次,CURR_TC数器(在DSTAT中)减1,并且可能做以下操作: 重复传输:在全服务模式下,将重复传输,直到计数器CURR_TC变为0;在单服务模式下,仅传输一次。
说明:DMA传输分为一个单元传输和4个单元突发式传输。 设置中断请求信号:当CURR_TC变为0时,DMAC发出INT REQ信号,而且DCON[29]即中断设定位被设为1。 清除DMA ACK信号:对单服务模式,或者全服务模式 CURR_TC变为0。 注意:在单服务模式下,DMAC的3个状态被执行一遍,然后停止,等待下一个DMA REQ的到来。如果DMA REQ到来,则这些状态被重复操作,直到CURR_TC减为0 。 说明:DMA传输分为一个单元传输和4个单元突发式传输。
DMAC有3种类型的外部DMA请求/响应规则: (1)single service demand,单服务请求(对应于需求模式) (2)single service handshake,单服务握手(握手模式) (3)whole service handshake,全服务握手(全服务模式) 每种类型都定义了像DMA请求和DMA响应这些信号怎样与这些规则相联系。 demand 与 handshake模式的比较: 在一次传输结束时,DMA检查xnxDREQ(DMA请求)信号的状态: 在demand模式下:如果DMA请求(xnxDREQ)信号仍然有效,则传输马上再次开始。否则等待。 在handshake模式下:如果DMA请求信号无效,DMA在两个时钟周期后将DMA响应(xnxDACK)信号变得无效。否则,DMA等待直到DMA请求信号变得无效。每请求一次传输一次。
4、DMA时序要求 基本时序要求: DMA请求信号和响应信号的Setup时间与delay时间在所有的模式下是相同的。 如果DMA请求信号的setup时间满足要求,则在两个周期内实现同步,然后DMA响应信号变得有效。 在DMA响应信号有效后,DMA向CPU请求总线。如果它得到总线就执行操作。DMA操作完成后,DMA响应信号变得无效。
三、DMA控制器的相关寄存器 每个DMA 通道有9 个控制寄存器(4 个通道共计36 个寄存器),6 个用来控制DMA 传输,其它3 个监视DMA 控制器的状态。 Register Address R/W Description Reset Value DISRCn 0x4B0000x0 初始源基地址寄存器 0x00000000 DISRCCn 0x4B0000x4 初始源控制寄存器 DIDSTn 0x4B0000x8 初始目的基地址寄存器 DIDSTCn 0x4B0000xC 初始目的控制寄存器 DCONn 0x4B0000y0 DMA控制寄存器 DSTATn 0x4B0000y4 R 状态/计数寄存器 DCSRCn 0x4B0000y8 当前源地址寄存器 DCDSTn 0x4B0000yC 当前目的地址寄存器 SKTRIGn 0x4B0000z0 DMA掩码/触发寄存器 0b000
(在CURR_SRC为0、并且DMA ACK为1时装载入CURR_SRC) 1、DISRCn---DMA源基地址寄存器 原名: DMA初始源寄存器 第10次到此 寄存器 地 址 R/W 意 义 初 值 DISRC0 0x4B000000 DMA0源基地址寄存器 0x00000000 DISRC1 0x4B000040 DMA1源基地址寄存器 DISRC2 0x4B000080 DMA2源基地址寄存器 DISRC3 0x4B0000C0 DMA3源基地址寄存器 31 30 …… 0 S_ADDR---源数据基地址 (在CURR_SRC为0、并且DMA ACK为1时装载入CURR_SRC)
2、DISRCCn---DMA源控制寄存器 地 址 R/W 意 义 初 值 DISRCC0 0x4B000004 DMA0初始源控制寄存器 0x00000000 DISRCC1 0x4B000044 DMA1初始源控制寄存器 DISRCC2 0x4B000084 DMA2初始源控制寄存器 DISRCC3 0x4B0000C4 DMA3初始源控制寄存器 31 …… 2 1 保留(为0) LOC---源总线选择 INC---源地址变化设置 LOC---源所在总线选择 0:AHB; 1:APB INC---源地址变化设置 0:源地址增加; 1:源地址不变
D_ADDR---目标基地址,会被载入CURR_DST (当CURR_DST的值为0、并且 DMA ACK 的值为1时) 3、DIDSTn---DMA目的基地址寄存器 原名: DMA初始目的寄存器 寄存器 地 址 R/W 意 义 初 值 DIDST0 0x4B000008 DMA0目的基地址寄存器 0x00000000 DIDST1 0x4B000048 DMA1目的基地址寄存器 DIDST2 0x4B000088 DMA2目的基地址寄存器 DIDST3 0x4B0000C8 DMA3目的基地址寄存器 31 30 …… 0 D_ADDR---目标基地址,会被载入CURR_DST (当CURR_DST的值为0、并且 DMA ACK 的值为1时)
4、DIDSTCn---DMA初始目的控制寄存器 地 址 R/W 意 义 初 值 DIDSTC0 0x4B00000C DMA0初始目的控制寄存器 0x00000000 DIDSTC1 0x4B00004C DMA1初始目的控制寄存器 DIDSTC2 0x4B00008C DMA2初始目的控制寄存器 DIDSTC3 0x4B0000CC DMA3初始目的控制寄存器 31 …… 2 1 保留(为0) LOC---目的总线选择 INC---目的地址变化设置 LOC---目的地址所在总线选择 0:AHB; 1:APB INC---目的地址地址变化设置 0:目的地址增加; 1:目的地址不变
5、DCONn---DMA控制寄存器 寄存器 地 址 R/W 意 义 初 值 DCON0 0x4B000010 DMA 0 控制寄存器 地 址 R/W 意 义 初 值 DCON0 0x4B000010 DMA 0 控制寄存器 0x00000000 DCON1 0x4B000050 DMA 1 控制寄存器 DCON2 0x4B000090 DMA 2 控制寄存器 DCON3 0x4B0000D0 DMA 3 控制寄存器 31 30 29 28 27 26 25 24 23 22 21 20 DMD _HS SYNC INT TSZ SERV MODE HWSRCSEL SWHW _SEL RE LOAD DSZ 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 TC---传输次数初值
DMD_HS---DMA与外设握手模式选择 0:需求模式。为单服务,但只要DREQ信号有效便传输 31 30 29 28 27 26 25 24 23 22 21 20 DMD _HS SYNC INT TSZ SERV MODE HWSRCSEL SWHW _SEL RE LOAD DSZ DMD_HS---DMA与外设握手模式选择 0:需求模式。为单服务,但只要DREQ信号有效便传输 1:握手模式。为单服务,要等待DREQ信号变为无效, DREQ再有效时才传输。 SYNC---DREQ 和DACK信号与系统总线时钟同步选择 0:DREQ和DACK与PCLK(APB clock)同步。慢速外设 1:DREQ和DACK与HCLK(AHB clock)同步。高速外设 INT---CURR_TC的中断请求控制 0:禁止CURR_TC产生中断请求 1:当所有的传输结束时,CURR_TC产生中断请求 TSZ---传输长度类型选择 0:执行单数据传输 1:执行四数据长的突发传输
HWSRCSEL ---各DMA通道请求源设置 31 30 29 28 27 26 25 24 23 22 21 20 DMD _HS SYNC INT TSZ SERV MODE HWSRCSEL SWHW _SEL RE LOAD DSZ SERVMODE---传输模式选择 0:单服务传输模式,每传输一次都要查询DREQ 1:全服务传输模式,不查询DREQ,但传输一次也要释 放总线。 HWSRCSEL ---各DMA通道请求源设置 HWSRCSEL 000 001 010 011 100 通道0 nXDREQ0 UART0 SDI Timer USB设备EP1 通道1 nXDREQ1 UART1 IISSDI SPI0 USB设备EP2 通道2 IISSDO USB设备EP3 通道3 UART2 SPI1 USB设备EP4
SWHW_SEL--- DMA源选择方式(软件或硬件)设置 31 30 29 28 27 26 25 24 23 22 21 20 DMD _HS SYNC INT TSZ SERV MODE HWSRCSEL SWHW _SEL RE LOAD DSZ SWHW_SEL--- DMA源选择方式(软件或硬件)设置 0:以软件software方式产生DMA请求,需要用DMASKTRIG控制寄存器中的SW_TRIG位设置触发。 1:由位[26:24]提供的DMA源触发DMA操作 RELOAD---再装载选择 0:自动再装载,当传输次数减为0时自动装载DMA初值 1:不自动再装载,传输结束关闭DMA通道。 DSZ---传输数据类型设置 00:字节; 01:半字; 10:字; 11:保留
6、DSTATn---DMA状态/计数寄存器 原名:DMA状态寄存器 地 址 R/W 意 义 初 值 DSTAT0 0x4B000014 R DMA0状态/计数寄存器 0x00000000 DSTAT1 0x4B000054 DMA1状态/计数寄存器 DSTAT2 0x4B000094 DMA2状态/计数寄存器 DSTAT3 0x4B0000D4 DMA3状态/计数寄存器 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 STAT CURRTC---当前传输次数计数值 STAT---DMA状态 00:就绪态,可进行传输; 01:DMA正在传输; 1X:保留 CURRTC---当前传输计数值 每传输一次其值减1。其初值在DCONn中低20位。
7、DCSRCn---DMA当前源地址寄存器 地 址 R/W 意 义 初 值 DCSRC0 0x4B000018 R DMA0当前源地址寄存器 0x00000000 DCSRC1 0x4B000058 DMA1当前源地址寄存器 DCSRC2 0x4B000098 DMA2当前源地址寄存器 DCSRC3 0x4B0000D8 DMA3当前源地址寄存器 31 30 …… 0 CURR_SRC---当前数据源地址 CURR_SRC---当前数据源地址 注意:(1)DMA每传输一次,其地址可能增加(1、2、4)、可能不变;(2)在CURR_SRC为0、且DMA ACK为1时,将S_ADDR源基地址的值装入。
8、DCDSTn---DMA当前目的地址寄存器 地 址 R/W 意 义 初 值 DCDST0 0x4B00001C R DMA0当前目的地址寄存器 0x00000000 DCDST1 0x4B00005C DMA1当前目的地址寄存器 DCDST2 0x4B00009C DMA2当前目的地址寄存器 DCDST3 0x4B0000DC DMA3当前目的地址寄存器 31 30 …… 0 CURR_DST---当前数据目的地址 CURR_DST---当前数据目的地址 注意:(1)DMA每传输一次,其地址可能增加(1、2、4) ; (2)在CURR_DST为0、且DMA ACK为1时,将D_ADDR的值装入。
9、DMASKTRIGn---DMA掩码(Mask)触发寄存器 地 址 R/W 意 义 初 值 DMASKTRIG0 0x4B000020 DMA0掩码触发寄存器 0x00000000 DMASKTRIG1 0x4B000060 DMA1掩码触发寄存器 DMASKTRIG2 0x4B0000A0 DMA2掩码触发寄存器 DMASKTRIG3 0x4B0000E0 DMA3掩码触发寄存器 31 …… 3 2 1 保留(为0) STOP ON/OFF SW_TRIG
STOP---DMA运行停止位 1:DMA将当前数据传输完立即停止,并且CURR_TC变为0。 注意:如果ON/OFF设置为OFF,则DMA也停止传输。 ON/OFF---DMA通道屏蔽位 0:关闭通道; 1:开放通道 如果DCONn[22]设为非自动重装,DMA则传输完成后STOP位置1、并且关闭通道。 注意:在DMA运行期间,不要改变其值,并且也不要使用该位停止DMA传输,正确的方法应该使用STOP位。 SW_TRIG: DMA软件触发位 设为1时,实现软件触发DMA请求。 注意:只有当DCONn[23]设为软件触发DMA请求时,其软件触发才有效。
对DMA应用注意: 在DMA运行中改变DISRCn、DIDSTn寄存器以及改变DCONn中TC的值,对DMA当前的整个传输没有影响。而其它寄存器或位值的改变,将立即影响传输。
4.4 A/D转换与触摸屏 主要内容 1、概述 2、结构与工作原理 3、寄存器 4、应用举例
一、S3C2410X的A/D 转换器概述 S3C2410X中集成了一个8通道10 位A/D 转换器,A/D 转换器自身具有采样保持功能。并且S3C2410X的A/D 转换器支持触摸屏接口。 A/D转换器的主要特性: 分辨率:10位; 精度:±1LSB 线性度误差: ±1.5---2.0LSB; 最大转换速率:500KSPS; 输入电压范围:0~3.3v; 系统具有采样保持功能; 常规转换和低能源消耗功能; 独立/自动的X/Y 坐标转换模式。
二、A/D转换器结构与工作原理 下图为S3C2410 A/D 转换器和触摸屏接口的功能块图。 1、结构 主要由6部分构成: 信号输入通道 8转1切换开关 A/D转换器 控制逻辑 中断信号发生器 触摸屏接口
2、引脚信号(需要补充) 0:正常工作模式;
3、工作原理 (1)A/D 转换时间计算和分辨率 当PCLK 频率为50MHz,预分频值是49,10 位数字量的转换时间如下: A/D 转换频率=50MHz /(49+1)=1MHz 转换时间=1/(1MHz/5 个周期)=1/200KHz=5us A/D 转换器最大可以工作在2.5MHz 时钟下,所以转换速率可以达到500KSPS。 (2)触摸屏的结构及工作原理 原理:对于电阻式触摸屏,由3层透明薄膜构成,有一层是电阻层,还有一层是导电层,它们中间有一隔离层,当某一点被按压时,在按压点电阻层与导电层接触,如果在电阻层的一边接电源,另一边接地,便可测量出按压点的电压,从而可算出其坐标。 实现方法:
测量X坐标:从XP输出电压给X+端,从XM输出地电位给X-端;从YP脚输入按压点电压。 控制信号: nYPON=1; nYMON=0 nXPON=0; nXMON=1 测Y 测X
测量Y坐标:从YP输出电压给Y+端,从YM输出地电位给Y-端;从XP脚输入按压点电压。 控制信号: nYPON=0; nYMON=1 nXPON=1; nXMON=0 测Y 测X
3、S3C24120X A/D转换器的工作模式 有5种:普通转换模式、分离的X/Y坐标转换模式、连续的X/Y坐标转换模式、等待中断模式、静态模式。第2---4种是用于触摸屏。 (1)普通转换模式 用于一般A/D转换,不是用于触摸屏。转换结束后,其数据在ADCDAT0中的XPDATA域。 (2)分离的X/Y坐标转换模式 分两步进行X/Y坐标转换,其转换结果分别存于ADCDAT0中的XPDATA域中和ADCDAT1中的YPDATA域中,并且均会产生INT_ADC中断请求。 (3)自动(连续)的X/Y坐标转换模式 X坐标转换结束启动Y坐标转换,其转换结果分别存于ADCDAT0中的XPDATA域中和ADCDAT1中的YPDATA域中,然后产生INT_ADC中断请求。
(4)等待中断转换模式 在该模式下,转换器等待使用者按压触摸屏,一旦触摸屏被按压,则产生INT_TC触摸屏中断请求。 中断后,在中断处理程序中再将转换器设置为分离的X/Y坐标转换模式、或者连续的X/Y坐标转换模式进行处理。 触摸屏接口信号: XP=上拉 XM=高阻 YP=AIN[5] YM=接地 (5)静态模式 当ADCCON中的STDBM设为1时,转换器进入静态模式,停止A/D转换。其数据域的数据保持不变。
三、ADC和触摸屏专用寄存器 有5个专用寄存器 Register Address R/W Description Reset Value ADCCON 0x58000000 ADC控制寄存器 0x3FC4 ADCTSC 0x58000004 触摸屏控制寄存器 0x058 ADCDLY 0x58000008 ADC起始延迟寄存器 0x00FF ADCDAT0 0x5800000C R ADC转换数据0寄存器 - ADCDAT1 0x58000010 ADC转换数据1寄存器
1、ADCCON---ADC控制寄存器 0:停止预分频器; 1:使能预分频器 15 14 13 …… 6 5 4 3 2 1 13 …… 6 ECFLG PRSCEN PRSCVL 5 4 3 2 1 SEL_MUX STDBM READ_START ENABLE_START ECFLG---转换结束标志(只读) 0:转换操作中; 1:转换结束 PRSCEN---转换器预分频器使能 0:停止预分频器; 1:使能预分频器 PRSCVL---转换器预分频器数值 数值N范围:1---255 注意:(1)实际除数值为N+1 (2)对N数值的要求:转换速率应该<PCLK/5
0:正常工作模式; 1:备用模式,不做A/D转换 5 4 3 2 1 SEL_MUX STDBM READ_START ENABLE_START SEL_MUX ---模拟输入通道选择 000:AIN0; 001:AIN1 010:AIN2 011:AIN3 …… 111:AIN7 STDBM---备用模式设置 0:正常工作模式; 1:备用模式,不做A/D转换 READ_START---通过读取启动转换 0:停止通过读取启动转换;1:使能通过读取启动转换 ENABLE_START---通过设置该位启动转换 0:无效; 1:启动A/D转换(启动后被清0) 注意:如果READ_START为1,则该位无效
2、ADCTSC---ADC触摸屏控制寄存器 8 7 6 5 4 3 2 1 保留0 YM_SEN YP_SEN XM_SEN XP_SEN PULL_UP AUTO_PST XY_PST YM_SEN---选择YMON的输出值 0:输出0(YM=高阻); 1: 输出1(YM=GND) YP_SEN---选择nYPON的输出值 0:输出0(YP=外部电压); 1:输出1(YP连接AIN[5]) XM_SEN---选择XMON的输出值 0:输出0( XM=高阻); 1: 输出1(XM=GND) XP_SEN---选择nXP的输出值 0:输出0(XP=外部电压); 1:输出1(XP连接AIN[7])
0:普通A/D转换; 1:连续X/Y轴转换模式 00:无操作模式; 01:对X坐标测量; 8 7 6 5 4 3 2 1 保留0 YM_SEN YP_SEN XM_SEN XP_SEN PULL_UP AUTO_PST XY_PST PULL---上拉切换使能 0:XP上拉使能; 1: XP上拉禁止 AUTO_PST---自动连续转换X轴和Y轴坐标模式选择 0:普通A/D转换; 1:连续X/Y轴转换模式 XY_PST---手动测量X轴和Y轴坐标模式选择 00:无操作模式; 01:对X坐标测量; 10:对X坐标测量; 11:等待中断模式
3、ADCDLY---ADC起始延迟寄存器 31 …… 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 保留为0 起始延迟数值---分两种情况 第一情况: 对普通转换模式、分离的X/Y轴坐标转换模式、连续的X/Y轴坐标转换模式,为转换延时数值。 第二种情况: 对中断转换模式,为按压触摸屏后到产生中断请求的延迟时间数值,其时间单位为ms。
4、ADCDAT0---ADC转换数据0寄存器 第11次到此 15 14 13 12 11 10 9 …… 0 UPDOWN AUTO_PST XY_PST 保留(0) XPDATA或普通ADC值 UPDOWN---等待中断模式的按压状态 0:触笔点击; 1:触笔提起 AUTO_PST---自动X/Y轴转换模式指示 0:普通转换模式; 1:X/Y轴坐标连续转换 XY_PST---手动X/Y轴转换模式指示 00:无操作; 01:为X轴坐标转换 10:为Y轴坐标转换 11:为等待中断转换 XPDATA[9:0]:为X轴坐标转换数值、或普通ADC转换数值 具体意义由其它位指示。其值为:0---0x3FF
5、ADCDAT1---ADC转换数据1寄存器 15 14 13 12 11 10 9 …… 0 UPDOWN AUTO_PST XY_PST 保留(0) YPDATA UPDOWN---等待中断模式的按压状态 0:触笔点击; 1:触笔提起 AUTO_PST---自动X/Y轴转换模式指示 0:普通转换模式; 1:X/Y轴坐标连续转换 XY_PST---手动X/Y轴转换模式指示 00:无操作; 01:为X轴坐标转换 11:为Y轴坐标转换 11:为等待中断转换 YPDATA[9:0]:为10位Y轴坐标转换结果 其值为:0---0x3FF
例题:编写程序,对3通道的模拟量连续做10次转换,用查询方式读取转换结果,其数据存于0x400000开始的区域。 AREA ADC,CODE,READONLY ENTRY START
#define rADCCON (*(volatile unsigned *)0x58000000) #define rADCDAT0 (*(volatile unsigned *)0x5800000c) #define pref 49 #define ch 3 void adc(void) { int adc_data[10], i; rADCCON=(1<<14)|(pref<<6)|(ch<<3)|1 //允许预分频 for(i=0;i<10;i++) { while(rADCCON&0x8000==0); //查询转换结束否 adc_data[i]=rADCDAT0&0x3ff; //读取转换结果 rADCCON|=1; //再次启动转换 }
4.5 中断 主要内容 概述 结构与工作原理 寄存器 应用举例
一、概 述 S3C2410X中断控制器有56个中断源,对外提供24个外中断输入引脚,内部所有设备都有中断请求信号,例如DMA控制器、UART、IIC等等。 S3C2410X的ARM920T内核有两个中断,IRQ中断和快速中断FIQ。 中断仲裁:当中断控制器接收到多个中断请求时,其内的优先级仲裁器裁决后向CPU发出优先级最高的中断请求信号或快速中断请求信号。
二、S3C2410X中断系统结构 1、中断系统结构 主要由中断源和控制寄存器两大部分构成,其寄存器主要有4种:模式、屏蔽、优先级、挂起(标志)寄存器等。 中断源 (有子寄存器) 子中断源 挂起寄存器 (无子寄存器) 屏蔽寄存器 中断屏蔽 中断模式 优先级仲裁 FIQ IRQ 中断源挂起 中 断 挂 起
2、中断优先级仲裁器及工作原理 中断系统有6个分仲裁器和1个总仲裁器,每一个仲裁器可以处理6路中断。
三、中断控制器专用寄存器 有8个专用寄存器 Register Address R/W Description Reset Value SRCPND 0x4A000000 中断标志寄存器 0x00000000 INTMOD 0x4A000004 中断模式寄存器 INTMSK 0x4A000008 中断屏蔽寄存器 0xFFFFFFFF PRIORITY 0x4A00000C 中断优先级寄存器 0x7F INTPND 0x4A000010 中断服务寄存器 INTOFFSET 0x4A000014 R 中断偏移寄存器 SUBSRCPND 0x4A000018 子源挂起寄存器 INTSUBMSK 0x4A00001C 中断子源屏蔽寄存器 0x7FF 主要使用前5个寄存器
1、SRCPND---中断源挂起(标志)寄存器 位号 中断源 31 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT 30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留 29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23 28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7 27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3 26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2 25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1 24 16 INT_LCD 8 INT_TICK EINT0 该寄存器也就是中断标志寄存器 各位: 1:对应中断源有中断请求 0:对应中断源无中断请求 注意:必须在中断处理程序中对其标志位清0。其方法为写1.
2、INTMOD---中断模式寄存器 位号 中断源 该寄存器是设置各中断源是FIQ中断还是IRQ中断 31 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT 30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留 29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23 28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7 27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3 26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2 25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1 24 16 INT_LCD 8 INT_TICK EINT0 该寄存器是设置各中断源是FIQ中断还是IRQ中断 各位: 1:对应中断源设为FIQ中断模式 0:对应中断源设为IRQ中断模式
3、INTMSK---中断屏蔽寄存器 位号 中断源 各位: 1:屏蔽对应中断源 0:开放对应中断源 31 23 15 7 30 22 14 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT 30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留 29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23 28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7 27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3 26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2 25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1 24 16 INT_LCD 8 INT_TICK EINT0 各位: 1:屏蔽对应中断源 0:开放对应中断源
4、PRIORITY---中断优先级寄存器 位号 含 义 31:21 保 留 12:11 ARB_SEL2 4 ARB_MODE4 20:19 ARB_SEL6 10:9 ARB_SEL1 3 ARB_MODE3 18:17 ARB_SEL5 8:7 ARB_SEL0 2 ARB_MODE2 16:15 ARB_SEL4 6 ARB_MODE6 1 ARB_MODE1 14:13 ARB_SEL3 5 ARB_MODE5 ARB_MODE0 ARB_SELn---n组优先级顺序控制位 00:REQ0, 1, 2, 3, 4, 5 01:REQ0, 2, 3, 4, 1, 5 10:REQ0, 3, 4, 1, 2, 5 11:REQ0, 4, 1, 2, 3, 5 ARB_MODEn---n组优先级循环控制位 0:优先顺序固定不变 1:优先顺序循环,每响应一次中断,其顺序循环改变一次,但REQ0、REQ5位置不变。
5、INTPND---中断服务(挂起)寄存器 位号 中断源 31 INT_ADC 23 INT_UART1 15 INT_UART2 7 nBATT_FLT 30 INT_RTC 22 INT_SPI0 14 INT_TIM4 6 保留 29 INT_SPI1 21 INT_SDI 13 INT_TIM3 5 EINT8_23 28 INT_UART0 20 INT_DMA3 12 INT_TIM2 4 EINT4_7 27 INT_IIC 19 INT_DMA2 11 INT_TIM1 3 EINT3 26 INT_USBH 18 INT_DMA1 10 INT_TIM0 2 EINT2 25 INT_USBD 17 INT_DMA0 9 INT_WDT 1 EINT1 24 16 INT_LCD 8 INT_TICK EINT0 各位: 1:对应的中断源被响应,且正在执行中断服务 0:对应中断源未被响应 注意:必须在中断处理程序中对其服务标志位清0。方法为对某位写1便清除为0。 即在清除SRCPND中相应位后,要清除该寄存器相应位。
6、INTOFFSET---中断偏移寄存器 中断源 偏移 值 INT_ADC 31 INT_UART1 23 INT_UART2 15 nBATT_FLT 7 INT_RTC 30 INT_SPI0 22 INT_TIM4 14 保留 6 INT_SPI1 29 INT_SDI 21 INT_TIM3 13 EINT8_23 5 INT_UART0 28 INT_DMA3 20 INT_TIM2 12 EINT4_7 4 INT_IIC 27 INT_DMA2 19 INT_TIM1 11 EINT3 3 INT_USBH 26 INT_DMA1 18 INT_TIM0 10 EINT2 2 INT_USBD 25 INT_DMA0 17 INT_WDT 9 EINT1 1 24 INT_LCD 16 INT_TICK 8 EINT0 该寄存器的偏移值指示在INTPND中显示的中断源 各位: 1:对应的中断源,在INTPND中被置位 说明:当在中断服务程序中对SRCPND、INTPND中的标志位清0时,该寄存器的对应位自动清0。
7、SUBSRCPND---子中断源请求标志寄存器 位号 中断源 31:11 保 留 7 INT_TXD2 3 INT_RXD1 10 INT_ADC 6 INT_RXD2 2 INT_ERR0 9 INT_TC 5 INT_ERR1 1 INT_TXD0 8 INT_ERR2 4 INT_TXD1 INT_RXD0 对有多个中断源的外设,显示其具体的中断请求 各位: 1:对应的子中断源有请求 0:对应的子中断源无请求 注意:在中断服务程序中,需要对其置1的标志位清0。
8、INTSUBMSK---子中断源屏蔽寄存器 位号 中断源 31:11 保 留 7 INT_TXD2 3 INT_RXD1 10 INT_ADC 6 INT_RXD2 2 INT_ERR0 9 INT_TC 5 INT_ERR1 1 INT_TXD0 8 INT_ERR2 4 INT_TXD1 INT_RXD0 对有多个中断源的外设,对具体的中断源进行屏蔽 各位: 1:屏蔽对应的子中断源 0:开放对应的子中断源
本段意义:利用后面定义的宏来展开上面各行,使其进入它们所对应的中断服务子程序。 中断举例 第12次到此 在2410init.s文件中与的中断初始化部分 程序开始及中断入口 b ResetHandler b HandlerUndef ;handler for Undefined mode b HandlerSWI ;handler for SWI interrupt b HandlerPabort ;handler for PAbort b HandlerDabort ;handler for DAbort b . ;reserved b HandlerIRQ ;handler for IRQ interrupt b HandlerFIQ ;handler for FIQ interrupt 本段意义:利用后面定义的宏来展开上面各行,使其进入它们所对应的中断服务子程序。
LTORG ;声明一个数据缓冲池的开始 HandlerFIQ HANDLER HandleFIQ HandlerIRQ HANDLER HandleIRQ HandlerUndef HANDLER HandleUndef HandlerSWI HANDLER HandleSWI HandlerDabort HANDLER HandleDabort HandlerPabort HANDLER HandlePabort 本段意义:利用后面定义的宏来展开上面各行,使其进入它们所对应的中断服务子程序
MACRO ;本宏意义:转到相应中断服务子程序去执行 $HandlerLabel HANDLER $HandleLabel ;如Label=IRQ , ( HandlerIRQ ) $HandlerLabel sub sp,sp,#4 stmfd sp!,{r0} ldr r0,=$HandleLabel ldr r0,[r0] str r0,[sp,#4] ldmfd sp!,{r0,pc} MEND
IRQ中断服务程序 IsrIRQ sub sp,sp,#4 ;reserved for PC stmfd sp!,{r8-r9} ldr r9,=INTOFFSET ;中断偏移寄存器 ldr r9,[r9] ldr r8,=HandleEINT0 ;中断向量表首地址 add r8,r8,r9,lsl #2 ldr r8,[r8] str r8,[sp,#8] ldmfd sp!,{r8-r9,pc} 本段意义:根据中断服务号,转去执行相应的中断处理程序段。
;中断向量表IntVectorTable HandleEINT0 # 4 HandleEINT1 # 4 HandleEINT2 # 4 HandleEINT3 # 4 HandleEINT4_7 # 4 HandleEINT8_23 # 4 HandleRSV6 # 4 HandleBATFLT # 4 HandleTICK # 4 HandleWDT # 4 HandleTIMER0 # 4 HandleTIMER1 # 4 ……
4.6 输入/输出端口 主要内容 概述 寄存器 应用举例
一、概述 S3C2410X有117个输入/输出端口。这些端口是: A口(GPA):23个输出口 B口(GPB):11个输入/输出口 C口(GPC):16个输入/输出口 D口(GPD):16个输入/输出口 E口(GPE):16个输入/输出口 F口(GPF):8个输入/输出口 G口(GPG):16个输入/输出口 H口(GPH):11个输入/输出口 这些端口都具有多功能,通过引脚配置寄存器,可以将其设置为所需要的功能,如:I/O功能、中断功能等等。
每一个端口都有4个寄存器,它们是:引脚配置寄存器、数据寄存器、引脚上拉寄存器等。 二、端口寄存器及引脚配置 每一个端口都有4个寄存器,它们是:引脚配置寄存器、数据寄存器、引脚上拉寄存器等。 Register Address R/W Description Reset Value GPXCON 0x560000x0 端口X配置寄存器 X GPXDAT 0x560000x4 端口X数据寄存器 GPXUP 0x560000x8 端口X上拉寄存器 RESERVED 0x560000xC 端口X保留寄存器 -
1、端口A寄存器及引脚配置 Register Address R/W Description Reset Value GPACON 0x56000000 端口A引脚配置寄存器 0x7FFFFF GPADAT 0x56000004 端口A数据寄存器 - RESERVED 0x56000008 端口A保留寄存器 0x5600000C GPADAT寄存器为准备输出的数据 其值为23位[22:0] 注意: (1)当A口引脚配置为非输出功能时,其输出无意义; (2)从引脚输入没有意义。
1、端口A寄存器及引脚配置 位号 位 名 位值:0 1 22 输出 10 21 9 20 8 19 7 18 6 17 5 16 4 15 位 名 位值:0 1 22 GPA22 输出 nFCE 10 GPA10 ADDR25 21 GPA21 nRSTOUT 9 GPA9 ADDR24 20 GPA20 nFRE 8 GPA8 ADDR23 19 GPA19 nFWE 7 GPA7 ADDR22 18 GPA18 ALE 6 GPA6 ADDR21 17 GPA17 CLE 5 GPA5 ADDR20 16 GPA16 nGCS5 4 GPA4 ADDR19 15 GPA15 nGCS4 3 GPA3 ADDR18 14 GPA14 nGCS3 2 GPA2 ADDR17 13 GPA13 nGCS2 1 GPA1 ADDR16 12 GPA12 nGCS1 GPA0 ADDR0 11 GPA11 ADDR26 FCE: Flash片选
2、端口B寄存器及引脚配置 Register Address R/W Description Reset Value GPBCON 0x56000010 端口B引脚配置寄存器 0x0 GPBDAT 0x56000014 端口B数据寄存器 - GPBUP 0x56000018 端口B上拉寄存器 RESERVED 0x5600001C 端口B保留寄存器 GPBDAT---为准备输出或输入的数据 其值为11位[10:0] GPBUP---端口B上拉寄存器,位[10:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 注意: 当B口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口B引脚配置寄存器 位号 位 名 位值:00 01 10 11 21,20 输入 输出 nXDREQ0 19,18 nXDACK0 位 名 位值:00 01 10 11 21,20 GPB10 输入 输出 nXDREQ0 Reserved 19,18 GPB9 nXDACK0 17,16 GPB8 nXDREQ1 15,14 GPB7 nXDACK1 13,12 GPB6 nXBACK 11,10 GPB5 nXBREQ 9,8 GPB4 TCLK0 7,6 GPB3 TOUT3 5,4 GPB2 TOUT2 3,2 GPB1 TOUT1 1,0 GPB0 TOUT0
3、端口C寄存器及引脚配置 Register Address R/W Description Reset Value GPCCON 0x56000020 端口C引脚配置寄存器 0x0 GPCDAT 0x56000024 端口C数据寄存器 - GPCUP 0x56000028 端口C上拉寄存器 RESERVED 0x5600002C 端口C保留寄存器 GPCDAT---为准备输出或输入的数据 其值为16位[15:0] GPCUP---端口C上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 注意: 当C口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口C引脚配置寄存器 位号 位 名 位 值 位名 00 01 10 11 31,30 GPC15 输入 输出 VD7 保留 15,14 位 值 位名 00 01 10 11 31,30 GPC15 输入 输出 VD7 保留 15,14 GPC7 LCDVF2 29,28 GPC14 VD6 13,12 GPC6 LCDVF1 27,26 GPC13 VD5 11,10 GPC5 LCDVF0 25,24 GPC12 VD4 9,8 GPC4 VM 23,22 GPC11 VD3 7,6 GPC3 VFRAME 21,20 GPC10 VD2 5,4 GPC2 VLINE 19,18 GPC9 VD1 3,2 GPC1 VCLK 17,16 GPC8 VD0 1,0 GPC0 VEND
4、端口D寄存器及引脚配置 Register Address R/W Description Reset Value GPDCON 0x56000030 端口D引脚配置寄存器 0x0 GPDDAT 0x56000034 端口D数据寄存器 - GPDUP 0x56000038 端口D上拉寄存器 0xF000 RESERVED 0x5600003C 端口D保留寄存器 GPDDAT---为准备输出或输入的数据 其值为16位[15:0] GPDUP---端口D上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,[15:12]无上拉功能,而[11:0]有上拉 注意: 当D口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口D引脚配置寄存器 位号 位 名 位 值 位名 00 01 10 11 31,30 GPD15 输入 输出 VD23 nSS0 15,14 位 值 位名 00 01 10 11 31,30 GPD15 输入 输出 VD23 nSS0 15,14 GPD7 VD15 保留 29,28 GPD14 VD22 nSS1 13,12 GPD6 VD14 27,26 GPD13 VD21 11,10 GPD5 VD13 25,24 GPD12 VD20 9,8 GPD4 VD12 23,22 GPD11 VD19 7,6 GPD3 VD11 21,20 GPD10 VD18 5,4 GPD2 VD10 19,18 GPD9 VD17 3,2 GPD1 VD9 17,16 GPD8 VD16 1,0 GPD0 VD8
5、端口E寄存器及引脚配置 Register Address R/W Description Reset Value GPECON 0x56000040 端口E引脚配置寄存器 0x0 GPEDAT 0x56000044 端口E数据寄存器 - GPEUP 0x56000048 端口E上拉寄存器 RESERVED 0x5600004C 端口E保留寄存器 GPEDAT---为准备输出或输入的数据 其值为16位[15:0] GPEUP---端口E上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,各个引脚都有上拉功能。 注意: 当E口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口E引脚配置寄存器 位号 位 名 位 值 位名 00 01 10 11 31,30 GPE15 输入 输出 IICSDA 保留 15,14 位 值 位名 00 01 10 11 31,30 GPE15 输入 输出 IICSDA 保留 15,14 GPE7 SDDAT0 29,28 GPE14 IICSCL 13,12 GPE6 SDCMD 27,26 GPE13 SPICLK0 11,10 GPE5 SDCLK 25,24 GPE12 SPISI0 9,8 GPE4 IISSDO 23,22 GPE11 SPISO0 7,6 GPE3 IISSDI 21,20 GPE10 SDDAT3 5,4 GPE2 CDCLK 19,18 GPE9 SDDAT2 3,2 GPE1 IISSCLK 17,16 GPE8 SDDAT1 1,0 GPE0 IISLRCK
6、端口F寄存器及引脚配置 Register Address R/W Description Reset Value GPFCON 0x56000050 端口F引脚配置寄存器 0x0 GPFDAT 0x56000054 端口F数据寄存器 - GPFUP 0x56000058 端口F上拉寄存器 RESERVED 0x5600005C 端口F保留寄存器 GPFDAT---为准备输出或输入的数据 其值为8位[7:0] GPFUP---端口F上拉寄存器,位[7:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,各个引脚都有上拉功能。 注意: 当F口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口F引脚配置寄存器 位号 位 名 位 值 00 01 10 11 15,14 GPF7 输入 输出 EINT7 保留 13,12 GPF6 位 值 00 01 10 11 15,14 GPF7 输入 输出 EINT7 保留 13,12 GPF6 EINT6 11,10 GPF5 EINT5 9,8 GPF4 EINT4 7,6 GPF3 EINT3 5,4 GPF2 EINT2 3,2 GPF1 EINT1 1,0 GPF0 EINT0
7、端口G寄存器及引脚配置 Register Address R/W Description Reset Value GPGCON 0x56000060 端口G引脚配置寄存器 0x0 GPGDAT 0x56000064 端口G数据寄存器 - GPGUP 0x56000068 端口G上拉寄存器 0xF800 RESERVED 0x5600006C 端口G保留寄存器 GPGDAT---为准备输出或输入的数据 其值为16位[15:0] GPGUP---端口G上拉寄存器,位[15:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 初始化时,[15:11]引脚无上拉功能,其它引脚有。 注意: 当G口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口G引脚配置寄存器 LCD-PEN:POWER_ENABLE nSS0:SPI0_SELECT 位号 位 名 位 值 位名 00 01 位 值 位名 00 01 10 11 31,30 GPG15 输入 输出 EINT23 nYPON 15,14 GPG7 EINT15 SPICLK1 29,28 GPG14 EINT22 YMON 13,12 GPG6 EINT14 SPISI1 27,26 GPG13 EINT21 nXPON 11,10 GPG5 EINT13 SPISO1 25,24 GPG12 EINT20 XMON 9,8 GPG4 EINT12 LCD-PEN 23,22 GPG11 EINT19 TCLK1 7,6 GPG3 EINT11 nSS1 21,20 GPG10 EINT18 保留 5,4 GPG2 EINT10 nSS0 19,18 GPG9 EINT17 3,2 GPG1 EINT9 17,16 GPG8 EINT16 1,0 GPG0 EINT8 LCD-PEN:POWER_ENABLE nSS0:SPI0_SELECT
8、端口H寄存器及引脚配置 Register Address R/W Description Reset Value GPHCON 0x56000070 端口H引脚配置寄存器 0x0 GPHDAT 0x56000074 端口H数据寄存器 - GPHUP 0x56000078 端口H上拉寄存器 RESERVED 0x5600007C 端口H保留寄存器 GPHDAT---为准备输出或输入的数据 其值为11位[10:0] GPHUP---端口H上拉寄存器,位[10:0]有意义。 0:对应引脚设置为上拉 1:无上拉功能 注意: 当H口引脚配置为非输入/输出功能时,其寄存器中的值没有意义。
端口H引脚配置寄存器 位号 位 名 位值:00 01 10 11 UCLK为USB的 21,20 GPH10 输入 输出 CLKOUT1 位 名 位值:00 01 10 11 21,20 GPH10 输入 输出 CLKOUT1 Reserved 19,18 GPH9 CLKOUT0 17,16 GPH8 UCLK 15,14 GPH7 RXD2 nCTS1 13,12 GPH6 TXD2 nRTS1 11,10 GPH5 RXD1 9,8 GPH4 TXD1 7,6 GPH3 RXD0 5,4 GPH2 TXD0 3,2 GPH1 nRTS0 1,0 GPH0 nCTS0 UCLK为USB的
9、端口其它控制寄存器 Register Address R/W Description Reset Value MISCCR 0x56000080 混合控制寄存器 0x10330 DCLKCON 0x56000084 D时钟控制寄存器 0x0
(1)MISCCR---混合控制寄存器 31 …… 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 保留(为0) nEN_SCKE nEN_SCLK1 nEN_SCLK0 nRSTCON 15 14 13 12 11 10 9 8 7 保留 USBSUSPND1 USBSUSPND0 CLKSEL1 6 5 4 3 2 1 CLKSEL0 USBPAD MEM_HZ_CON SPUCR_L SPUCR_H nEN_SCKE---SCLK使能位。在电源关闭模式下对SDRAM做保护 0: 正常状态 1:低电平 nEN_SCLKx---SCLKx使能位。在电源关闭模式下对SDRAM做保护 0:SCLKx= SCLK 1:低电平 nRSTCON---对nRSTOUT软件复位控制位 0:使nRSTOUT为低,0;1:使nRSTOUT为高,1
CLKSEL1 --- CLKOUT1引脚输出信号源选择 000:MPLL CLK 001:UPLL CLK 15 14 13 12 11 10 9 8 7 保留 USBSUSPND1 USBSUSPND0 CLKSEL1 USBSUSPND1---USB端口1模式 0:正常 1:浮空 USBSUSPND0---USB端口0模式 CLKSEL1 --- CLKOUT1引脚输出信号源选择 000:MPLL CLK 001:UPLL CLK 010:FCLK 011:HCLK 100:PCLK 101:DCLK1 11x:保留 CLKSEL0 --- CLKOUT0引脚输出信号源选择 010:FCLK 011:HCLK 100:PCLK 101:DCLK0 11x:保留
MEM_HZ_CON---MEM高阻控制位 0:Hi-Z 1:前一状态 SPUCR_L---数据口低16位[15:0]上拉控制位 4 3 2 1 CLKSEL0 USBPAD MEM_HZ_CON SPUCR_L SPUCR_H USBPAD---与USB连接选择 0:与USB设备连接 1:与USB主机连接 MEM_HZ_CON---MEM高阻控制位 0:Hi-Z 1:前一状态 SPUCR_L---数据口低16位[15:0]上拉控制位 0:上拉 1:无上拉 SPUCR_H---数据口高16位[31:16]上拉控制位
(2)DCLKCON---D时钟控制寄存器 31 … 28 27 26 25 24 23 22 21 20 19 18 17 16 保留 DCLK1CMP DCLK1DIV DCLK1SEL DCLK1EN 15 … 12 11 10 9 8 7 6 5 4 3 2 1 保留 DCLK0CMP DCLK0DIV DCLK0SelCK DCLK0EN DCLK1(0)CMP---DCLK1(0)低电平时间所占的比例数。 设该位值为m,m< DCLK1(0)DIV。 则低、高电平持续时间的源周期数分别为: m+1、DCLK1(0)DIV-m DCLK1(0)DIV---DCLK1(0)分频值 DCLK1(0) frequency = source clock / ( DCLK1(0)DIV + 1 )
(2)DCLKCON---D时钟控制寄存器(续) 31 … 28 27 26 25 24 23 22 21 20 19 18 17 16 保留 DCLK1CMP DCLK1DIV DCLK1SEL DCLK1EN 15 … 12 11 10 9 8 7 6 5 4 3 2 1 保留 DCLK0CMP DCLK0DIV DCLK0SelCK DCLK0EN DCLK1(0)SelCK---DCLK1(0) source clock 选择 0 : 源时钟选择PCLK 1:源时钟选择UCLK ( USB ) DCLK1(0)EN---DCLK1(0) Enable 0:禁止 1:允许
10、外中断控制寄存器 Register Address R/W Description Reset Value EXTINT0 0x56000088 外中断触发方式寄存器0 0x0 EXTINT1 0x5600008C 外中断触发方式寄存器1 EXTINT2 0x56000090 外中断控制寄存器2 主要设置各个外中断源的触发方式、滤波
(1)EXTINT0---外中断触发方式控制寄存器0 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 X EINT7 EINT6 EINT5 EINT4 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 X EINT3 EINT2 EINT1 EINT0 EINT0~7---中断请求信号触发方式选择 000:低电平触发 001:高电平触发 01x:下降沿触发 10x:上升沿触发 11x:双边沿触发 第3、7、11、15、19、23、27、31位---保留
(2)EXTINT1---外中断触发方式控制寄存器1 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 X EINT15 EINT14 EINT13 EINT12 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 X EINT11 EINT10 EINT9 EINT8 EINT8~15---中断请求信号触发方式选择 000:低电平触发 001:高电平触发 01x:下降沿触发 10x:上升沿触发 11x:双边沿触发 第3、7、11、15、19、23、27、31位---保留
(3)EXTINT2---外中断控制寄存器2 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 F23 EINT23 F22 EINT22 F21 EINT21 F20 EINT20 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 F19 EINT19 F18 EINT18 F17 EINT17 F16 EINT16 EINT16~23---外中断请求信号触发方式选择 000:低电平触发 001:高电平触发 01x:下降沿触发 10x:上升沿触发 11x:双边沿触发 第3、7、11、15、19、23、27、31位---为FILTEN 各引脚滤波控制位 0:禁止滤波 1:使能滤波
11、外中断滤波控制寄存器 Register Address R/W Description Reset Value EINTFLT0 0x56000094 保留 - EINTFLT1 0x56000098 EINTFLT2 0x5600009C 外中断滤波控制寄存器2 0x0 EINTFLT3 0x560000A0 外中断滤波控制寄存器3 主要设置各个外中断源的滤波器设置
(1)EINTFLT2---外中断滤波控制寄存器2 31 30 …… 24 23 22 16 FLTCLK19 EINTFLT19 FLTCLK18 EINTFLT18 15 14 …… 8 7 6 FLTCLK17 EINTFLT17 FLTCLK16 EINTFLT16 FLTCLK16~19---外中断16~19滤波器时钟选择 0:PCLK 1:外部/振荡时钟(由OM引脚选择) EINTFLT16~19---外中断16~19滤波器宽度(频带宽度)
(2)EINTFLT3---外中断滤波控制寄存器3 31 30 …… 24 23 22 16 FLTCLK23 EINTFLT23 FLTCLK22 EINTFLT22 15 14 …… 8 7 6 FLTCLK21 EINTFLT21 FLTCLK20 EINTFLT20 FLTCLK20~23---外中断20~23滤波器时钟选择 0:PCLK 1:外部/振荡时钟(由OM引脚选择) EINTFLT20~23---外中断20~23滤波器宽度(频带宽度)
12、外中断屏蔽、标志寄存器 Register Address R/W Description Reset Value EINTMAK 0x560000A4 外中断屏蔽寄存器 0x00FFFFF0 EINTPEND 0x560000A8 外中断标志寄存器 0x0
外中断屏蔽寄存器 位号 含 义 23 EINT23 15 EINT15 7 EINT7 22 EINT22 14 EINT14 6 21 EINT21 13 EINT13 5 EINT5 20 EINT20 12 EINT12 4 EINT4 19 EINT19 11 EINT11 3 保留 18 EINT18 10 EINT10 2 17 EINT17 9 EINT9 1 16 EINT16 8 EINT8 各位: 0:允许中断 1:禁止中断 注意: EINT0--- EINT3不能在此被屏蔽,在SRCPND中屏蔽。
外中断标志寄存器 位号 含 义 23 EINT23 15 EINT15 7 EINT7 22 EINT22 14 EINT14 6 21 EINT21 13 EINT13 5 EINT5 20 EINT20 12 EINT12 4 EINT4 19 EINT19 11 EINT11 3 保留 18 EINT18 10 EINT10 2 17 EINT17 9 EINT9 1 16 EINT16 8 EINT8 各位: 0:无中断请求 1:有中断请求 注意:对某位写1,则清除相应标志,即清为0.
13、外中断状态寄存器 Register Address R/W Description Reset Value GSTATUS3、4: 0x560000AC R 外部引脚状态寄存器 不确定 GSTATUS1 0x560000B0 芯片ID(标识)寄存器 0x32410000 GSTATUS2 0x560000B4 复位状态寄存器 0x1 GSTATUS3 0x560000B8 信息保存寄存器 0x0 GSTATUS4 0x560000C0 GSTATUS3、4: 复位时被清0,其它情况下其数据不变。 用户可以用于保存数据。
(1)GSTATUS0---外部引脚状态寄存器 31 …… 4 3 2 1 保 留 nWEIT nCON RnB nBATT_FLT nWEIT---引脚nWEIT状态 nCON---引脚nCON状态 RnB---引脚R/nB状态 nBATT_FLT---引脚nBATT_FLT状态 注意:各位的数值0、1,随着对应引脚变化。
(2)GSTATUS2---复位状态寄存器 31 …… 3 2 1 保 留 WDTRST OFFRST PWRST 保 留 WDTRST OFFRST PWRST WDTRST---上电复位控制状态 1:出现了上电复位 对该位写,则将该位清0 OFFRST---掉电模式复位状态。 1:系统出现了从掉电模式唤醒复位 PWRST---看门狗复位状态 1:系统出现了看门狗定时器复位 第13讲到此
外中断举例 static void __irq Eint0Int(void) { ClearPending(BIT_EINT0); Uart_Printf("EINT0 interrupt is occurred.\n"); } static void __irq Eint1Int(void) ClearPending(BIT_EINT1); Uart_Printf("EINT1 interrupt is occurred.\n"); #define ClearPending(bit) {\rSRCPND = bit;\ rINTPND = bit;\ rINTPND;\ }
void Test_Eint(void) { int i; int extintMode; //选择外中断触发方式变量 Uart_Printf("[External Interrupt Test]\n"); Uart_Printf("1.L-LEVEL 2.H-LEVEL 3.F-EDGE 4.R-EDGE 5.B-EDGE\n"); Uart_Printf("Select the external interrupt type.\n"); extintMode=Uart_Getch(); //extintMode='3'; rGPFCON = (rGPFCON & 0xfffa)|(1<<3)|(1<<1); // 设置引脚配置,F0、F1配置为EINT0/1
switch(extintMode) { case '1': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x0<<4 | 0x0<<0; //EINT0/1=low level triggered break; case '2': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x1<<4 | 0x1<<0; //EINT0/1=high level triggered case '3': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x2<<4 | 0x2<<0; //EINT0/1=falling edge triggered
case '4': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x4<<4 | 0x4<<0; //EINT0/1=rising edge triggered break; case '5': rEXTINT0 = (rEXTINT0 & ~((7<<4) | (0x7<<0))) | 0x6<<4 | 0x6<<0; //EINT0/1=both edge triggered default: break; }
Uart_Printf(“Press the EINT0/1 buttons or Press any key to exit. \n”); pISR_EINT0=(U32)Eint0Int; //将中断处理程序的开始 pISR_EINT1=(U32)Eint1Int;; //地址送到中断向量表 rEINTPEND = 0xffffff; //清除EINTPND需要向其中写入数 据。因此这句代码的含义是清除EINTPND。 rSRCPND = BIT_EINT0|BIT_EINT1; //to clear the previous pending states rINTPND = BIT_EINT0|BIT_EINT1; rINTMSK=~(BIT_EINT0|BIT_EINT1); Uart_Getch(); rEINTMASK=0xffffff; rINTMSK=BIT_ALLMSK; } ( void Test_Eint(void)函数结束) 注释:#define BIT_ALLMSK (0xffffffff)
4.7 定时器 主要内容 概述 结构 寄存器 应用举例
一、概 述 1、S3C2410X定时器的主要特性 5个16位定时器; 2个8位预分频器和2个4位分频器; 可编程PWM输出占空比; 具有初值自动重装连续输出模式和单脉冲输出模式; 具有死区生成器。 S3C2410有5个16位的定时器,定时器0-3具有PWM(脉宽调制)功能。定时器4是一个内部定时器,没有输出引脚,供内部使用。定时器0有死区产生器,通常用于大电流设备控制。 有2个8位预分频器和2个4位分频器。定时器0 和定时器1 分享同一个8 位的预分频器和分频器,定时器2、3、4 分享另一个预分频器和分频器,分频器有1/2、1/4、1/8、1/16这4种分频值。定时器从分频器接收自己的时钟信号,时钟分频器从相应的预分频器接收时钟信号。
2、 PWM(脉宽调制)概念 PWM(脉宽调制):就是只对一方波序列信号的占空比按照要求进行调制,而不改变方波信号的其它参数,即不改变幅度和周期,因此脉宽调制信号的产生和传输,都是数字式的。 用脉宽调制技术可以实现模拟信号:如果调制信号的频率远远大于信号接受者的分辨率,则接收者获得的是信号的平均效果,不能感知数字信号的0和1,其信号大小的平均值与信号的占空比有关,信号的占空比越大,平均信号越强,其平均值与占空比成正比。只要带宽足够(频率足够高或周期足够短),任何模拟信号都可以使用PWM 来实现。 PWM技术的应用:借助于微处理器,使用脉宽调制方法实现模拟信号是一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
二、结构与工作原理 1、定时器结构 (1)时钟控制:系统为每个定时器设置有: 预分频器、分频器。 (2)定时器组成(5部分): 减法计数器、初值寄存器、比较寄存器、观察寄存器、控制逻辑等部分构成。
定时器结构图 预分频器 8位 分频器 1/2 1/4 1/8 1/16 TCLK0/1 计数器 观 察 寄 存 器 比较寄存器 PCLK 五 选 一 开 关 初 值 控 制 逻 辑 TOUT 中断
2、工作原理 (1)定时器工作过程 装入初值、启动计数,计数结束产生中断请求,并且可以重装初值连续计数。如下图所示。
(2)初值自动重装、手动装载和双缓冲 初值自动重装功能: 5个定时器都具有此功能。当计数器中值减到0后,若设置了自动重装功能,则在下一计数周期开始前将初值装入计数器重新计数。 初值手动装载功能:在启动计数前,必须使用手动装载功能将初值装入计数器,而初值自动重装仅是一次计数结束后重新装入初值。 双缓冲功能:如果定时器正在工作,此时写入新的数据到TCNTBn、或者到TCMPBn,该写入的数据不影响本次定时器的操作。当定时器到达0后下一次运行定时器时,新写入的TCNTBn、或者TCMPBn才生效。
TOUT的输出可以设置为反相输出,如下图所示。 (3)PWM输出 寄存器TCMPB的作用:当计数器TCNT中的值减到与TCMPB的值相同时,TOUT的输出值取反。改变TCMPB的值,便改变了输出方波的占空比。 TOUT的输出可以设置为反相输出,如下图所示。 正向输出 反相输出 周期开始
S3C2410的timer0具有死区发生器功能,可用于控制大功率设备。 (4)死区产生器 死区的概念:是一小段时间间隔,在这个时间间隔内,禁止两个开关同时处于开启状态。死区是在功率设备控制中常采用的一种技术,防止两个开关同时打开起反作用。 S3C2410的timer0具有死区发生器功能,可用于控制大功率设备。 死区发生器开启前后输出波形对比
(5)DMA请求模式 S3C2410中定时器的DMA功能:系统中的5个定时器都有DMA请求功能,但是在同一时刻只能设置一个使用DMA功能,通过设置其DMA模式位来实现。 DMA请求过程:定时器可以在任意时间产生DMA请求,并且保持DMA请求信号(nDMA_REQ)为低直到定时器收到ACK信号。当定时器收到ACK信号时,它使请求信号变得无效。 DMA请求与中断的关系:如果一个定时器被配置为DMA模式,该定时器不会产生中断请求了。其他的定时器会正常的产生中断。
1)定时器输入时钟频率f Tclk (即计数时钟频率) : f Tclk=[f pclk∕(Prescaler+1)] ×分频值 3、计数时钟和输出计算 1)定时器输入时钟频率f Tclk (即计数时钟频率) : f Tclk=[f pclk∕(Prescaler+1)] ×分频值 式中:Prescaler,预分频值,0---255;分频值为1/2、1/4、1/8、1/16。 2)PWM输出时钟频率 : PWM输出时钟频率= f Tclk ∕ TCNTBn 3)PWM输出信号占空比(即高电平持续时间所占信号周期的比例): PWM输出信号占空比 = TCMPBn∕ TCNTBn
设PCLK的频率为50MHz,经过预分频和分频器后,送给定时器的可能计数时钟频率由表4-7-1给出。 定时器最大、最小输出周期 设PCLK的频率为50MHz,经过预分频和分频器后,送给定时器的可能计数时钟频率由表4-7-1给出。 表4-7-1 定时器最大、最小输出周期 分频值 最小输出周期 (预分频器=0、 TCNTBn=1) 最大输出周期 (预分频器=255、 TCNTBn=65535) TCNTBn=255) 1/2 25.00MHz(0.04µs) 0.6710s 381Hz 97656 1/4 12.50MHz(0.08µs) 1.3421s 191Hz 48828 1/8 6.250MHz(0.16µs) 2.6843s 95Hz 24414 1/16 3.125MHz(0.32µs) 5.3686s 48Hz 12207
三、定时器专用寄存器 共有6种、17个寄存器 Register Address R/W Description Reset Value TCFG0 0x51000000 配置寄存器 0 0x00000000 TCFG1 0x51000004 配置寄存器 1 TCON 0x51000008 控制寄存器 TCNTBn 0x510000xx 计数初值寄存器(5个) 0x0000 TCMPBn 比较寄存器(4个) TCNTOn R 观察寄存器(5个) TCNTBn---Timern计数初值寄存器(计数缓冲寄存器),16位 TCMPBn---Timern比较寄存器(比较缓冲寄存器),16位 TCNTOn---Timern计数读出寄存器,16位
1、TCFG0---预分频器配置寄存器 31 …… 24 23 16 15 8 7 保留(为0) Dead zone length 保留(为0) Dead zone length Prescaler1 Prescaler0 Dead zone length---死区宽度设置位 其值N为: 0~255,以timer0的定时时间为单位 死区宽度为:(N+1)×timer0的定时时间 Prescaler1---timer2、3、4的预分频值 其值N为: 0~255 输出频率为:PCLK ÷(N+1) Prescaler0--- timer0、1的预分频值
2、TCFG1---DMA模式与分频选择寄存器 31 … 24 23 … 20 19…16 15…12 11…8 7 … 4 3 … 0 保留(为0) DMA mode MUX4 MUX3 MUX2 MUX1 MUX0 DMA mode---DMA通道选择设置位 0000:不使用DMA方式,所有通道都用中断方式 0001:选择timer0 0010:选择timer1 0011:选择timer2 0100:选择timer3 0101:选择timer4 011X:保留 MUX4~ MUX0---timer4~timer0分频值选择 0000:1/2 0001:1/4 0010:1/8 0011:1/16 01XX:选择外部TCLK0、1(对timer0、1是选TCLK0,对timer4、3、2是选TCLK1) 第14讲到此
3、TCON---定时器控制寄存器 31…23 22 21 20 19 18 17 16 15 14 13 保留 TL4 TUP4 TR4 TO3 TUP3 TR3 TL2 TO2 TUP2 12 11 10 9 8 7…5 4 3 2 1 TR2 TL1 TO1 TUP1 TR1 保留 DZE TL0 TO0 TUP0 TR0 TL4~TL0---计数初值自动重装控制位 0:单次计数 1:计数器值减到0时,自动重新装入初值连续计数。 TUP4~TUP0---计数初值手动装载控制位。 0:不操作 1:立即将TCNTBn中的计数初值装载到计数寄存器TCNTn中。 说明:如果没有执行手动装载初值,则计数器启动时无初值。
3、TCON---定时器控制寄存器(续) 31…23 22 21 20 19 18 17 16 15 14 13 保留 TL4 TUP4 TR4 TL3 TO3 TUP3 TR3 TL2 TO2 TUP2 12 11 10 9 8 7…5 4 3 2 1 TR2 TL1 TO1 TUP1 TR1 保留 DZE TL0 TO0 TUP0 TR0 TR4~TR0---TIMER4~TIMER0运行控制位 0:停止 1:启动对应的TIMER TO3~TO0--- TIMER4~TIMER0输出控制位 0:正相输出 1:反相输出 DZE---TIMER0死区操作控制位 0:禁止死区操作 1:使能死区操作
四、定时器的使用 1、定时器初始化方法 (1)写TCFG0,设置计数时钟的预分频值和Timer0死区宽度; (2)写TCFG1,选择各个定时器的分频值和DMA、中断服务; (3)对TCNTBn和TCMPBn分别写入计数初值和比较初值; (4)写TCON,设置计数初值自动重装、手动装载初值、设置反相输出; (5)再写TCON,清除手动装载初值位、设置正相输出、启动计数。 2、定时器停止运行方法 写TCON,禁止计数初值自动重装。(一般不使用运行控制位停止运行)
3、定时器操作例子 (1)按照前面初始化定时器;设置TCNTBn=160(50+110),TCMPBn=110;手动装入初值后,又重设TCNTBn=80, TCMPBn=40; (2)启动定时器,按第一个初值计数; (3)与第一个比较值相同,输出取反; (4)第一次计数结束,自动重装初值80、40; (5)在第一次中断处理程序又重设TCMPBn=60; (8)在第二次中断处理程序禁止自动重装初值,准备结束计数; (10)第三次计数结束,不再计数。 1 2 3 4 6 7 9 10 TOUTn 50 110 40 40 20 60 5 8
定时器应用举例 #define BIT_TIMER0 (0x1<<10) int variable0,variable1,variable2,variable3,variable4; void __irq Timer0Done(void) { rSRCPND = BIT_TIMER0; //Clear pending bit rINTPND = BIT_TIMER0; //Clear serve bit variable0++; } void __irq Timer1Done(void) { rSRCPND = BIT_TIMER1; //Clear pending bit rINTPND = BIT_TIMER1; variable1++; rINTPND; //Prevent an double interrupt pending
void Test_TimerInt(void) { variable0 = 0;variable1 = 0;variable2 = 0; #define pISR_TIMER0 (*(unsigned *)(_ISR_STARTADDRESS+0x48)) #define pISR_TIMER1 (*(unsigned *)(_ISR_STARTADDRESS+0x4c)) void Test_TimerInt(void) { variable0 = 0;variable1 = 0;variable2 = 0; variable3 = 0;variable4 = 0; rINTMSK = ~(BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0); //将各个中断向量写入中断向量表中 pISR_TIMER0 = (int)Timer0Done; pISR_TIMER1 = (int)Timer1Done; pISR_TIMER2 = (int)Timer2Done; pISR_TIMER3 = (int)Timer3Done; pISR_TIMER4 = (int)Timer4Done; Uart_Printf("\n[ Timer 0,1,2,3,4 Interrupt Test ]\n\n");
rTCFG0 = rTCFG0 & ~(0xffffff) | 0x000f0f; //死区宽度=0, //T1预分频=0x0f,T0预分频=0x0f rTCFG1 =rTCFG1 & ~(0xffffff) | 0x001233; //全部使用中断 //T4---T0分频值为:1/2,1/4,1/8,1/16,1/16 //设置T0---T4计数初值 rTCNTB0 = 0xffff; // (1/(50MHz/16/16)) * 0xffff (65535) = 0.334s rTCNTB1 = 0xffff; // (1/(50MHz/16/16)) * 0xffff (65535) = 0.334s rTCNTB2 = 0xffff; // (1/(50MHz/16/8 )) * 0xffff (65535) = 0.163s rTCNTB3 = 0xffff; // (1/(50MHz/16/4 )) * 0xffff (65535) = 0.078s rTCNTB4 = 0xffff; // (1/(50MHz/16/2 )) * 0xffff (65535) = 0.039s rTCON = rTCON & ~(0xffffff) | 0x6aaa0a; //Auto reload, //Inverter off, Manual update, Dead zone disable, Stop rTCON = rTCON & ~(0xffffff) | 0x599901; //Auto reload //(T0=One-shot),Inverter off,No operation,Dead zone disable,Start while(variable0 == 0);
Delay(1); //To compensate timer error(<1 tick period) if(variable4==8 && variable3==4 && variable2==2 && variable1==1 && variable0==1) Uart_Printf("Timer 0,1,2,3,4 Interrupt Test --> OK\n"); else Uart_Printf("Timer 0,1,2,3,4 Interrupt Test --> Fail.......\n");
rTCON = 0x0; //One-shot, Inverter off, No operation, Dead Uart_Printf("Press any key to exit Timer interrupt test\n"); while(!Uart_GetKey()); rTCON = 0x0; //One-shot, Inverter off, No operation, Dead zone disable, Stop Uart_Printf("Timers interrupt number is as below:\n"); Uart_Printf("Timer0 - %d ,Timer1 - %d ,Timer2 - %d , Timer3 - %d ,Timer4 - %d \n", variable0,variable1, variable2,variable3,variable4); rINTMSK |= (BIT_TIMER4 | BIT_TIMER3 | BIT_TIMER2 | BIT_TIMER1 | BIT_TIMER0); }
#define BIT_TIMER0 (0x1<<10)
4.8 UART通用异步串行接口 主要内容 概述 结构 寄存器 应用举例 重点: (1)控制寄存器、线路控制寄存器、发/收状态寄存器; (2)RTC应用
一、概 述 S3C2410 的UART(通用异步串行口)有三个独立的异步串行I/O 端口:UART0、UART1、UART2,每个串口都可以在中断和DMA 两种模式下进行收发。UART支持的最高波特率达230.4kbps。 每个UART 包含:波特率发生器、接收器、发送器和控制单元。波特率发生器以PCLK或UCLK为时钟源。发送器和接收器各包含1个16 字节的FIFO 寄存器和移位寄存器。 S3C2410 的3个UART都有遵从1.0规范的红外传输功能, UART0、UART1有完整的握手信号,可以连接MODEM。 当发送数据的时候,数据先写到FIFO 然后拷贝到发送移位寄存器,然后从数据输出端口(TxDn)依次被移位输出。被接收的数据也同样从接收端口(RxDn)移位输入到移位寄存器,然后拷贝到FIFO 中。
二、串行口结构和工作原理 1、串行口结构 主要有4部分构成:接收器、发送器、波特率发生器、控制逻辑等。
接收器/发送器的结构 Tx FIFO : Rx FIFO 错误状态寄存器 控制寄存器 波特率除数 寄存器 MODEM状态R MODEM控制R 发送移位寄存器 接收移位寄存器 线路控制寄存器 收发状态寄存器 FI FO 控 制 寄 存 器 状 态 发 送 缓 冲 接 收 : 中断/DMA请求 nRTS nCTS TxD RxD Tx FIFO Rx FIFO
2、工作原理 (1)串行口的操作 数据帧格式:可编程,包含1个开始位、5 到8 个数据位、1个可选的奇偶校验位、1个或2个停止位,通过线路控制器(ULCONn)来设置。 发送中止信号:迫使串口输出逻辑0 ,这种状态保持一个传输帧的时间长度。通常在一帧传输数据完整地传输完之后,再通过这个全0 状态将中止信号发送给对方。中止信号发送之后,传送数据连续放到FIFO 中(在不使用FIFO 模式下,将被放到输出保持寄存器)。 接收器具有错误检测功能:可以检测出溢出错误,奇偶校验错误,帧错误和中止状况,每种情况下都会将一个错误标志在接收状态寄存器置位。
UBRDIVn=(int)(CLK/( f B*16))- 1 (2)串行口的波特率发生器 每个UART 的波特率发生器为传输提供了串行移位时钟。波特率产生器的时钟源可以从S3C2410 的内部系统时钟PCLK或UCLK 中来选择。波特率数值决定于波特率除数寄存器(UBRDIVn)的值,波特率数与UBRDIVn 的关系为: UBRDIVn=(int)(CLK/( f B*16))- 1 其中CLK为所选择的时钟频率, f B为波特率。 f B= CLK/16/ ( UBRDIVn + 1 ) 例如,如果波特率为115200bps 且PCLK 或UCLK 为40MHz,则UBRDIVn 为: UBRDIVn =(int)(40000000)(115200*16)) - 1 = (int)(21.7) - 1 = 21- 1 = 20
t_true = (UBRDIVn + 1)×16×10 / PCLK (3)串行口波特率误差极限 在应用中,实际波特率往往与理想波特率有差别,其误差不能超过一定的范围,其极限为:UART传输10bit数据的时间误差应该小于1.87%(3/160)。 t_true = (UBRDIVn + 1)×16×10 / PCLK 实际的传输10bit所需时间 t_ideal = 10 / baud_rate 理想情况下传输10位需要的时间 UART error=( ( t_true – t_ideal ) / t_ideal )×100%
(4)串行口的自动流控制功能 UART0和UART1不仅有完整的握手信号,而且有自动流控制功能,在寄存器UMCONn中设置实现。自动流控制是利用信号nRTS、nCTS来实现的。在接收数据时,只要接收FIFO中有两个空字节就会使nRTS有效,使对方发送数据;在发送数据时,只要nCTS有效,就会发送数据。其实现过程如下图所示。 nRTS:请求对方发送 nCTS:清除请求发送 注意:这种自动流控制应用于对方也是UART设备,不能应用于MODEM设备。
(5)使用FIFO进行收发 主要是通过对FIFO状态寄存器UFSTATn的查询,确定进行收发。 使用FIFO进行发送: (1)选择发送模式(中断或者DMA模式) (2)查询对方是否有请求发送要求,由MODEM状态寄存器UMSTATn[0]给出,该位为1,则有请求,再查询FIFO状态寄存器UFSTATn的数据满状态位是否为1,如果不是1,可以向发送缓冲寄存器UTXHn写入发送的数据。上面二者有一个或者两个都不满足,则不发送数据。 使用FIFO进行接收(请求发送): (1)选择接收模式(中断或者DMA模式) (2)请求发送。先要查询FIFO状态寄存器UFSTATn的数据满状态位是否为1,如果不是1,则可以向对方发出“请求发送信号”,对MODEM控制寄存器MCONn中的请求发送信号产生位置1,使UARTn发出nRTS信号;如果UFSTATn的数据满状态位是1,则不能够请求发送数据。 第15讲到此
(6)不使用FIFO进行收发 主要是通过对收/发状态寄存器UTRSTATn的查询,确定进行收发。 数据发送: (1)选择发送模式(中断或者DMA模式) (2)查询对方是否有请求发送要求,由MODEM状态寄存器UMSTATn[0]给出,该位为1,则有请求,再查询发送/接收状态寄存器UTRSTATn[1]的“发送缓冲器空”状态位是否为1,如果是1,可以向发送缓冲寄存器UTXHn写入发送的数据。 数据接收(请求发送): (1)选择接收模式(中断或者DMA模式) (2)请求发送。先要查询发送/接收状态寄存器UTRSTATn[0]的接收缓冲器“数据就绪状态位”是否为1,如果是1,需要先读取数据,然后再请求对方发送数据,方法是对MODEM控制寄存器MCONn中的请求发送信号产生位置1,使UARTn发出nRTS信号。如果UFSTATn的数据满状态位是1,则不能够请求发送数据
每个UART都有3类、7种事件产生中断请求或者DMA请求。 7种中断请求事件是:溢出错误、奇偶校验错误、帧格式错误、传输中断信号、接收缓冲器数据就绪、发送缓冲器空、发送移位器空。 它们可以分成3类:错误中断请求、接收中断请求、发送中断请求。 接收中断: 非FIFO模式:当接收缓冲寄存器收到数据后,产生中断请求。 FIFO模式:Rx FIFO中数据的数目达到了触发中断的水平,或者超时(在三帧时间内未收到任何数据),均产生中断请求。 发送中断: 非FIFO模式:当发送缓冲器空时,产生中断请求。 FIFO模式:Tx FIFO中数据的数目达到了触发中断的水平。
一共有4种错误中断:溢出错误、奇偶检验错误、帧格式错误、传输中断信号错误。 非FIFO模式:只要有任何一个错误出现,就会产生中断请求。 FIFO模式:Rx FIFO中数据溢出,或者出现了帧格式错误、奇偶校验错误、传输中断信号错误,都会产生中断请求。 说明: (1)对于“奇偶校验错误、帧格式错误、传输中断信号错误”中断,在数据接收时就产生了,但是在数据接收产生时并非出现中断请求,而是在读出错误数据时才出现中断请求。 (2)如果设置的是DMA模式,而不是中断请求模式,对于以上所出现的中断请求,应该是DMA请求。 (3)传输中断信号定义:在超出一帧的时间内,全部输出低电平。
(8)循环检测模式 S3C2410X的每一个UART都提供有检测功能,它是一种数据循环流动的自发、自收方式,数据从发送缓冲器传送到TXD,数据不经过引脚输出,在内部将数据传到接收引脚RXD,再传输到接收缓冲器。
三、UART专用寄存器 3个UART,每个都有11个专用寄存器,共29个寄存器 Register Address R/W Description Reset Value ULCONn 0x5000x000 线路控制寄存器 0x00 UCONn 0x5000x004 控制寄存器 UFCONn 0x5000x008 FIFO控制寄存器 UMCONn 0x5000x00C MODEM控制寄存器* UTRSTATn 0x5000x010 R 发送/接收状态寄存器 0x6 UERSTATn 0x5000x014 Rx错误状态寄存器 0x0 UFSTATn 0x5000x018 FIFO状态寄存器 UMSTATn 0x5000x01C MODEM状态寄存器* UTXHn 0x5000x020/23 W 发送缓冲寄存器 - URXHn 0x5000x024/27 接收缓冲寄存器 UBRDIVn 0x5000x028 波特率除数寄存器
1、线路控制寄存器(ULCON) Register Address R/W Description Reset Value 字段名 位 0x50000000 UART0线路控制寄存器 0x00 ULCON1 0x50004000 UART1线路控制寄存器 ULCON2 0x50008000 UART2线路控制寄存器 字段名 位 意 义 初值 - 7 保 留 Infra-Red-Mode 6 红外模式设置位。0:正常模式;1:红外 Parity Mode 5:3 奇偶校验类型。 0xx:不校验; 100:奇校验; 101:偶校验; 110:强制为1; 111:强制为0 000 Num of stop bit 2 停止位个数。 0:1个;1:2个 Word Length 1:0 数据位数目。 00:5位; 01:6位; 10:7位; 11:8位 00
2、控制寄存器(UCON) Register Address R/W Description Reset Value UCON0 0x50000004 UART0控制寄存器 0x00 UCON1 0x50004004 UART1控制寄存器 UCON2 0x50008004 UART2控制寄存器
波特率时钟源选择。0:PCLK;1:UCLK 2、控制寄存器(UCON) 字段名 位 意 义 初值 Clock Selection 10 波特率时钟源选择。0:PCLK;1:UCLK Tx Int Type 9 发送中断请求类型。0 :脉冲型;1:电平 Rx Int Type 8 接收中断请求类型。0 :脉冲型;1:电平 Rx Time OV Ena 7 接收超时中断控制。0:禁止;1:允许 Rx ERR Int Ena 6 接收错误中断控制。0:禁止;1:允许 Loopback Mode 5 回送模式控制。0 = 正常操作;1 = 回送模式 Send Break Signal 4 发送暂停信号控制。 0 = 正常传输;1 = 发送暂停信号(全为0) Transmit Mode 3:2 发送/接收模式控制。00:禁止发送/接收; 01:中断或查询模式;10:UART0、2用DMA0、DMA3;11:UART1用DMA1 00 Receive Mode 1:0
3、FIFO控制寄存器(UFCON) Register Address R/W Description Reset Value UFCON0 0x50000008 UART0 FIFO控制寄存器 0x00 UFCON1 0x50004008 UART1 FIFO控制寄存器 UFCON2 0x50008008 UART2 FIFO控制寄存器
3、FIFO控制寄存器 字段名 位 意 义 初值 Tx FIFO Tri Leve 7:6 Tx FIFO的触发电平设置。 00:空; 意 义 初值 Tx FIFO Tri Leve 7:6 Tx FIFO的触发电平设置。 00:空; 01:减少到4字节;10:减少到8字节;11:减少到12字节 00 lRx FIFO Tri Level 5:4 Rx FIFO的触发电平设置。 00:增加到4字节; 01:增加到8字节; 10:增加到12字节;11 :增加到16字节 reserved 3 保 留 Tx FIFO Reset 2 Tx FIFO清除控制。0:正常;1:清零 Rx FIFO Reset 1 Rx FIFO清除控制。0:正常;1:清零 FIFO Enable FIFO应用控制。 0:失能;1:使能
4、MODEM控制寄存器(UMCON) Register Address R/W Description Reset Value 0x5000000C UART0 FIFO控制寄存器 0x00 UMCON1 0x5000400C UART1 FIFO控制寄存器 reserved 0x5000800C - 保留 字段名 位 意 义 初值 reserved 7:5 保留(为0) 000 Auto Flow Control (AFC) 4 自动流控制。 0:一般方式;1:自动流控制 3:1 Request to Send nRTS引脚信号控制。 0:nRTS 为 高电平;1:nRTS为低电平,有效。
5、发送/接收状态寄存器(UTRSTAT) Register Address R/W Description Reset Value UTRSTAT0 0x50000010 R UART0状态寄存器 0x06 UTRSTAT1 0x50004010 UART1状态寄存器 UTRSTAT2 0x50008010 UART2状态寄存器 字段名 位 意 义 初值 Transmitter empty 2 发送器空状态位。 0:发送器未空 1:发送器、发送缓冲器均空。 1 Transmit buffer empty 发送缓冲器空状态位。 0:未空;1:空 在非FIFO模式,激发中断或DMA请求 Receive buffer data ready 接收缓冲器状态位。 0:空;1:有数据
6、Rx错误状态寄存器(UERSTAT) Register Address R/W Description Reset Value 字段名 UART0Rx错误状态寄存器 0x0 UERSTAT1 0x50004014 UART1Rx错误状态寄存器 UERSTAT2 0x50008014 UART2Rx错误状态寄存器 字段名 位 意 义 初值 Break Detect 3 暂停信号状态。 0:无暂停信号; 1:收到暂停信号(产生中断请求) Frame Error 2 帧错误状态位。 0:无帧错误; 1:有帧错误(产生中断请求) Parity Error 1 奇偶校验错误状态。0:无奇偶校验错 1:有奇偶校验错误(产生中断请求) Overrun Error 溢出错误状态位。 0:无溢出错误; 1:溢出错误(产生中断请求)
7、FIFO状态寄存器(UFSTAT) Register Address R/W Description Reset Value 字段名 位 0x50000018 R UART0 FIFO状态寄存器 0x00 UFSTAT1 0x50004018 UART1 FIFO状态寄存器 UFSTAT2 0x50008018 UART2 FIFO状态寄存器 字段名 位 意 义 初值 Reserved 15:10 保留(为0) Tx FIFO Full 9 发送FIFO满状态。 0:未满; 1:满 Rx FIFO Full 8 接收FIFO状态位。 0:未满; 1:满 Tx FIFO Count 7:4 发送FIFO中数据的数目,字节单位。 Rx FIFO Count 3:0 接收FIFO中数据的数目,字节单位。
8、MODEM状态寄存器(UMSTAT) Register Address R/W Description Reset Value 0x5000001C R UART0 Modem状态寄存器 0x0 UMSTAT1 0x5000401C UART1 Modem状态寄存器 Reserved 0x5000801C 保留 - 字段名 位 意 义 初值 Reserved 3 保留(为0) Delta CTS 2 nCTS引脚信号自上次读后变化状态。 0:未改变;1:已改变。 1 Clear to Send nCTS引脚信号状态。 0:nCTS为高 电平;1:nCTS引脚为低电平,有效。
9、发送缓冲寄存器(UTxH) Register Address R/W Description Reset Value 字段名 位 意 义 0x50000020(L) 0x50000023(B) W (byte) UART0 发送缓冲寄存器 - UTxH1 0x50004020(L) 0x50004023(B) UART1发送缓冲寄存器 UTxH2 0x50008020(L) 0x50008023(B) UART2发送缓冲寄存器 字段名 位 意 义 初值 Tx DATAn 7:0 UARTn发送的一个字节数据 -
10、接收缓冲寄存器(URxH) Register Address R/W Description Reset Value 字段名 位 0x50000024(L) 0x50000027(B) R (byte) UART0 接收缓冲寄存器 0x00 URxH1 0x50004024(L) 0x50004027(B) UART1接收缓冲寄存器 URxH2 0x50008024(L) 0x50008027(B) UART2接收缓冲寄存器 字段名 位 意 义 初值 Rx DATAn 7:0 UARTn接收的一个字节数据。 -
11、波特率除数寄存器(UBRDIV) Register Address R/W Description Reset Value 字段名 位 0x50000028 UART0 波特率除数寄存器 - UBRDIV1 0x50004028 UART1 波特率除数寄存器 UBRDIV2 0x50008028 UART2 波特率除数寄存器 字段名 位 意 义 初值 UBRDIV 15:0 波特率除数值。UBRDIVn >0 -
四、UART应用举例 编写一程序,使用S3C2410X的UART2进行串行数据收发,要求用脉冲请求中断的方式、使用收/发FIFO,8个数据位、1个停止位、不校验,波特率为125kb/s。设Pclk为50MHz。(提示:主程序对UART2初始化、引脚配置、中断初始化等,并进行一次发送;中断服务程序进行数据收发,标签清除中断请求标志和中断服务标志) 解: (1)计算波特率除数: 由公式: UBRDIVn=(int)(CLK/( f B*16))- 1 这里: Pclk=50MHz, f B = 125kb/s 计算得: UBRDIVn=25 -1=24 (2)UART2控制寄存器: 线路控制寄存器: ULCON2=0b 0 000 0 11=0x03 含义:非红外、不校验、 1个停止位、 8个数据位
控制寄存器: UCON2=0b 0 0 0 0 0 0 0 01 01=0x05 含义:选Pclk、发/收中断脉冲请求、关闭接收超时中断、允许接收错误中断、不回送、不发送暂停信号、发/收用中断方式。 FIFO控制寄存器:UFCON2=0b 10 01 0 0 0 1=0x91 含义:发/收FIFO选8字节触发、保留位为0、不复位发/收FIFO、使能FIFO。 (3)引脚配置 需要设置TxD2、RxD2,它们对应GPH6、GPH7,在GPH配置寄存器GPHCON中的位置为: 0b 1 0 1 0 ** ** ** ** ** ** 方法:GPHCON= GPHCON&~(0xF<<12)|(0xA<<12)
第16讲到此 (4)中断寄存器设置 中断模式寄存器:INTMOD&=~(1<<15) INT_UART2位于第15位,将UART2设置为IRQ中断 中断屏蔽寄存器:INTMSK&=~(1<<15) 中断优先级寄存器PRIORITY: 不设置,使用固定优先级。 子中断屏蔽寄存器:INTSUBMSK&=~(7<<6) INT_ERR2、INT_TXD2、INT_RXD2位于子中断屏蔽寄存器中的8、7、6位。 (5)在中断服务程序中对寄存器的操作 清除中断标志寄存器相应位: SRCPND&=~(1<<15) 清除中断服务寄存器相应位: INTPND&=~(1<<15)
4.11 实时钟RTC 主要内容 概述 结构 寄存器 应用举例 重点: (1)控制寄存器、线路控制寄存器、发/收状态寄存器;
4.9 SPI接口 主要内容 概述 结构 寄存器 应用举例 重点: (1)控制寄存器、线路控制寄存器、发/收状态寄存器; (2)RTC应用
一、SPI接口概述 SPI接口:SPI(Serial Peripheral Interface,串行外设接口)是Motorola公司开发的一种同步串行外设接口标准。 SPI接口信号:有4个信号:数据发送、数据接收、时钟和片选。在时钟信号的作用下,发送的同时,接收对方发来的数据;也可以只发送、或者只接收。SPI的波特率可以达到20Mb/s以上。 S3C2410 ARM9有2个SPI接口,既可以作为主SPI使用,也可以作为从SPI使用。 主要特点: 与SPI 协议 (ver. 2.11) 兼容; 8位发送移位寄存器; 8位接收移位寄存器; 8位预分频器; 具有查询、中断、DMA传输模式。
二、S3C2410 SPI结构与工作原理 1、SPI结构
系统可以多个SPI设备组成,任何一个设备都可以为主SPI,但是任一时刻只能有一个主SPI设备。如下图所示。 从SPI n …… SCK MOSI MISO nSS
3、SPI工作时序 下图为时序的一部分。 图 (A)
图 (B) Format CPOL和CPHA 第一位数据输出 其它位数据输出 数据采样 A CPOL=0,CPHA=0 第1个SCK上升沿前
三、SPI专用寄存器 2个UART,每个都有6个专用寄存器,共12个寄存器 Register Address R/W Description Reset Value SPCONn 0x590000x0 SPI控制寄存器 0x00 SPSTAn 0x590000x4 R SPI状态寄存器 0x01 SPPINn 0x590000x8 SPI引脚控制寄存器 0x02 SPPREn 0x590000xC SPI预分频寄存器 SPTDATn SPI数据发送寄存器 SPRDATn SPI数据接收寄存器
Tx Auto Garbage Data Mode 1、SPI控制寄存器(SPCON) Register Address R/W Description Reset Value SPCON0 0x59000000 SPI0 控制寄存器 0x00 SPCON1 0x59000020 SPI1 控制寄存器 字段名 位 意 义 初值 SMOD 6:5 SPI模式选择。00:查询模式; 01:中断; 10:DMA模式; 11:保留 00 ENSCK 4 时钟SCK控制。 0:禁止;1:允许。 MSTR 3 SPI主、从选择。 0:从SPI;1:主SPI CPOL 2 时钟极性选择。0:高电平有效;1:低 CPHA 1 时钟相位选择。0:格式A;1:格式B Tx Auto Garbage Data Mode Enable (TAGD) 仅接收模式控制。0:正常收发; 1:仅接收(此时(自动)发送任意数据)
Data Collision Error Flag (DCOL) Multi Master Error Flag (MULF) 2、SPI状态寄存器(SPSTA) Register Address R/W Description Reset Value SPSTA0 0x59000004 R SPI0 状态寄存器 0x01 SPSTA1 0x59000024 SPI1 状态寄存器 字段名 位 意 义 初值 reserved 7:3 保 留 Data Collision Error Flag (DCOL) 2 数据写碰撞(正在发送时写SPTDAT) 错误标志。 0:无错;1:碰撞错误 Multi Master Error Flag (MULF) 1 多主SPI错误标志。 0:无错;1:多主SPI错误。 Transfer Ready Flag (REDY) 收发就绪标志。 0:未就绪; 1:收或发就绪。 写SPTDAT后该位自动清0
3、SPI引脚控制寄存器(SPPIN) Register Address R/W Description Reset Value 字段名 位 0x59000008 SPI0 引脚控制寄存器 0x02 SPPIN1 0x59000028 SPI1 引脚控制寄存器 字段名 位 意 义 初值 reserved 7:3 保 留 Multi Master error detect Enable (ENMUL) 2 引脚多主SPI错误测试设置。 0:禁测;1:允许多主错误测试。 测试结果在SPSTAn中的MULF位 1 该位应该为1 Master Out Keep (KEEP) 1字节发完后MOSI的控制与释放 0:释放;1:保持MOSI原电平
4、SPI预分频寄存器(SPPRE) Register Address R/W Description Reset Value 字段名 位 0x5900000C SPI0 预分频寄存器 0x00 SPPRE1 0x5900002C SPI1 预分频寄存器 字段名 位 意 义 初值 Prescaler value 7:0 预分频值 波特率计算: Baud tate = Pclk/2/( Prescaler value + 1 ) 提示:SPI的波特率必须<25MHz。
5、SPI发送数据寄存器(SPTDAT) Register Address R/W Description Reset Value 字段名 0x59000010 SPI0 发送数据寄存器 0x00 SPTDAT1 0x59000030 SPI1 发送数据寄存器 字段名 位 意 义 初值 Tx data 7:0 SPI所发送的8位数据 0x00 提示:在同时双向传输时,从SPI设备必须先把所发送的数据写到“发送数据寄存器”SPTDATn中,然后再写主SPI设备的“发送数据寄存器”SPTDATn。
6、SPI接收数据寄存器(SPRDAT) Register Address R/W Description Reset Value 字段名 0x59000014 R SPI0 接收数据寄存器 0x00 SPRDAT1 0x59000034 SPI1 接收数据寄存器 字段名 位 意 义 初值 Tx data 7:0 SPI所接收的8位数据 0x00 提示:在同时双向传输时,启动发送后,应该先读取数据,然后再发送数据。
四、SPI应用方法 1、一般操作步骤 如果SPI控制寄存器SPCON已经设置过,则写数据发送寄存器SPTDAT启动发送。对SPI卡操作步骤如下: (1)设置预分频寄存器SPPRE; (2)设置控制寄存器SPCON; (3)设置一个GPIO引脚,使选中的MMC或SD卡的片选信号nSS有效; (4)向数据发送寄存器SPTDAT写10次0xFF,对MMC或SD卡初始化; (5)发送数据:先要查询Tx/Rx REDY是否为1,然后向数据发送寄存器SPTDAT写数据;
(6)接收数据: 一般方式(同时收发,TAGD=0):向数据发送寄存器SPTDAT写0xFF,查询并确认Rx REDY为1,然后从数据接收寄存器中读取数据。 仅接收方式(TAGD=1):并确认Rx REDY为1,然后从数据接收寄存器中读取数据。读取数据的同时启动一次发送。 (7)设置GPIO引脚,使选中的MMC或SD卡的片选信号nSS无效,结束传输。
2、DMA模式发送 对SPI的DMA模式发送操作步骤如下: (1)设置预分频寄存器SPPRE; (2)设置控制寄存器SPCON,并且设为DMA模式; (3)SPI请求DMA服务; (4)DMA发送1字节数据给SPI; (5)SPI给卡发送数据; (6)返回到(3),直到DMA的计数器为0;
3、DMA模式接收 对SPI的DMA模式接收操作步骤如下: (1)设置预分频寄存器SPPRE; (2)设置控制寄存器SPCON,并且设为DMA模式; (3)将SPI设置为仅接收模式,设置引脚控制寄存器SPPIN中的TAGD为1; (4)当SPI从卡接收到1字节数据后,请求DMA服务; (5)DMA从SPI读取数据; (6)SPI自动启动一次无用数据(0xFF)的发送; (7)返回到(4),直到DMA的计数器为0; (8)设置控制寄存器SPCON,改设为其它模式,如查询、中断模式; (9)如果Rx REDY被设置为1,则需要读取最后接收的数据。 注意:DMA第1次接收的是数据的无效的。
4、 SPI从设备以格式B接收的问题 当SPI从设备以格式B接收,DMA的读信号比数据接收的锁存信号早,在数据未锁存之前,读信号就出现了。因此使用DMA模式不能够正确接收。如下图所示。 对于中断和查询模式,可以延时半个时钟,能够正确读取数据。
五、SPI接口应用举例 把S3C2410的SPI0设为主设备,同时把SPI1设为从设备,将二者的MOSI、MISO交叉相连,二者的SCL对连, 用GPG0引脚控制nSS1。编写程序, SPI0用中断方式、 SPI1用查询方式,采用格式B、1Mb/s的波特率,SPI0和SPI1在发送的同时接收数据,双方都发送、接收100个字节的数据。设系统Pclk=50MHz。 解: (1)SPI计算预分频值: 由 Baud tate = Pclk/2/( Prescaler value + 1 ) Prescaler value = Pclk/2/Baud tate - 1=24 (2)SPI控制寄存器值 SPCON0=0b 01 1 1 0 1 0 = 0x3A 含义:中断模式、使用时钟、主设备、0极性、格式B、一般收发传输。 SPCON1=0b 01 0 0 0 1 0 = 0x22 含义:中断、不用时钟、从设备、0极性、格式B、收发
含义:不检测多主错误、保留1、输出引脚保持输出。 SPPIN1=0b 0 1 1 = 0x03 (4)SPI引脚配置 GPECON=0b ** ** 10 10 10 ** …… 先清0:&~(0xFC<<20);再设置:|(0xA8<<20) GPGCON=0b …… 11 11 11 ** 11 11 ** 01 先清0:&~0xFCF3);再设置:|(0xFCF1) SPI0引脚 29 28 27 26 25 24 23 22 21 20 GPECON * 1 CLK0 MOSI0 MISO0 SPI0引脚 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 GPGCON * CLK1 MOSI1 MISO1 nSS1 nSS0 输出
(4)中断寄存器设置 中断模式寄存器: INTMOD &=~(1<<22) INT_UART2位于第15位,将UART2设置为IRQ中断 中断屏蔽寄存器: INTMSK&=~ (1<<22) 中断优先级寄存器PRIORITY: 不设置,用复位值0x7F,优先级为循环方式。 (5)在中断服务程序中对寄存器的操作 清除中断标志寄存器相应位: SRCPND&=~ (1<<22) 清除中断服务寄存器相应位: INTPND&=~ (1<<22)
#include "2410header.h" void Main(void) { sysinit(); while(1) Uart_Printf("\n 2410 Board SPI TEST!\n"); Test_SPI( ); }
char tran_data0[100], rec_data0[100], num0=0; void Test_SPI(void) { rSPPRE0=24; rSPPRE1=24; rSPCON0=0x3A; rSPCON1=0x22; rSPPIN0=0x03; rSPPIN1=0x03; rGPECON = rGPECON & ~(0xFC<<20)|(0xa8<<20); rGPGCON = rGPGCON & ~0xFCF3 | 0xFCF1; rGPGDAT = rGPGCON & ~1; //使GPG0输出0 INTMOD &=~(1<<22); INTMSK &=~(1<<22); pISR_SPI0=(U32)spi0_int;
rSPTDAT1=tan_data1[num1]; for(;num1<100;) { while(rSPSTA1&1==0); INTMSK |=(1<<22); //关闭SPI0中断 rec_data[num1] = rSPRDAT1; num1++; if(num1<100) INTMSK &=~(1<<22); //打开SPI0中断 } INTMSK |=(1<<22); //关闭SPI0中断 rGPGDAT |= 1; //使GPG0输出1,nSS1为高
SRCPND &=~ (1<<22); //清除中断标志寄存器相应位 void _irq spi_int(void) { rec_data[num0]=rSPRDAT0; num0++; if(num<100) rSPTDAT0 = tran_data[num0]; SRCPND &=~ (1<<22); //清除中断标志寄存器相应位 INTPND &=~ (1<<22); //清除中断服务寄存器相应位 }
#define rSPTDAT0 (*(volatile unsigned *)0x59000010) //SPI0 Tx data #define rSPRDAT0 (*(volatile unsigned *)0x59000014) //SPI0 Rx data #define rSPTDAT1 (*(volatile unsigned *)0x59000030) //SPI1 Tx data #define rSPRDAT1 (*(volatile unsigned *)0x59000034) //SPI1 Rx data