背景

需求为实现一个键盘产品,于是将C8051F340作为主控制器。本篇记录C8051F340USB控制器相关知识点,阅读本篇文章需要读者具有最基本的USB相关知识。

正文

  1. C8051F340结构

    C8051F340,以下简称F340,为silicon公司出品的8位单片机,具有USB接口,可支持USB全速/低速两种模式,USB功能控制器包括一个串行接口引擎(SIE),一个USB收发器,1k FIFO块,该控制器物理层遵循USB2.0通信协议,架构图如下:



    此处可以将USB看做一个独立于F340的外设, F340通过USB控制器提供的寄存器来控制USB控制器,其内部共含有4个物理端点,端点0可同时含有IN/OUT双向通道,端点1-端点3为单向通道,但可将对应的3个端点模拟为双向通道,只需将对应端点的FIFO部分配置为两部分——IN/OUT,在USB运行中,改变对应方向寄存器即可。

    F340只能作为USB从设备。

  2. C8051F340之USB寄存器读写方式

    USB所有的寄存器都通过两组特殊功能寄存器(SFR)访问:

    USB0 Address(USB0ADR):对应的要读写寄存器的地址;

    USB0 Data(USB0DAT):对应寄存器读或写的数据。

    即先将要访问的寄存器地址写入USB0ADR,下一步操作USB0DAT则完成对对应寄存器读/写操作,对应读写宏定义如下:

#define POLL_READ_BYTE(addr, target) while(USB0ADR & 0x80); \
READ_BYTE(addr, target);
#define READ_BYTE(addr, target) USB0ADR = (0x80 | addr); \
while (USB0ADR & 0x80); target = USB0DAT
#define POLL_WRITE_BYTE(addr, data) while(USB0ADR & 0x80);  \
WRITE_BYTE(addr, data);
#define WRITE_BYTE(addr, data) USB0ADR = (addr); USB0DAT = data;
  1. C8051F340 USB时钟配置

    USB可通过寄存器USB0XCN配置USB为全速/低速模式。当选择为低速模式时,USB0的时钟必须为6MHZ,当工作在全速模式时,USB0必须工作在48MHZ,时钟的配置方法在另一篇博客Silicon C8051F340之时钟系统中已详述。注意配置CLKREC(Clock Recovery Control)寄存器,Clock Recovery circuitry的作用是用来将USB数据流与控制器内部时钟相同步,使USB控制器能准确读取到USB主机输入的USB数据流,配置方法文档内已说的很明白,不再重复。以下为配置USB为全速模式的示例代码:
void USB0_Init (void)
{
POLL_WRITE_BYTE (POWER, 0x08); // Force Asynchronous USB Reset
POLL_WRITE_BYTE (IN1IE, 0x07); // Enable Endpoint 0-1 in interrupts
POLL_WRITE_BYTE (OUT1IE,0x07); // Enable Endpoint 0-1 out interrupts
POLL_WRITE_BYTE (CMIE, 0x07); // Enable Reset, Resume, and Suspend interrupts
USB0XCN = 0xE0; // Enable transceiver; select full speed
POLL_WRITE_BYTE (CLKREC,0x89); // Enable clock recovery,
// single-step mode disabled
EIE1 |= 0x02; // Enable USB0 Interrupts
// Enable USB0 by clearing the USB
POLL_WRITE_BYTE (POWER, 0x01); // Inhibit Bit and enable suspend
// detection
}
  1. C8051F340 USB中断

    作为一个用户(单片机的编程者),在USB0中断中,我们只需要关心3大类中断寄存器即可,CMINT(Common interrupt)(公共中断寄存器),IN1INT(输入端点中断寄存器),OUT1INT(输出端点中断寄存器)。USB的通信协议规定,端点0通常用来传递配置信息,其他端点根据端点类型(大容量或是中断或是同步)来传递不同的端点数据,USB通信细节本篇不再赘述,会在博客USB通信详解系列中详述。以下贴出USB0中断处理代码,会更加直观些:
void Usb_ISR (void) interrupt 8        // USB中断入口
{ unsigned char bCommon, bIn, bOut;
POLL_READ_BYTE (CMINT, bCommon); // USB0公共中断寄存器
POLL_READ_BYTE (IN1INT, bIn); // USB0输入端点中断寄存器
POLL_READ_BYTE (OUT1INT, bOut); // USB0输出端点中断寄存器
{
if (bCommon & rbRSUINT) { // 恢复
Usb_Resume ();
}
if (bCommon & rbRSTINT) { // 复位
Usb_Reset ();
}
if (bCommon & rbSUSINT) { // 挂起
Usb_Suspend ();
}
if (bIn & rbEP0) { // 端点0中断处理
Handle_Control ();
}
if (bIn & rbIN1) { // 端点1输入中断处理
Handle_In1 ();
}
if (bOut & rbOUT1) { // 端点1输出中断处理
Handle_Out1 ();
}
}
}

