1号ARM实验报告.docx
《1号ARM实验报告.docx》由会员分享,可在线阅读,更多相关《1号ARM实验报告.docx(53页珍藏版)》请在冰豆网上搜索。
1号ARM实验报告
电子科技大学成都学院
实验报告册
课程名称:
ARM开发实践
姓名:
学号:
院系:
微电子技术系
专业:
电子科学与技术
教师:
2014年6月1日
实验一:
S3C2440IIC控制
1、实验目的:
本次实验的主要目的是通过S3C2440的IIC接口,达到了解IIC传输和接收数据的原理,同时掌握IIC通信协议。
二、实验原理和内容:
内容:
是通过S3C2440的IIC接口,向EEPROM芯片AT24C02A写入8个数据,然后再将所写的数据读出,并显示在串口调试工具上。
原理:
IIC(Inter-IntegratedCircuit,I2C)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微处理器及其外围设备,它的最主要优点是简单和有效。
它只需要数据线SDA和时钟线SCL,就能够实现CPU与被控IC之间、IC与IC之间进行双向传送。
S3C2440ARISC微处理器可以支持一个多主控IIC总线串行接口。
一条专用串行数据线(SDA)和一条专用串行时钟线(SCL)传递连接到IIC总线的总线主控和外设之间的信息。
SDA和SCL线都为双向的。
多主控IIC总线模式中,多个S3C2440ARISC微处理器可以发送或接收串行数据来自或到从设备。
主机S3C2440A可以通过IIC总线启动和结束数据传输。
S3C2440A中的IIC总线是使用标准总线仲裁步骤。
为了控制多主控IIC总线操作,必须写入值到以下寄存器中:
–多主控IIC总线控制寄存器,IICCON
–多主控IIC总线控制/状态寄存器,IICSTAT
–多主控IIC总线Tx/Rx数据移位寄存器,IICDS
–多主控IIC总线地址寄存器,IICADD
当释放了IIC总线时,SDA和SCL线应该都保持为高电平。
一个高到低SDA的变化可以启动一个起始条件。
SCL稳定保持在高电平时的一个低到高SDA的变化可以启动一个停止条件。
起始和停止条件通常由主设备产生。
第一个数据字节为7位地址值,其在启动起始条件后放到总线上,可以确定出主设备要选择的从设备。
第8位是决定传输方向(读或写)。
每个放到SDA线上的字节都应该总共为8位。
字节可以在总线传输操作期间无限制的发送或接收。
数据通常从最高有效位(MSB)开始始发送,并且每个字节应该立即通过应答(ACK)位跟上。
IIC总线接口
S3C2440A的IIC总线接口有4种工作模式:
–主机发送模式
–主机接收模式
–从机发送模式
–从机接收模式
起始和停止条件
当IIC总线接口不活动时,其通常在从机模式。
换句话说,该接口在从SDA线上检测到起始条件(当SCL时钟信号为高时的一个高到低SDA的变化可以启动一个起始条件)之前应该处于从机模式。
当接口状态被改为主机模式时,可以起始发送数据到SDA上并且产生SCL信号。
起始条件可以传输1字节串行数据到SDA线上,而停止条件可以结束数据的传输。
停止条件是在当SCL为高时的SDA线由低到高的变化。
起始和停止条件总由主机产生。
当产生了一个起始条件时IIC总线变为忙。
停止条件将使得IIC总线空闲。
当主机发起一个起始条件时,其应该送出一个从机地址来通知从设备。
地址字段的1字节由7位地址和1位传输方向标志(表现为读或写)组成。
如果位[8]为0,其表示一个写操作(发送操作);如果位[8]为1,其表示一个数据读取的请求(接收操作)。
主机将通过发送一个停止条件来完成传输操作。
如果主机希望持续发生数据到总线上,其应该在同一个从地址产生再一个起始条件。
这样就可以执行各种格式的读写操作。
图三起始和停止条件
数据传输格式
放置到SDA线上的每个字节应该以8位为长度。
每次传输字节可以无限制的发送。
起始条件随后的第一个字节应该包含地址字段。
当IIC总线工作在主机模式时可以由主机发送该地址字段。
每个字节都应该跟随一个应答(ACK)位。
总是最先发送串行数据和地址的MSB。
图四IIC总线接口数据格式
图五IIC总线上的数据传输
发送ACK信号
为了完成一次单字节传输操作,接收器应该发送一个ACK位给发送器。
ACK脉冲应该发生在SCL线的第9个时钟。
前8个时钟是提供给单字节传输的。
主机需要应该产生时钟脉冲来发送ACK位。
当发送器收到ACK时钟脉冲时应该通过拉高SDA线来释放SDA线。
当接收器在ACK时钟脉冲期间也应该驱动SDA线为低来在第9个脉冲的高电平时期期间保持SDA为低。
ACK位发送功能可以由软件(IICSTAT)使能或禁止。
然而,需要SCL的第9个时钟上的ACK脉冲来完成单字节的传输操作。
图六IIC总线上的应答
读写操作
发送模式中当发送了数据时,在IIC总线数据移位(IICDS)寄存器收到新数据之前IIC总线接口将会一直等待。
在新数据写入到寄存器之前,SCL线将会保持为低,然后在其写入后释放。
S3C2440A应该等待中断来确定当前数据发送的完成。
在CPU收到中断请求后,需要再次写一个新数据到IICDS寄存器中。
接收模式中当收到了数据时,在读取IICDS寄存器前IIC接口将会一直等待。
在新数据读出前,SCL线将会保持为低,然后在其读取后释放。
S3C2440A应该等待中断来确定当前数据接收的完成。
在CPU收到中断请求后,需要从IICDS寄存器中读取数据。
总线仲裁步骤
发生在SDA线上的仲裁是预防总线上两个主机的竞争。
如果SDA为高电平的主机检测到另一个主机的SDA激活了低电平,其将不会启动数据传输,这是因为总线上的当前电平与其(前者)拥有的电平不符合。
将扩展仲裁步骤直到SDA线变为高。
然而,当主机同时拉低SDA线时,每个主机都应该判断是否分配了主控给自己。
为了判断则每个主机应该检测地址位。
当每个主机都产生的从地址时,它们也应该检测SDA线上的地址位,这是因为SDA线个更倾向于获得低电平而不是保持为高电平。
假定一个主机产生了一个低电平作为第一个地址位,同时其它主机保持为高。
在这种情况中,主机都将检测到总线上的低电平,因为低电平状态在电平上优先于高电平状态。
当发生这种情况时,产生低电平(作为地址的第一位)的主机将得到主控,同时产生高电平(作为地址的第一位)的主机应该退出主控。
如果主机都产生低电平作为地址的第一位,它们应该继续通过第二个地址位仲裁。
这种仲裁将持续到最后地址位的结束。
中止条件
如果从接收器不能应答从地址的确认,其应该保持SDA线的电平为高。
这种情况中,主机应该产生一个停止条件并且中止传输。
如果主机接收器收到了传输中止的影响,其应该通过取消来自从机收到的最后数据字节后ACK的产生来指示从发送操作的结束。
从发送器应该随后释放SDA来允许主机产生停止条件。
三、实验步骤:
1、首先在ADS上建立一个工程,工程名为IIC,然后选择一个合适的路径存放。
2、将光盘中TQ2440测试程序里面inc和src文件夹下的2440addr.h、2440lib.h、2440slib.h、def.h、Nand.h、Option.h、2440addr.inc、Memcfg.inc、Option.inc、2440init.s、2440slib.s、2440lib.c、nand.c这13个文件依次拷贝到刚才所建工程的文件夹下。
3、新建一个源文件,命名为IIC.c,存放到工程名为IIC的文件夹下。
4、在IIC.mcp下创建一个分组,取名为startcode,然后将前面拷贝的3个文件2440init.s、2440slib.s、nand.c依次添加到以startcode命名的文件夹下。
5、将IIC.c添加到工程里面去。
6、配置DebugRelSettings。
7、在IIC.c里面进行程序的书写。
8、编译所写程序。
9、打开串口调试工具,将波特率设为115200。
10、将开发板、仿真器、串口线和电脑正确连接,打开Hjtag软件,调试程序。
四、实验结果:
1、写入数据是收到了写入的数据,说明程序进行了写内存的操作
2、再将数据读出,在串口调试工具中可以看到,接收数据里面会接收到程序发过来的字节,这些字节都是我们最开始写进去的数据。
五、实验总结:
通过本次试验,更深一步了解IIC传输和接收数据的原理,同时牢固地掌握IIC通信协议,以及串口的工作原理,并且了解了EEPROM的存取规则和原理
六、附录:
//wordAddr对应的是adress,*buffer对应IIC_buffer,sizeofdate对应length
voidwr24c02a(unsignedcharwordAddr,unsignedchar*buffer,intsizeofdate)
{
inti;
flag=1;//应答信号
//先发送从设备地址信息
rIICDS=devAddr;//从设备地址:
devAddr=0xa0;
rIICCON&=~0x10;//清中断标志
rIICSTAT=0xf0;//主设备发送模式
//当地址匹配时,发送应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
//接受设备内存地址信息
flag=1;
rIICDS=wordAddr;//写入从设备内存地址
rIICCON&=~0x10;//清中断标志
//再次应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
for(i=0;i{
flag=1;
rIICDS=*(buffer+i);
rIICCON&=~0x10;//清中断标志
//应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
}
rIICSTAT=0xd0;//发送stop命令,接收该次通信
rIICCON=0xe0;//为下次IIC通信作准备
Delay(100);//等待
}
voidrd24c02a(unsignedcharwordAddr,unsignedchar*buffer,intsizeofdate)
{
inti;
unsignedchartemp;
flag=1;
//接收带有写命令的从设备地址信息
rIICDS=devAddr;//从设备地址:
devAddr=0xa0;
rIICCON&=~0x10;//清中断标志
rIICSTAT=0xf0;//主设备发送模式
//应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
//从设备内存地址信息
flag=1;
rIICDS=wordAddr;//写入从设备内存地址
rIICCON&=~0x10;//清中断标志
//应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
flag=1;
rIICDS=devAddr;
rIICCON&=~0x10;//清中断标志
rIICSTAT=0xb0;//主设备接收模式
//应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
flag=1;
temp=rIICDS;
rIICCON&=~0x10;//清中断标志
//应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
//连续读
for(i=0;i{
flag=1;
if(i==sizeofdate-1)//若是最后一个数据
rIICCON&=~0x80;
*(buffer+i)=rIICDS;
rIICCON&=~0x10;//清中断标志
//应答
while(flag==1)//等待从设备应答,IIC中断一次,表示应答
Delay(100);
}
rIICSTAT=0x90;//结束该次通信
rIICCON=0xe0;
Delay(100);
}
实验二:
S3C2440图形显示控制
一、实验目的:
本次实验的主要目的是通过S3C2440来驱动外部3.5寸TFT屏,并且在屏上显示一个圆,矩形,三角形,菱形。
屏大小是320X240,所设置的颜色为24位真彩色模式。
同时掌握TFT型LCD屏初始化寄存器的配置方法,以及屏显示的颜色控制方法。
二、实验原理和内容:
内容:
人机交互是嵌入式系统必须具有的功能。
比较简单的人机交互有按键、LED、蜂鸣器,稍微复杂的有7段数码管和点阵。
但如今这些都不能满足人们的需求了,所以又出现了LCD和触摸屏技术。
s3c2440具有LCD和触摸屏接口,可以很好的连接LCD和触摸屏。
本次实验主要介绍TFT型LCD的用法。
原理:
3C2440A中的LCD控制器由从位于系统存储器的视频缓冲区到外部LCD驱动器的转移LCD图像数据逻辑组成。
LCD控制器支持LCD的单色、2位每像素(4阶灰度)或4位每像素(16阶灰度)模式,通过使用基于时间的抖动算法和帧频控制(FRC)方法,其可以连接到8位每像素(256色)的彩色LCD面板和连接到12位每像素(4096色)的STNLCD。
其支持1位每像素、2位每像素、4位每像素和8位每像素的调色TFT彩色LCD面板连接,以及16位每像素和24位每像素的无调色真彩显示。
可以编程LCD控制器来支持不同涉及屏幕水平和垂直像素数、数据接口的数据线宽度、接口时序和刷新率的需要。
特性:
TFTLCD显示:
–支持TFT的1、2、4、8bpp(位每像素)调色显示
–支持彩色TFT的16、24bpp无调色显示
–支持24位每像素模式下最大16M色TFT
–支持多种屏幕尺寸
典型实际屏幕尺寸:
640×480、320×240、160×160等,最大虚拟屏幕尺寸为4M字节,64K色模式最大虚拟屏幕尺寸:
2048×1024等。
S3C2440ALCD控制器是用于传输视频数据和产生必要的控制信号,如VFRAME、VLINE、VCLK、VM等等。
除控制信号外,S3C2440A还有视频数据的数据端口,如图二所示的VD[23:
0]。
LCD控制器包括REGBANK、LCDCDMA、VIDPRCS、TIMEGEN和LPC3600(见上图)。
REGBANK有17个可编程寄存器集和用于配制LCD控制器的256×16个调色存储器。
LCDCDMA专用于DMA,它可以自动从帧存储器到LCD驱动器传输视频数据。
通过使用专用DMA,可以在屏幕上显示视频数据而不需要CPU的介入。
VIDPRCS接收来自LCDCDMA的视频数据并且在将其变换为适当格式后通过VD[23:
0]数据端口发送视频数据到LCD驱动器,例如4/8位信号信号扫描或4位双扫描显示模式。
TIMEGEN由可编程逻辑组成来支持发现不同LCD驱动器的一般接口时序和速率的变化需要。
TIMEGEN模块产生VFRAME、VLINE、VCLK、VM等等。
数据流描述如下:
FIFO存储器LCDCDMA。
当FIFO为空或部分为空时,LCDCDMA请求基于突发存储器传输模式(连续4字(16字节)每单次突发请求的存储器刷新,无需总线传输期间随着总线主控到其它总线主机)从帧存储器刷新数据。
当存储器控制器中的总线仲裁器同意了传输请求,将会从系统存储器到内部FIFO传输4个连续字数据。
FIFO分别由12字FIFOL和16字FIFOH组成,总计28字大小。
S3C2440A有2个FIFO来支持双扫描显示模式。
在单扫描模式情况中,只能使用FIFO的一个(FIFOH)。
TFTLCD控制器操作
TIMEGEN产生控制信号给LCD驱动器,例如VSYNC、HSYNC、VCLK、VDEN和LEND信号。
这些控制信号与REGBANK中LCDCON1/2/3/4/5寄存器的配制有极大的关系。
基于REGBANK中的LCD控制寄存器的这些可编程配制,TIMEGEN可以产生可编程控制信号适合支持多种不同LCD驱动器的类型。
发出VSYNC信号来引起LCD的行指针重新从显示的顶处开始。
VSYNC和HSYNC脉冲的产生取决于LCDCON2/3寄存器中HOZVAL字段和LINEVAL字段的配制。
HOZVAL和LINEVAL可以按照下列等式由LCD面板大小决定:
HOZVAL=(水平显示大小)-1
LINEVAL=(垂直显示大小)-1
VCLK信号的频率取决于LCDCON1寄存器中的CLKVAL字段。
表15-3定义了VCLK和CLKVAL之间的关系。
CLKVAL的最小值为0。
VCLK(Hz)=HCLK/[(CLKVAL+1)×2]
帧频即为VSYNC信号频率。
帧频与LCDCON1和LCDCON2/3/4寄存器中的VSYNC、VBPD、VFPD、LINEVAL、HSYNC、HBPD、HFPD、HOZVAL、和CLKVAL字段有关系。
多数LCD驱动器需要它们自己适当的帧频。
帧频(Hz)=1/[{(1/VCLK)×(HOZVAL+1)+(1/HCLK)×(A
+B+(LINEBLANK×8))}×(LINEVAL+1)]
其中
。
视频操作
S3C2440中的TFTLCD控制器支持1、2、4或8bpp(位每像素)调色显示和16或24bpp无调色真彩显示。
256色调色板
S3C2440可以支持256色调色板给各种色彩映射的选择,以提供灵活操作给用户。
存储器数据格式
24BPP显示
(BSWP=0,HWSWP=0,BPP24BL=0)
D[31:
24]
D[23:
0]
000H
空位
P1
004H
空位
P2
008H
空位
P3
...
(BSWP=0,HWSWP=0,BPP24BL=1)
D[31:
24]
D[23:
0]
000H
P1
空位
004H
P2
空位
008H
P3
空位
...
LCD电源使能(STN/TFT)
S3C2440A提供了电源使能(PWREN)功能。
当PWREN设置为使得PWREN信号使能时,LCD_PWREN引脚的输出值被ENVID控制。
换句话说,如果LCD_PWREN引脚连接了LCD面板的电源开/关控制引脚,LCD面板的电源将自动的由ENVID的设置来控制。
S3C2440A同样支持INVPWREN位来反转PWREN信号的极性。
此功能只在当LCD面板拥有其自己的电源开/关控制端口并且当端口连接到了LCD_PWREN引脚时才可用。
3、实验步骤:
1、首先在ADS上建立一个工程,工程名为lcd,然后选择一个合适的路径存放。
2、将光盘中TQ2440测试程序里面inc和src文件夹下的2440addr.h、2440lib.h、2440slib.h、def.h、Nand.h、Option.h、2440addr.inc、Memcfg.inc、Option.inc、2440init.s、2440slib.s、2440lib.c、nand.c这13个文件依次拷贝到刚才所建工程的文件夹下。
3、新建一个源文件,命名为lcd.c,存放到工程名为lcd的文件夹下。
4、在lcd.mcp下创建一个分组,取名为startcode,然后将前面拷贝的3个文件2440init.s、2440slib.s、nand.c依次添加到以startcode命名的文件夹下。
5、将lcd.c添加到工程里面去。
6、配置DebugRelSettings。
7、在lcd.c里面进行程序的书写。
8、编译所写程序。
9、打开串口调试工具,将波特率设为115200。
10、将开发板、仿真器、和电脑正确连接,并将3.5寸TFT屏连到开发板上对应的位置,打开Hjtag软件,调试程序。
11、观察LCD屏上显示的图形变化情况。
四、实验结果:
在lcd屏上经过一段时间的延时依次循环显示圆、矩形、三角形、菱形,并可控制颜色的变化以及背景色。
五、实验总结:
掌握了TFT型LCD屏初始化寄存器的配置方法,以及屏显示的颜色控制方法,了解了如何实现lcd屏的简单显示控制。
六、附录:
#defineM5D(n)((n)&0x1fffff)//用于设置显示缓存区时,取低21位地址
#defineLCD_WIDTH320//屏幕的宽
#defineLCD_HEIGHT240//屏幕的高
//水平同步信号的脉宽、后肩、前肩
#defineHSPW30
#defineHBPD38
#defineHFPD20
//垂直同步信号的脉宽、后肩、前肩
#defineVSPW3
#defineVBPD15
#defineVFPD12
//有效显示尺寸
#defineHOVZAL(LCD_WIDTH-1)//决定lcd面板的水平尺寸
#defineLINEVAL(LCD_HEIGHT-1)//决定lcd面板的垂直尺寸
//LCDCON1
#defineCLKVAL_TFT6//vclk=7.1MHz
#defineMMODE0//决定VM的触发频率:
0=每帧
#definePNRMODE_TFT3//选择TFT型LCD
#defineBPPMODE_TFT13//选择24位每像素(bpp)
//LCDCON5
#defineBPP24BL0//32位数据表示24位颜色时,低位数据有效
#defineINVVCLK0//VCLK下降沿取视频数据
#defineINVVLINE1//反转HSYNC信号
#defineINVVFRAME1//反转VSYNC信号
#defineINVVD0//正常VD信号
#defineINVVDEN0//正常VDEN信号
#definePWREN1//允许PWREN信号
#defineBSWP0//颜色数据字节不交换
#defineHWSWP0//颜色数据半字不交换
//定义显示缓存区
volatileU32LCD_BUFFER[LCD_HEIGHT][LCD_WIDTH];
//绘制屏幕的背景颜色,颜色为c
voidBrush_Background(U32c)
{
intx,y;
for(y=0;y{
for(x=0;x{
LCD_BUFFER[y][x]=c;
}}}
//画实心圆,颜色为c,圆心在屏幕中心,半径为80个像素
voidDraw_Circular(U32c)
{
intx,y;
inttempX,tempY;
intradius=90;
intSquareOfR=radius*radius;
fo