USB学习二:读取ID值
时间:02-24
来源:互联网
点击:
题记:熟悉了PDIUSBD12的硬件电路后,就应该进入USB的软件编程部分了。我想大家在初学USB时都会遇到和我一样的困惑:拿起USB协议的相关文档埋头苦看,看半天还是什么又枚举又配置的看是看了,可是回头来好像什么都不懂;理论不行咱就动手吧,可是一找参考程序,可苦了咱,一上来就是一大堆的共同体,谁记得了啊,看了这个就忘了那个,到头来和看书好像一个效果。貌似很复杂很庞大的USB驱动,呵呵,我们不能一次性消化你,我就肢解了你再消化!那么第一个软件程序就来个最简单的(圈圈都给我们写好了程序了,还愁什么),对,就读取D12的ID值。
先了解下什么是ID(特权同学也是现学现卖,不好意思了):
我也不是弄得特别懂,反正最后读出来的ID=0x1012那就对了。
还得做个说明,我用的不是圈圈的USB板子,外围电路搭的也不一样,而是如笔记一里把D12做外部RAM扩展用了。另外,由于手头串口线恩多就是没有一条合适的,所以通过串口精灵显示的部分就简单的改由1602LCD显示ID值了。但是基本的思路都是相通的,要的就是这个!
贴个主程序:
[color=] ///////////////////////////////////////////////
[color=] //函数:main
[color=] //说明:主程序
[color=] //入口:无
[color=] //返回:无
[color=] ///////////////////////////////////////////////
[color=] void main(void)
[color=] {
[color=] init_lcd1602(); //初始化lcd1602
[color=] while(1)
[color=] {
[color=] display_id(read_d12_id()); //读取并显示ID值
[color=] }
[color=] }
[color=] 主程序一贴就知道这个实验会是超级简单(入门嘛呵呵)。重点是来看USB的读写指令数据部分的驱动程序。
[color=] 先看宏定义:
[color=] /*D12寄存器的地址分配*/
[color=] /*xdata ----> 可寻址片外ram (64k地址范围:0000H-FFFFH)*/
[color=] #define D12_DATA 0xEFF0 //偶数是数据地址
[color=] #define D12_COMMAND 0xEFF1 //奇数是命令地址
[color=] 上面为什么如此定义呢,因为笔记一里提到过,D12是被做外部RAM扩展了,P0口接的是D12的8bit数据端口,而CS_N被接到了P2.4口,所以寻址时CS_N一定必须为低,也即P2=EF,P2和P1就构成了外部RAM的地址。
[color=] ///////////////////////////////////////////////
[color=] //函数:write_d12
[color=] //说明:把数据或者命令送入D12
[color=] //入口:uint addr:送入D12的地址 D12_DATA或者D12_COMMAND
[color=] // uchar dat:送入D12的数据或者指令
[color=] //返回:无
[color=] ///////////////////////////////////////////////
[color=] void write_d12(uint addr, uchar dat)
[color=] {
[color=] *((uchar xdata *) addr) = dat;
[color=] //addr就是外部RAM的地址,把dat赋给这个地址即可
[color=] }
[color=] ///////////////////////////////////////////////
[color=] //函数:read_d12
[color=] //说明:从D12读出数据
[color=] //入口:uint addr:送入D12的地址
[color=] //返回:uchar *addr:返回一字节数据
[color=] ///////////////////////////////////////////////
[color=] uchar read_d12(uint addr)
[color=] {
[color=] return *((uchar xdata *) addr);
[color=] //返回addr这个外部RAM上的数据,addr只能是D12_DATA
[color=] }
[color=] 再来看读取ID这个程序是如何实现的:
[color=] ///////////////////////////////////////////////
[color=] //函数:read_d12_id
[color=] //说明:从D12读出其ID
[color=] //入口:无
[color=] //返回:uint id:USB的ID值
[color=] ///////////////////////////////////////////////
[color=] uint read_d12_id(void)
[color=] {
[color=] uchar idtem1=0,idtem2=0;
[color=] uint id="0";
[color=] write_d12(D12_COMMAND,0xfd); //发送读取ID的指令
[color=] idtem1 = read_d12(D12_DATA); //读第一个字节
[color=] idtem2 = read_d12(D12_DATA); //读第二个字节
[color=] id = idtem1+(idtem2*256); //把连个字节赋给一个uint型变量
[color=] return id; //返回读出的ID值
[color=] }
显示效果:
挺简单的程序,但是在这个程序中,可以明白单片机是如何往D12写指令,然后紧跟着再读或者写数据。在这个基础上,要实现一个完整的USB通讯,还要继续在写指令和读写数据上做文章,在对D12初始化后,重点是在于读取D12中断寄存器然后对其进行相应的操作。
先了解下什么是ID(特权同学也是现学现卖,不好意思了):
我也不是弄得特别懂,反正最后读出来的ID=0x1012那就对了。
还得做个说明,我用的不是圈圈的USB板子,外围电路搭的也不一样,而是如笔记一里把D12做外部RAM扩展用了。另外,由于手头串口线恩多就是没有一条合适的,所以通过串口精灵显示的部分就简单的改由1602LCD显示ID值了。但是基本的思路都是相通的,要的就是这个!
贴个主程序:
[color=] ///////////////////////////////////////////////
[color=] //函数:main
[color=] //说明:主程序
[color=] //入口:无
[color=] //返回:无
[color=] ///////////////////////////////////////////////
[color=] void main(void)
[color=] {
[color=] init_lcd1602(); //初始化lcd1602
[color=] while(1)
[color=] {
[color=] display_id(read_d12_id()); //读取并显示ID值
[color=] }
[color=] }
[color=] 主程序一贴就知道这个实验会是超级简单(入门嘛呵呵)。重点是来看USB的读写指令数据部分的驱动程序。
[color=] 先看宏定义:
[color=] /*D12寄存器的地址分配*/
[color=] /*xdata ----> 可寻址片外ram (64k地址范围:0000H-FFFFH)*/
[color=] #define D12_DATA 0xEFF0 //偶数是数据地址
[color=] #define D12_COMMAND 0xEFF1 //奇数是命令地址
[color=] 上面为什么如此定义呢,因为笔记一里提到过,D12是被做外部RAM扩展了,P0口接的是D12的8bit数据端口,而CS_N被接到了P2.4口,所以寻址时CS_N一定必须为低,也即P2=EF,P2和P1就构成了外部RAM的地址。
[color=] ///////////////////////////////////////////////
[color=] //函数:write_d12
[color=] //说明:把数据或者命令送入D12
[color=] //入口:uint addr:送入D12的地址 D12_DATA或者D12_COMMAND
[color=] // uchar dat:送入D12的数据或者指令
[color=] //返回:无
[color=] ///////////////////////////////////////////////
[color=] void write_d12(uint addr, uchar dat)
[color=] {
[color=] *((uchar xdata *) addr) = dat;
[color=] //addr就是外部RAM的地址,把dat赋给这个地址即可
[color=] }
[color=] ///////////////////////////////////////////////
[color=] //函数:read_d12
[color=] //说明:从D12读出数据
[color=] //入口:uint addr:送入D12的地址
[color=] //返回:uchar *addr:返回一字节数据
[color=] ///////////////////////////////////////////////
[color=] uchar read_d12(uint addr)
[color=] {
[color=] return *((uchar xdata *) addr);
[color=] //返回addr这个外部RAM上的数据,addr只能是D12_DATA
[color=] }
[color=] 再来看读取ID这个程序是如何实现的:
[color=] ///////////////////////////////////////////////
[color=] //函数:read_d12_id
[color=] //说明:从D12读出其ID
[color=] //入口:无
[color=] //返回:uint id:USB的ID值
[color=] ///////////////////////////////////////////////
[color=] uint read_d12_id(void)
[color=] {
[color=] uchar idtem1=0,idtem2=0;
[color=] uint id="0";
[color=] write_d12(D12_COMMAND,0xfd); //发送读取ID的指令
[color=] idtem1 = read_d12(D12_DATA); //读第一个字节
[color=] idtem2 = read_d12(D12_DATA); //读第二个字节
[color=] id = idtem1+(idtem2*256); //把连个字节赋给一个uint型变量
[color=] return id; //返回读出的ID值
[color=] }
显示效果:
挺简单的程序,但是在这个程序中,可以明白单片机是如何往D12写指令,然后紧跟着再读或者写数据。在这个基础上,要实现一个完整的USB通讯,还要继续在写指令和读写数据上做文章,在对D12初始化后,重点是在于读取D12中断寄存器然后对其进行相应的操作。
- 实现WUSB设备控制器的设计考虑因素(09-12)
- 基于USB2.0的高速无线数传接收设备的数据接收存储方法(09-09)
- 四种短距离无线监控解决方案的性能对比(09-16)
- Wibree:一个可供选择的新无线联网技术(11-07)
- TI 单芯片手机多媒体电话解决方案(12-01)
- 蓝牙技术硬件实现模式分析(01-11)