从以上代码可以看出,当有数据来或是需要写的时候,使能了对应中断,则SIE即会产生相关中断,通知MCU来处理对应的USB数据。具体如何处理对应的数据会在博客USB通信详解系列中详述。

至此,记录完毕。

参考链接:

C8051F340数据手册。

记录时间:2017-4-6

记录地点:深圳WZ

C8051F340之USB简介的更多相关文章

  1. 嵌入式开发之uart---rs232 和rs485 和rj45和usb简介

    (1) profilebus和can(control控制器局域网)和hub(集线器) (uart)通用异步传输 rs232: ibm 提出的,两根线,按位bit传输,是端到端的单信号电平模式,理论上有 ...

  2. linux usb简介

    参考书:<linux device drivers>.<usb 2.0规范> <usb3.1规范><usb白皮书> 以linux为例来说明usb系统. ...

  3. Linux下使用USB模拟ACM串口设备

    这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解. 1. USB 简介 USB 是 Universal Serial Bus 的缩写,从字面上看,就是通用串行总线的意思.从物理上看,其 ...

  4. 总线接口与计算机通信(四)USB外部总线(初级认识)

    USB简介   USB是英文Universal Serial BUS(通用串行总线)的缩写,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯,是应用在PC领域的接口技术.USB接口支持设备的即插 ...

  5. Linux驱动之USB(个人)

                              USB概述 <USB简介> a:背景 USB是Universal Serial Bus的缩写,是一种全新的,双向同步传输的,支持热插拔的 ...

  6. Linux下使用USB模拟ACM串口设备【转】

    本文转载自:https://www.cnblogs.com/pied/p/4549614.html 这个想法之前就在脑袋里有过,最近公司产品要用到,所以多做了些了解. 1. USB 简介 USB 是 ...

  7. USB原理简单叙述

    USB简介: USB的几种版本: 1. USB 1.0:速度 1.5Mb/s 2. USB 1.1:速度 12Mb/s 3. USB 2.0:速度 60MbB/s 4. USB 3.0:速度 640M ...

  8. USB Loader使用心得之游戏名称、简介、背景音乐

    我在<WAD独立安装版USB Loader的下载和安装>(链接:http://www.cnblogs.com/duxiuxing/p/4255124.html)开头提到:“任何版本的USB ...

  9. VC++ 6.0 C8051F340 USB 通信 CAN 数据解析

    // HelloWorld.cpp : Defines the entry point for the console application. // /*********************** ...

随机推荐

  1. [P2526][SHOI2001]小狗散步

    Link: P2526 传送门 Solution: 一道提示非常到位的题目 题面中强调了在两个路径相邻点间只能再去至多一个点,且每个点只计算一次贡献 于是明显可以将原题看作询问在两个不相交点集间最多能 ...

  2. 【状压dp】Most Powerful

    [ZOJ3471]Most Powerful Time Limit: 2 Seconds      Memory Limit: 65536 KB Recently, researchers on Ma ...

  3. 【欧拉回路】Gym - 101411C - Courier's Route

    每个城市有4个城门,每个城门会发出唯一一条边去别的城市的城门.问你能否从城市1出发,经过每个城门恰好一次,再回到城市1. 每个城市的度数都是4,必然存在欧拉回路(如果连通).欧拉回路显然是一个合法解. ...

  4. Android中Acition和Category常量表

    Action Action常量 对应字符串 简单说明 ACTION_MAIN android.intent.action.MAIN 应用程序入口 ACTION_VIEW android.intent. ...

  5. 初识Ant-Design

    设计价值观 Ant-Design在设计方面,存在两个大的价值观,自然和确定.自然即顺其自然,在顺应用户的自我感知和行为方式来开发更自然的产品.确定即探索设计规律,并将其抽象成对象,减少设计者的主观干扰 ...

  6. Visual Studio Code 安装 RUST

    1.下载RUST源码 https://static.rust-lang.org/dist/rustc-1.18.0-src.tar.gz ,解压到C盘   C:\rustc-1.18.0-src 2. ...

  7. Unicode中的BOM

    BOM简述 BOM是byte order mark的缩写,在UTF-16和UTF-32中需要使用BOM来区分字节的顺序,因为我们目前的CPU有两种系列,一种是大端模式,一种是小端模式(我们常用的电脑手 ...

  8. IngressController的session stick问题

    周末爬坑,IngressController恢复因为镜像下载和版本问题折腾一下午,晚上终于折腾出个眉目. 首先,在Kubernetes的service中是可以设置Session Affinity的.例 ...

  9. React个人学习笔记

    元素渲染 通过 ReactDOM.render() 方法渲染页面, 可以使用 ES6 class 来定义一个组件: 如何解析HTMl里面的空格: 1. 使用空格的 unicod 编码 : \u0020 ...

  10. OIT

    https://matthewwellings.com/blog/depth-peeling-order-independent-transparency-in-vulkan/ depth peeli ...