参考:
书籍,《圈圈教你玩USB》 
 C8051F单片机快速入门:http://www.waveshare.net/Left_Column/C8051F_Application_Notes.htm
 
《1》USB器件最底层的驱动编写;
 
C8051F320.H  C8051F320的定义
 
F32x_USB_Register.h
USB固件。包括所有的USB核心寄存器地址,寄存器访问宏,和寄存器的位掩码
 
USB.H 8051F系列专用 VID PID  USB_GetOutData()HID_SendData()

 
 
 《2》11个标准请求函数的编写;
 
USB_Request.H
此文件包含USB请求的定义,它是不相关的单片机类型,对应USB协议2.0
 
USB.c
端点状态、USB device状态、SETUP数据包
 
//功能:发送STALL信号,原因是收到了错误的条件或不希望的传输请求。
void Force_Stall(void)
 

//功能:获取状态,可能有三种请求:设备状态,接口状态,端点状态

void Get_Status(void)  
 

void Clear_Feature()                            
{

 
void Set_Address(void)   
 
void Get_Descriptor(void)   
 
void Get_Configuration(void)   
 
void Set_Configuration(void) 
 
void Get_Interface(void)     
 
void Set_Interface(void) 
 
void    USB_Enable( unsigned char sw)   
  《3》6个HID类请求函数的编写;(此6个函数很简单)
USB.c
 HID_SendData

  《4》USB中断部分的编写,可用查询或中断法,根据D12的中断寄存器的值,去调用11个标准请求函数;
 
调用11个标准请求函数,在 USB.c    void USB0_ISR(void) interrupt INTERRUPT_USB0 //Top-level USB ISR
只和51芯片有关。不用改动
这里根据接收到的值,来发送报告。
 
int main( void )
{
    INT8U btmp;
     Clock_Init( );
     P1 &= 0xF0; P1MDOUT |= 0x0F;
     P2 &= 0xF9; P2MDOUT |= 0x06;
     XBR1 |= ( 1<<6 );
     USB_Init( USB_ENABLE );
     EA = 1;
     while( 1 )
     {
         for( btmp = 0; btmp < 4; btmp ++ )
         {
             MouseData[btmp] = 0;
         }
         btmp = 1;
         switch( KeyScan( ) )     //K6 is not used
         {
             case K1_PRESS://left button
                 MouseData[0] = 1;
                 break;
             case K2_PRESS://wheel front
                 MouseData[3] = 2;
                 break;
             case K3_PRESS://Right press
                 MouseData[0] = 2;
                 break;
             case K4_PRESS://middle press
                 MouseData[0] = 4;
                 break;
             case K5_PRESS://wheel back
                 MouseData[3] = -2;
                 break;
             case K1_RELEASE:
             case K3_RELEASE:
             case K4_RELEASE:
                 break;
             default:
                 btmp = 0;
                 break;
         }
         if( btmp )
         {
             HID_SendData( (INT8U *)MouseData, 4 );
         }
     }
     return 0;
}

  《5》编写描述符;键盘要用到的描述符包括:1,设备描述符,2,配置描述符,3,接口描述符,4,HID描述符,5,端点描述符,6,报告描述符,7,字符串描述符。其中4,6为HID类专有的描述符,7是可选的。
USB_HID_Descriptor.c  
DeviceDesc
ReportDesc[]
String0Desc[S]等

USB.c不用动
USB.H 8051F系列专用 
VID PID
#define    EP1_PACKET_SIZE    8    //buffer size of endpoint 1 
 
USB_HID_Descriptor.h    
#define  REPORT_LENGTH  45 报告描述符长度
 
USB_HID_Descriptor.c  
描述符内容根据聚集体需要改

 
 
关键字:MCU选型 USB
参考PDF《C8051F320 在USB 设计中的应用》
1,选型

对于USB接口的设计,如非扩展之用,选用带有MCU的USB控制器当然是设计师们的首选,因为这样不仅可以大大简化硬件电路、减小外设体积,而且还可以提高产品的可靠性。

 
由于利用C8051F320该芯片进行设计时可以不需要任何外部元件(包括电阻和晶振),因而是小型USB应用的理想选择
 
2,C8051F320的主要特点,符合需求
     A:   用于程序空间和运行空间:内部集成有2304 Byte RAM和16k Byte的flash存储器
      全速的USB 2.0功能控制器
      内部集成了USB接口的数据收发器,设计中无需外部上拉电阻
    B:引脚功能
           D+、D-:USB电缆的USB  D+和USB D-连接端; 

VDD:2.7~3.6V片上电源输入端或片内电压调节器的3.3V输出端;
          REGIN:片内电压调节器的5V输入端

 
3,应用示例:
以C8051F320为核心设计了一个USB和CAN总线的接口转换模块
 
   3.1 USB 接口硬件电路设计:一是接口转换模块供电方式的选择,
由于整个模块的功率估计在3W左右,而USB总线的供电量只适合小功率模块的供电,最大也只有500mA,因此不能满足整个模块的安全供电,所以模块选择自供电模式
二是USB引脚的连接
 
    
 
3.2  固件的编写:
 
  主要目的是:当USB设备连接到主机上时,主机可以发现新设备,然后建立连接并完成数据传输任务,也就是能够让Windows正常检测和识别USB设备。因此在USB固件程序中,最重要的工作就是USB描述符的定义和USB传输中断的处理
USB2.0中的描述符:包括设备描述符、配置描述符、接口描述符、端点描述符等8种标准描述符和其它一些非标准描述符。
USB中断服务程序的编写: 
读取USB功能控制器的三个中断寄存器CMINT、IN1INT和OUT1INT来判断中断来源(USB复位中断、端点0
中断、端点1输入中断、端点2输出中断),然后根据不同的中断来源跳入相应的处理模块以进行不同的中断处理,并在处理完毕后返回
 
 
 

C8051逆向电阻屏:头儿拍脑袋说电阻屏IC好赚钱3块钱成本能卖20几块。,一个月不分昼夜逆向成功后头儿说电阻屏已经被市场淘汰请放弃治疗。的更多相关文章

  1. U盘插入电脑后图标是灰色的,打开提示“请将磁盘插入驱动器”

    问题描述: U盘插到win10电脑上后,U盘图标显示灰色,双击打开提示:请将磁盘插入驱动器,无法格式化,在U盘点右键/属性,显示为容量等为0. 解决办法如下: 1.首先要下载一个U盘芯片检测工具chi ...

  2. C#从入门到放弃治疗一:初探C#世界

    C#是一款高级的面向对象语言,运行于.NET framework之上的高级程序设计语言.其语言规范和,语法和java有着惊人的类似之处.所以如果你在学习C#之前有着java的基础,你将快速地入门.当然 ...

  3. 用Qt写了一个qq客户端,采用webqq协议,发出来和大家分享一下---大神请无视

    首先做以下声明: 本程序基于腾讯公司的webqq协议开发,所有相关版权归腾讯公司所有.此程序只用于技术交流和学习,不得用于其他方面. ---开发者:雨后星辰,转载请注明出处:http://www.cn ...

  4. NYOJ 994 海盗分金 逆向递推

    链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=994 题意: 有n个海盗劫得了窖藏的m块金子,并准备瓜分这些战利品.按照古老流传下来的分金法则 ...

  5. 安装loadrunner11,卸载360浏览器后提示“无效的应用程序路径!请检查应用程序是否存在!”

    我安装的loadrunner是11版本的,安装之前我的电脑上有安装了很多的浏览器,结果一开始录制脚本的时候,页面直接跳转到360浏览器上面了,但是显示正在录制的脚本为0个,于是就把360给卸载了,进行 ...

  6. 一个简单LINUX程序的逆向

    开始之前的准备: 反汇编:IDA 十六进制编辑器: Hexworkshop LINUX环境: KALI LINUX 调试: EDB (KALI自带的) 一个简单的动态追码, 大牛们就略过吧…… 用16 ...

  7. 一个图片上传的servlet,传到本地磁盘,要传到服务器请修改

    本来想写个controller,结果拦截器把图片拦住了,那就直接servlet public class UploadEamge extends HttpServlet{ /** * */ priva ...

  8. 【转】 怎么刷入BOOT.IMG(刷机后开机卡在第一屏的童鞋请注意)-------不错不错

    原文网址:http://bbs.gfan.com/android-3440837-1-1.html 之前呢,有好多机油问我关于刷机卡屏的问题,我解答了好多,但一一解答太费事了,在这里给大家发个贴吧.其 ...

  9. TP3.2 APP_DEBUG=false关闭调试后访问不了。页面错误!请稍后再试~

    在APP_DEBUG=true时是没问题的,在APP_DEBUG=false时才会出现找不到模板的问题.  经过排查可能是模板文件找不到问题,之前是这么写的. 改为这个就好了. ----------- ...

随机推荐

  1. Linux多线程同步方式

    当多个线程共享相同的内存时,需要确保每个线程看到一致的数据视图,当多个线程同时去修改这片内存时,就可能出现偏差,得到与预期不符合的值.为啥需要同步,一件事情逻辑上一定是有序的,即使在并发环境下:而操作 ...

  2. 看美剧英文字幕学英语的利器——“深蓝英文字幕助手”简介

    我从初中开始基本上就是一个英语很烂的人,数理化再好有什么用,工作了,结果发现数理化都没啥用,最有用的还是当年学的最烂的英语.于是在2011年年底开始了学习英语的课程,在学习的过程中,外教经常会放英剧美 ...

  3. 0001 Oracle数据库安装

    从这个月初开始学习Oracle,因为完全是零起步,就从Oracle的下载安装开始一点一点学起,今天把系统重新做了,就再安装了一遍Oracle11gR2,把安装过程记录一下: 一.安装Oracle数据库 ...

  4. Eclipse 工程Clear与build的作用

    由于eclipse的编译是基于时间戳的判断机制的.因此当你按build all的时候有些eclipse认为时间戳没有改变的类不会被编译.因此你可以先clean一下再编译.这个时候eclipse会将所有 ...

  5. 如何在Chrome39添加360抢票王插件

    前言: 版本:Chrome 39.0.2171.95 m CRX文件来源:ext.se.360.cn 本文地址:http://www.cnblogs.com/go2bed/p/4206714.html ...

  6. Neutron分析(4)—— neutron-dhcp-agent

    一.概述 neutron dhcp为租户网络提供DHCP服务,即IP地址动态分配,另外还会提供metadata请求服务. 3个主要的部件: DHCP agent scheduler:负责DHCP ag ...

  7. windows 10 & Office 2016 安装

    Office 2016 VOL版    http://blog.sina.com.cn/s/blog_470614a90102vtmc.html 专业版合集: magnet:?xt=urn:btih: ...

  8. hdu1251 统计难题

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=1251 题目: 统计难题 Time Limit: 4000/2000 MS (Java/Othe ...

  9. Android 之窗口小部件详解--App Widget

    Android 之窗口小部件详解--App Widget  版本号 说明 作者 日期  1.0  添加App Widge介绍和示例  Sky Wang 2013/06/27        1 App ...

  10. 输出国际象棋&&输出余弦曲线

    输出国际象棋棋盘 #include <stdio.h> #include <stdlib.h> #include <windows.h> int main(){ i ...