第十一章 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提供了详细的文档和源代码,故不再列出。有什么问题可以通过
[email protected]
联系我。
另 外因为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.sysatm6124.inf驱动程序以及 BasicUSB_6124.exe来做此实验,当执行 BasicUSB_6124.exe后,总是出现“设备不能连接”。为此我专门去书店买了《USB2.0应用与设计》参考,再研究和调试源代码,再加上仔细的阅读“BasicUSB Application.pdf”文件,后来改用atm6124ser.inf驱动程序与超级终端来完成了本次实验。
六.总结
如 果一开始就很成功的完成了本次实验,我可能对USB的原理等不会了解到多少,正是因为出现了问题,我才会为了解决问题而去找相关的资料学习,最终到问题的 解决。因此出现问题并不是一件什么坏事,相反,问题的出现会引导我们静下心来向更深层次去探究,最终更深刻更全面地掌握知识。