您的位置 首页 知识

USB学习二:读取ID值

题记:熟悉了PDIUSBD12的硬件电路后,就应该进入USB的软件编程部分了。我想大家在初学USB时都会遇到和我一样的困惑:拿起USB协议的相关文档埋头苦看,看半天还是什么又枚举又配置的看是看了,

  题记:了解了PDIUSBD12的硬件电路后,就应该进入USB的软件编程部分了。我想咱们在初学USB时都会遇到和我相同的困惑:拿起USB协议的相关文档静心苦看,看半响仍是什么又枚举又装备的看是看了,可是回头来如同什么都不理解;理论不可咱就着手吧,可是一找参阅程序,可苦了咱,一上来便是一大堆的共同体,谁记得了啊,看了这个就忘了那个,到头来和看书如同一个作用。形似很杂乱很巨大的USB驱动,呵呵,咱们不能一次性消化你,我就肢解了你再消化!那么第一个软件程序就来个最简略的(圈圈都给咱们写好了程序了,还愁什么),对,就读取D12的ID值。

  先了解下什么是ID(特权同学也是现学现卖,不好意思了):

  

点击看大图

 

  我也不是弄得特别懂,横竖最终读出来的ID=0x1012那就对了。

  还得做个阐明,我用的不是圈圈的USB板子,外围电路搭的也不相同,而是如笔记一里把D12做外部RAM扩展用了。别的,由于手头串口线恩多便是没有一条适宜的,所以经过串口精灵显现的部分就简略的改由1602LCD显现ID值了。可是根本的思路都是相通的,要的便是这个!

  贴个主程序:

  ///////////////////////////////////////////////

  //函数:main

  //阐明:主程序

  //进口:无

  //回来:无

  ///////////////////////////////////////////////

  void main(void)

  {

  init_lcd1602(); //初始化lcd1602

  while(1)

  {

  display_id(read_d12_id()); //读取并显现ID值

  }

  }

  主程序一贴就知道这个试验会是超级简略(入门嘛呵呵)。重点是来看USB的读写指令数据部分的驱动程序。

  先看宏界说:

  /*D12寄存器的地址分配*/

  /*xdata —-> 可寻址片外ram (64k地址规模:0000H-FFFFH)*/

  #define D12_DATA 0xEFF0 //偶数是数据地址

  #define D12_COMMAND 0xEFF1 //奇数是指令地址

  上面为什么如此界说呢,由于笔记一里提到过,D12是被做外部RAM扩展了,P0口接的是D12的8bit数据端口,而CS_N被接到了P2.4口,所以寻址时CS_N必定有必要为低,也即P2=EF,P2和P1就构成了外部RAM的地址。

  ///////////////////////////////////////////////

  //函数:write_d12

  //阐明:把数据或许指令送入D12

  //进口:uint addr:送入D12的地址 D12_DATA或许D12_COMMAND

  // uchar dat:送入D12的数据或许指令

  //回来:无

  ///////////////////////////////////////////////

  void write_d12(uint addr, uchar dat)

  {

  *((uchar xdata *) addr) = dat;

  //addr便是外部RAM的地址,把dat赋给这个地址即可

  }

  ///////////////////////////////////////////////

  //函数:read_d12

  //阐明:从D12读出数据

  //进口:uint addr:送入D12的地址

  //回来:uchar *addr:回来一字节数据

  ///////////////////////////////////////////////

  uchar read_d12(uint addr)

  {

  return *((uchar xdata *) addr);

  //回来addr这个外部RAM上的数据,addr只能是D12_DATA

  }

  再来看读取ID这个程序是怎么完成的:

  ///////////////////////////////////////////////

  //函数:read_d12_id

  //阐明:从D12读出其ID

  //进口:无

  //回来:uint id:USB的ID值

  ///////////////////////////////////////////////

  uint read_d12_id(void)

  {

  uchar idtem1=0,idtem2=0;

  uint id="0";

  write_d12(D12_COMMAND,0xfd); //发送读取ID的指令

  idtem1 = read_d12(D12_DATA); //读第一个字节

  idtem2 = read_d12(D12_DATA); //读第二个字节

  id = idtem1+(idtem2*256); //把连个字节赋给一个uint型变量

  return id; //回来读出的ID值

  }

  显现作用:

  

点击看大图

 

  挺简略的程序,可是在这个程序中,能够理解单片机是怎么往D12写指令,然后紧跟着再读或许写数据。在这个基础上,要完成一个完好的USB通讯,还要持续在写指令和读写数据上做文章,在对D12初始化后,重点是在于读取D12中断寄存器然后对其进行相应的操作。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/117189.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部