注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

LINUX驱动学习——USB驱动(七)之USB鼠标(2)  

2011-01-17 15:21:28|  分类: USB系列 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

接上文,知道了基础的数据命令如何发送和读取,那么我们开始了正式的工作,CONNECT,按照PDIUSBD12的文档,发送设置模式的

命令是0xF3,所以UsbConnect函数里的D12WriteCommand函数写入的命令是D12_SET_MODE,而程序已经定义#define D12_SET_MODE 

0xF3,看D12的P6页的命令汇总中,有详细的说明。
 void D12WriteByte(uint8 Value)
 {
  D12SetDataAddr();
 D12ClrWr();
 D12SetPortOut();
 D12SetData(Value);
 D12SetWr();
 D12SetPortIn();
 }
这个函数我们不再做详细的讲解,和第一篇文章里提到的命令是一样的,不过是A0置高置低的问题罢了。
下面的两行代码通过这个函数输入了0x16和 0x47两个字段的命令,并进行了延时,我们重点讲一下这两个命令字。我们看D12的文档,在设置好0XF3后,其后的两个字段用来SET MODE,其中第一个字节是配置字节,第二个字节是时钟分频系数。其中具体的可以看书或文档,我们只谈第4位(第五个BIT位)的软连接控制,因为D12的VBUS和EOT_N复用,当其为0时,上拉电阻被断开,为1时,芯片才会正常工作,相当于重启一次呗,要不叫软连接控制位啊。第6和第7位,表示端点的配置,可以配置四种模式,正好对应D12文件中的0~3,这四种方法的优缺点文档上有,目前我不是太清楚实际应用中的区别,暂时不表述,以后如果有时间再补。但本次我们用的模式0,0X16表示0001 0110,然后再对应表看,可知道,软连接导通了上拉电阻。OK,前面的说法,VBUS置高,芯片可以正常使用了。延时作用讲过,飞过。
现在我们开始正常的USB通信过程,#define D12GetIntPin()   D12_INT,而#define D12_INT          P3_2(这里说明一下,sbit P3_2 = 0xB2;我们查STC52的手册,上面有特殊寄存器的地址,P3定义为0XB0,然后按位上增,详情看手册。)说明我们把中断的引脚定义在了51单片机的32引脚上(因为中断信号是漏极开路输出,需要补一个上拉电阻,但因为STC52自带,我们就省省心)。我们看数据手册,而INT0 和P32是共用的,他与D12的INT_N连接在一起,这样既可以软件查询,也可以使用中断。而D12的中断是低电平有效,也就是说当D12GetIntPin() 返回0时,肯定有一个中断产生了。然后我们就可以用命令字0xF4来读取中断寄存器的内容,从而判断是哪个端点索引(注意是端点索引,或者也可以说哪个端点,但必须带上输入或输出。)这就是这行代码 D12WriteCommand(READ_INTERRUPT_REGISTER),发送这个命令后,可以读两个字节的内容,第一个字节内容是端点和总线状态的中断,第二个字节只有一位有效,是和DMA有关,我们不考虑DMA,所以不读他,所以,然后我们只读InterruptSource = D12ReadByte();这个读我就不细讲了,和写一样的。我觉得我很唠叨了,很唐僧。

然后下来就是根据你的数据来判断执行的过程,这个就很简单了,我们准备下一回再说,写这个真得费脑子,不行就一边总结一边

弄新的滴吧,这样时间才够用。

  评论这张
 
阅读(811)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017