微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM入门笔记(10)

ARM入门笔记(10)

时间:12-02 来源:互联网 点击:
USB设备实验

一.背景

在ATMEL官方网站上提供了USB的应用例子(详情请参考“BasicUSB Application”说明),里面有源代码(是用IAR编译的,需要稍作修改才能用在ADS上),两个不同的USB驱动程序。两个不同的USB驱动程序,在PC机上是两个不同的应用例子。当安装完两个不同的驱动后,一个出现的是调制解调器的设备,可以用超级终端来完成USB数据的收发。另一个是USB 设备,用ATMEL提供的“BasicUSB_6124.exe”来完成USB数据的收发。我起初一直在用后面的例子来做实验,但试了很久都没有成功,后来改用前面的成功了。

二.USB驱动安装说明

当第一次与host PC机连接时,系统会弹出一个“找到新的硬件向导”窗口,选择“从列表或指定位置安装”后点击“下一步”。在接下来的窗口中选择“不要搜索。我要自己选择要安装的驱动程序”,然后点击“下一步”。再在接下来的窗口中点击“从磁盘安装”,找到“atm6124ser.inf”所在的目录后打开。再点击“下一步”开始安装,最后点“完成”就可以。

安装完成后,会在设备管理器的“调制解调器”栏中查看到“ATMEL AT91 USB serial emulation #2”设备。此时就可以使用“超级终端”通过USB与AT91SAM7S64通讯了。详请请查看该目录的“BasicUSB Application.pdf”文件。

三.实验目的

用PC机上的超级终端发送数据,AT91SAM7S64通过USB接收超级终端上发过来的数据(USB的读操作),再通过USB将接收到的数据返回给PC机上的超级终端(USB的写操作),这样就完成了PC机与 AT91SAM7S64的USB通讯。如果AT91SAM7S64将接收到数据通过DBUG串口再发送出去,这样AT91SAM7S64就可以当作一个 USB转串口的设备使用。

四.实验源程序

由于这个实验的源程序比较多,且ATMEL提供了详细的文档和源代码,故不再列出。有什么问题可以通过ccn422@hotmail.com联系我。

另外因为ATMEL的源码中没有使能重映射功能,如果想将程序下载到地址为0x00200000的SRAM中调试,又要使用在0x0地址空间的中断向量表,使程序跳转到中断处理程序,必须使用重映射的功能。所以我在起动代码(AT91F_LowLevelInit)中加了重映射这条命令,如下:

if (Remap_Flag == 0)
{ //由于不能重复执行重映射命令,所以加了Remap_Flag标志来避免多次执行重映射命令
Remap_Flag = 0xff;
*AT91C_MC_RCR = AT91C_MC_RCB; //Remap Command Bit
}

五.出现的问题与解决方法

1> 每次重新装载程序进行调试时,Remap_Flag没有等于0。

原因是进入C代码前,没有初始化存储器的内容。用户可以将起动代码中的“bmain”改成“b__main”,即在跳入到main()函数前执行__main初始化库函数,也可自己加入初始化存储器的代码。程序如下:

InitReset
IMPORT |Image$$RO$$Limit|; End of ROM code (=start of ROM data)
IMPORT |Image$$RW$$Base| ; Base of RAM to initialise
IMPORT |Image$$ZI$$Base| ; Base and limit of area
IMPORT |Image$$ZI$$Limit|; to zero initialise
;********************************************************
;* Copy and paste RW data/zero initialized data *
;********************************************************
LDR r0, =|Image$$RO$$Limit| ; Get pointer to ROM data
LDR r1, =|Image$$RW$$Base| ; and RAM copy
LDR r3, =|Image$$ZI$$Base|
;Zero init base => top of initialised data

CMP r0, r1 ; Check that they are different
BEQ %F1
0
CMP r1, r3 ; Copy init data
LDRCC r2, [r0], #4 ;--> LDRCC r2, [r0] + ADD r0, r0, #4
STRCC r2, [r1], #4 ;--> STRCC r2, [r1] + ADD r1, r1, #4
BCC %B0
1
LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment
MOV r2, #0
2
CMP r3, r1 ; Zero init
STRCC r2, [r3], #4
BCC %B2

如果想详细了解该部分的原理,可以参考三星公司为44B0写的起动代码部分资料。

2> 这个实验浪费了很多的时间,原因就是因为我一直用的atm6124.sys和atm6124.inf驱动程序以及BasicUSB_6124.exe来做此实验,当执行BasicUSB_6124.exe后,总是出现“设备不能连接”。为此我专门去书店买了《USB2.0应用与设计》参考,再研究和调试源代码,再加上仔细的阅读“BasicUSB Application.pdf”文件,后来改用atm6124ser.inf驱动程序与超级终端来完成了本次实验。

六.总结

如果一开始就很成功的完成了本次实验,我可能对USB的原理等不会了解到多少,正是因为出现了问题,我才会为了解决问题而去找相关的资料学习,最终到问题的解决。因此出现问题并不是一件什么坏事,相反,问题的出现会引导我们静下心来向更深层次去探究,最终更深刻更全面地掌握知识。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top