参考:
书籍,《圈圈教你玩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 Force_Stall(void)
void Get_Status(void)
{
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;
}
{
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输出中断),然后根据不同的中断来源跳入相应的处理模块以进行不同的中断处理,并在处理完毕后返回
中断、端点1输入中断、端点2输出中断),然后根据不同的中断来源跳入相应的处理模块以进行不同的中断处理,并在处理完毕后返回