ARM入门笔记(10)

发布时间:2010-8-26 17:33    发布者:绝对好文
关键词: ARM入门笔记
第十一章 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代码前,没有初始化存储器的内容。用户可以将起动代码中的“b  main”改成“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的原理等不会了解到多少,正是因为出现了问题,我才会为了解决问题而去找相关的资料学习,最终到问题的解决。因此出现问题并不是一件什么坏事,相反,问题的出现会引导我们静下心来向更深层次去探究,最终更深刻更全面地掌握知识。
本文地址:https://www.eechina.com/thread-23792-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
长话短说 发表于 2010-9-4 11:37:07
谢谢
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表