USB时钟为什么是48MHz
在学习2440的USB配置时钟中,发现它的时钟需要设置成48MHz固定的,这个我就来兴趣了,为什么这里面USB的时钟一定要是48M呢?在网上找了众多文章,都是讲解如何配置2440的MPLL和UPLL,根据外部晶振来设置不同的参数,先配置UPLLCON,再配置MPLLCON,

但我需要的不是这个,是它背后的原因。于是,开始了找寻答案的旅程。
先还是从datasheet中找:

对UPLLCON的配置,都是采用固定值:

从下面来时钟配置来看:

UPLL实际产生固定96MHZ的频率,二分频给USB主机使用,一分频给Camera采样使用
从寄存器默认值设置来看:
从datasheet上面种种介绍来看,S3C2440内部的USB控制器模块时钟使用的频率固定为 48MHz。
从6410上面的USB Host时钟设置上来看,也是如此:

这里,问题就来了,为什么要设置成固定的48MHz,这个数据对于USB传输来说,有什么意义?
通过网上了解USB速度相关的知识:
USB 1.1
低速(low-speed) 传输速率 1.5Mbps
全速(full-speed) 传输速率 12Mbps
标准脉冲时钟为12MHz,总线脉冲时钟为1KHz,也就是说,每个1ms,USB主机控制器在USB线缆上产生一个时钟脉冲序列,这个为帧开始数据包(SOF)
USB 2.0 在USB 1.1 的基础上,向下兼容,并增加高速模式
USB 2.0
低速(low-speed) 传输速率 1.5Mbps
全速(full-speed) 传输速率 12Mbps
高速 (high-speed)传输速率 480Mbps
USB 3.0 在USB2.0的基础上,向下兼容,增加了超高速模式(super speed)
USB 3.0
低速(low-speed) 传输速率 1.5Mbps
全速(full-speed) 传输速率 12Mbps
高速 (high-speed)传输速率 480Mbps
超高速(Super Speed)传输速度4.8Gbps
上述速度均为理论传输最高数值,单位为Mbps,如需化为MB/S,需要除以8. 在实际使用中,需要兼容其他系统的速度,往往会打个8折。
上网翻来USB2.0规范,在 5.12.2 节 USB Clock Model 和7.1.17 Cable Attenuation l一节中,发现一点有用的东西,先摘录如下:
USB的时钟模型:

UBS的电缆衰减:

结合USB传输规定,线缆的最大长度不超过5米,USB级联不能超过5级。同时,在一个USB系统中,USB device 和USB Hub总数不能超过127个,所有的USB device都连接在USB Hub。一个USB HOST总是与一个USB Root Hub相连,USB Hub为每个端口提供 100mA电流供设备使用。
另外,这里也寻找了一些答案:
http://www.edaboard.com/thread91063.html
USB控制器接收部分的数字部分工作在60MHz,8位模式。当接收到高达480Mbps的数据时,为了从数据线中恢复时钟信号和数据信号,USB使用Delay-locked loop(DLL)来产生采样时钟,将采样的数据保存到弹性缓冲器中,弹性缓冲器再将数据以60MHz的时钟导出到数字部分。
最后在这里找到一些有用的回答:http://electronicdesign.com/boards/480-mbitss-signal-integrity-becomes-issue-usb-20-designs

