您的位置 首页 5G

USB笔记三:PDIUSBD12根本指令程序

经过特权的整理,以圈圈的程序代码为基础,结合周立功的《PDIUSBD12固件编程与驱动开发》一书,把D12的最底层的代码子程序做了较详细的注释和整理,PDIUSBD12的硬件提取层应该说才是真正意

  通过特权的收拾,以圈圈的程序代码为根底,结合周建功的《PDIUSBD12固件编程与驱动开发》一书,把D12的最底层的代码子程序做了较具体的注释和收拾,PDIUSBD12的硬件提取层应该说才是真实意思上的最底层,其次是指令层,这应该是USB编程入门的突破口,再有其它的操作无非都是根据这些根本的子程序进行的。以下的代码应该结合这个文档进行了解,请参阅附件http://share.eepw.com.cn/share/download/id/234488。(这个文档应该是周建功书上摘录的)

  #define USB_COMMAND_ADD 1

  //USB_A0=USB_COMMAND_ADD:总线指令操作

  #define USB_DATA_ADD 0

  //USB_A0=USB_DATA_ADD:总线数据操作

  /*********************PDIUSBD12硬件提取层********************/

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

  //函数:write_usb_command

  //阐明:写USB指令

  //进口:uchar usb_command:待写入的指令

  //回来:无

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

  void write_usb_command(uchar usb_command)

  {

  USB_A0=USB_COMMAND_ADD; //指令操作

  USB_DATA=usb_command;

  USB_WR=0;

  USB_WR=1;

  USB_DATA=0xFF;

  }

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

  //函数:write_a_usb_data

  //阐明:写一字节USB数据

  //进口:uchar usb_data:待写入的数据

  //回来:无

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

  void write_a_usb_data(uchar usb_data)

  {

  USB_A0=USB_DATA_ADD; //数据操作

  USB_DATA=usb_data;

  USB_WR=0;

  USB_WR=1;

  USB_DATA=0XFF;

  }

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

  //函数:read_a_usb_data

  //阐明:读一字节USB数据

  //进口:无

  //回来:uchar temp:从D12读出的数据

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

  uchar read_a_usb_data(void)

  {

  uchar temp;

  USB_A0=USB_DATA_ADD; //数据操作

  USB_RD=0;

  temp=USB_DATA;

  USB_RD=1;

  return temp;

  }

  /*********************PDIUSBD12硬件提取层********************/

  /***********************PDIUSBD12指令层**********************/

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

  //函数:set_usb_addr

  //阐明:设置USB地址/使能:指令为0xd0

  //进口:uchar addr:设置的新地址

  //回来:无

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

  void set_usb_addr(uchar addr)

  {

  write_usb_command(0xd0);

  write_a_usb_data(0x80|addr); //把bit8置高表明使能

  }

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

  //函数:set_endpoint_enable

  //阐明:设置端点使能:指令为0xd8

  //进口:无

  //回来:无

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

  void set_endpoint_enable(void)

  {

  write_usb_command(0xd8);

  write_a_usb_data(0x01);

  }

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

  //函数:set_mode

  //阐明:设置形式指令:指令为0xf3

  //进口:uchar bconfig:装备字节信息

  // uchar bclkdiv:时钟分频因数字节

  //回来:无

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

  void set_mode(uchar bconfig,uchar bclkdiv)

  {

  write_usb_command(0xf3);

  write_a_usb_data(bconfig);

  write_a_usb_data(bclkdiv);

  }

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

  //函数:set_dma

  //阐明:设置DMA指令:指令为0xfb

  //进口:uchar bmode:设置DMA字节

  //回来:无

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

  void set_dma(uchar bmode)

  {

  write_usb_command(0xfb);

  write_a_usb_data(bmode);

  }

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

  //函数:read_interrupt_register

  //阐明:读USB中止寄存器:指令为0xf4

  //进口:无

  //回来:uchar inter_reg:中止寄存器榜首字节

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

  uchar read_interrupt_register(void)

  {

  uchar inter_reg;

  uchar inter_reg2;

  write_usb_command(0xf4);

  inter_reg=read_a_usb_data(); //读榜首字节

  inter_reg2=read_a_usb_data(); //读第二字节

  return inter_reg; //回来榜首字节

  }

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

  //函数:select_endpoint

  //阐明:挑选端点:指令为0x00+endp

  // 该指令将内部指针初始化到挑选的缓冲区

  // 开始方位。

  //进口:uchar endp:挑选端点0-5

  //回来:uchar state:bit0–1表明缓冲区满,0表明缓冲区空

  // bit1–1表明端点处于中止状况

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

  uchar select_endpoint(uchar endp)

  {

  uchar state;

  write_usb_command(0x00+endp);

  state=read_a_usb_data();

  return state;

  }

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

  //函数:read_last_status

  //阐明:读取端点最终处理状况,指令为0x40+endp

  // 该指令一起复位中止寄存器中的相应位,

  // 并将状况清零,表明已读取。

  //进口:uchar endp:挑选端点0-5

  //回来:uchar read_a_usb_data():最终处理状况寄存器

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

  uchar read_last_status(uchar endp)

  {

  write_usb_command(0x40+endp);

  return read_a_usb_data();

  }

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

  //函数:set_endpoint_status

  //阐明:设置端点状况:指令为0x40+endp

  //进口:uchar endp:挑选端点0-5

  // uchar status:设置状况值,bit1-bit7为保存位

  // bit0=1–表明端点处于中止状况

  //回来:无

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

  void set_endpoint_status(uchar endp,uchar status)

  {

  write_usb_command(0x40+endp);

  write_a_usb_data(status);

  }

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

  //函数:send_resume

  //阐明:发送康复指令:指令为0xf6

  //进口:无

  //回来:无

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

  void send_resume(void)

  {

  write_usb_command(0xf6);

  }

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

  //函数:read_endpoint_status

  //阐明:读端点状况:指令为0x80+endp

  //进口:uchar endp:挑选端点0-5

  //回来:uchar read_a_usb_data():当时端点状况信息

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

  uchar read_endpoint_status(uchar endp)

  {

  write_usb_command(0x80+endp);

  return read_a_usb_data();

  }

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

  //函数:clear_buffer

  //阐明:缓冲区清零:指令为0xf2

  //进口:uchar endp:挑选端点0-5

  //回来:uchar read_a_usb_data():当时端点状况信息

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

  void clear_buffer(void)

  {

  write_usb_command(0xf2);

  }

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

  //函数:validate_buffer

  //阐明:使缓冲区有用:指令为0xfa

  //进口:无

  //回来:无

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

  void validate_buffer(void)

  {

  write_usb_command(0xfa);

  }

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

  //函数:

  //阐明:读缓冲区:指令为0xf0

  //进口:uchar endp:挑选端点

  // uchar len:缓冲区数据长度

  // uchar * buff:缓冲数据数组

  //回来:uchar j:缓冲数据字节数

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

  uchar read_endpoint_buff(uchar endp,uchar len,uchar * buff)

  {

  uchar i,j;

  read_last_status(endp); //读endp端点最终处理状况寄存器,一起复位中止寄存器的相应位

  if(!(select_endpoint(endp)&0x01)) //端点endp缓冲区为空则回来

  {

  return 0;

  }

  if((read_endpoint_status(endp)&0x60)!=0x60) //两个缓冲区没有都满,才干清中止

  {

  read_last_status(endp); //清中止

  }

  write_usb_command(0xf0); //读缓冲区指令,读nB

  read_a_usb_data(); //字节1,保存,可为恣意值

  j=read_a_usb_data(); //字节2,数据字节的长度

  if(j>len) //数据字节长度最大130B

  {

  j=len;

  }

  for(i=0;i

  {

  USB_RD=0;

  *(buff+i)=USB_DATA;

  USB_RD=1;

  }

  clear_buffer(); //清缓冲区

  return j;

  }

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

  //函数:

  //阐明:写缓冲区:指令为0xf0

  //进口:uchar endp:挑选端点

  // uchar len:缓冲区数据长度

  // uchar * buff:缓冲数据数组

  //回来:uchar len:缓冲数据长度(最大130B)

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

  uchar write_endpoint_buff(uchar endp,uchar len,uchar * buff)

  {

  uchar i;

  read_last_status(endp); //读endp端点最终处理状况寄存器,一起复位中止寄存器的相应位

  select_endpoint(endp); //挑选端点

  write_usb_command(0xf0); //写缓冲区指令,写nB

  write_a_usb_data(0); //第1字节保存,总为0

  write_a_usb_data(len); //第2字节,写入数据长度

  for(i=0;i

  {

  USB_DATA=*(buff+i);

  USB_WR=0;

  USB_WR=1;

  }

  USB_DATA=0xFF;

  validate_buffer(); //使缓冲区有用

  return len;

  }

  /***********************PDIUSBD12指令层**********************/

树莓派文章专题:树莓派是什么?你不知道树莓派的常识和使用

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

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

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

微信扫一扫关注我们

返回顶部