完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
先了解下什么是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 ; [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中断寄存器然后对其进行相应的操作。 |
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2549 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2333 浏览 5 评论
3165 浏览 3 评论
2806 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2763 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
612浏览 1评论
859浏览 0评论
974浏览 0评论
626浏览 0评论
453浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 17:05 , Processed in 1.224541 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号