最后总结一下:
USB总线时钟设置为48MHz,一部分是传输电缆本身的衰减因素,另一部分,为了兼容USB1.1的低速传输,还有的就是规范上的一些限制吧。
目前,就网上的资料就找到这么多,在找寻答案的同时,发现如下一些好文章,现在给出来:
这篇文章里面,介绍了USB Connector相关知识:
http://www.beyondlogic.org/usbnutshell/usb2.shtml
这篇文章总结了常用总线频率,很不错。
USB时钟为什么是48MHz的更多相关文章
- Cotex-M3内核STM32F10XX系列时钟及其配置方法
一.背景 最近做个项目,需要使用STM32,还是以前一样的观点,时钟就是MCU心脏,供血即时钟频率输出,想要弄明白一个MCU,时钟是一个非常好的切入点.言归正传,网上已经有太多大神详述过STM32的详 ...
- stm32f407以太网及USB OTG快速开发
stm32f407以太网及USB OTG快速开发 引言 想要快速完成网络协议栈和USB OTG功能,使用ST自家的工具STM32CubMx再好不过的了.如果你还不会使用,别着急下面我会一步一步的用图片 ...
- c8051f320学习,单片机不外乎时钟、IO、串口、USB等外设用法
时钟 IO(输入.输出,如何配置) IO 数字和模拟资源可以通过25个I/O 引脚(C805 1F3 2 0 ),每个端口引脚都可以被定义为 通用I/O(GPIO)或 0 模拟输入 所有端口I ...
- [转] STM32各种时钟的区别
[原创]:http://m.oschina.net/blog/129357 我在原创的基础又从另一位博主处引用了一些内容. 时钟系统是处理器的核心,所以在学习STM32所有外设之前,认真学习时钟系统是 ...
- STM32时钟理解
转载自 http://blog.sina.com.cn/s/blog_6ebd49350100q6xw.html STM32时钟理解 一.硬件上的连接问题 如果使用内部RC振荡器而不使用外部晶振,请按 ...
- Cotex-M3内核LPC17xx系列时钟及其配置方法
一.背景: 最近正在接手一个项目,核心芯片既是LPC17XX系列MCU,内核为ARM的Cotex-M3内核. 想要玩转一个MCU,就一定得搞定其时钟! 时钟对MCU而言,就好比人类的心脏.由其给AHB ...
- stm32时钟分析
转载自http://blog.chinaunix.net/uid-21658993-id-3129667.html 在STM32中,有五个时钟源,为HSI.HSE.LSI.LSE.PLL. 其实是 ...
- (六)STM32的时钟系统
在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL (1) HSI是高速内部时钟,RC振荡器,频率为8MHz: (2) HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外 ...
- linux 时钟源初步分析linux kernel 时钟框架详细介绍
初步概念: 看datasheet的关于时钟与定时器的部分, FCLK供给cpu, HCLK供给AHB总线设备(存储器控制器,中断控制器.LCD控制器.DMA.USB主机控制器等), PCLK供给APB ...
随机推荐
- centos 服务器配置(一) 之端口占用
1.查找被占用的端口 netstat -tln netstat -tln | grep 8060 netstat -tln 查看端口使用情况,而netstat -tln | grep 8060则是只查 ...
- 创建ORACLE JOB
oracle job简介 主要的使用情景 定时在后台执行相关操作:如每天晚上0点将一张表的数据保存到另一张表中,2:定时备份数据库等 熟化说万事开头难,这里我只简单记述一个创建一个简单的job 步骤如 ...
- Nop关键技术点概述
数据访问层 Nop.Data项目包含用于与数据库及其它数据存储交互的类和功能.Nop.Data类库帮助将数据访问逻辑和业务对象分离.Nop使用的是Entity Framework Code First ...
- mysql索引补充
索引补充 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引,会保存在额外的文件中. 2.索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列 ...
- 关键字提取算法之TF-IDF扫盲
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术.TF-IDF是一种统计方法,用以评估一字词对于一个文件集或 ...
- oc语言复制视频文件
void copyFile() { NSString *home=NSHomeDirectory(); NSString *path=[NSString stringWithFormat:@" ...
- [JavaEE] Hibernate OGM
Hibernate Object/Grid Mapper (OGM)这个项目能够为NoSQL数据库提供Java Persistence(JPA)支持.它复用了Hibernate Core引擎将实体持久 ...
- [Javascript] “||”和“&&”的灵活运用
引用URL : http://my249645546.iteye.com/blog/1553202 你是否看到过这样的代码:a=a||""; 可能javascript初学者会对此感 ...
- c#代码使用ResourceDictionary样式
对于ResourceDictionary样式代码: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006 ...
- page59-一种能够累加数据的ADT(可视化版本) [可用于数据挖掘可视化工具]
public class VisualAccumulator VisualAccumulator() 创建一个累加器 void addDataValue(double val) 添加一个新的数据值 d ...