带宽基本概念:从入门到精通
带宽到底是个什么东西?
做嵌入式通信,你肯定绕不开“带宽”这个词。我当年带新人时,总有人问:“带宽是不是就等于频率?” 其实差远了。
带宽,说白了就是一条数据传输通道在单位时间内能运送的**数据量**。就好比水管——频率是水龙头开关的速度,带宽才是水管的粗细和流量。我自己调试过一款SPI屏幕,明明时钟打到80MHz,画面还是卡顿,后来一查,DMA带宽根本喂不饱那条通道。所以带宽这个基本概念,搞不清楚后面全白搭。
数据吞吐率:你实际能跑多快
吞吐率(Throughput)才是你真正关心的指标。它跟带宽很像,但更“诚实”。
举个例子:你的SPI时钟是40MHz,理论上每个周期能传1位,那理论带宽就是40 Mbps。可你加上了片选延时、中断响应、协议开销……实际吞吐率往往只有30 Mbps左右。
我遇到过有人拿理论带宽去算DMA缓冲区,结果缓冲区溢出了一堆乱码。千万别这么干。
吞吐率常用的单位是 Mbps(兆比特每秒)。很多芯片手册里会标“最大吞吐率 xxx Mbps”,那个数字一般是指理想情况——你至少得打七折才算靠谱。
带宽单位换算:别掉进数字陷阱
搞通信最烦的就是单位换算。你猜我见过多少次把MB/s和Mbps搞混的?数都数不过来。有一次调`stm32`的SPI DMA,客户说“带宽要求5MB/s”,我按5Mbps配的时钟,结果跑起来帧率对不上,查了半天才发现他写的是MB/s,不是Mb/s……
记住这个铁律:
- 小写b = bit(位),通信传输的基本单位
- 大写B = Byte(字节),1 Byte = 8 bits
- k = 千,1 kbps = 1000 bps(注意不是1024!通信领域习惯用十进制)
- M = 兆,1 Mbps = 1000 kbps
下面这张表你看着记,考试和调板子都用得上:
| 单位 | 全称 | 换算关系(十进制) |
|---|---|---|
| bps | bits per second | 基本单位 |
| kbps | kilobits per second | 1 kbps = 1000 bps |
| Mbps | megabits per second | 1 Mbps = 1000 kbps = 1,000,000 bps |
| KB/s | kilobytes per second | 1 KB/s = 8000 bps |
| MB/s | megabytes per second | 1 MB/s = 8,000,000 bps = 8 Mbps |
换算公式就那么几条:
- 比特 → 字节:除以8
- 字节 → 比特:乘以8
- kbps → Mbps:除以1000
- KB/s → MB/s:除以1000
举个例子:你要传输一张 1 MB 的图片,要求在 100 ms 内传完。需要的带宽是多少?
- 数据量:1 MB = 1,000,000 字节(十进制)
- 时间:0.1 s
- 所需吞吐率:1,000,000 / 0.1 = 10,000,000 B/s = 10 MB/s
- 换算成比特:10 MB/s × 8 = 80 Mbps
所以你至少要配80 Mbps以上的接口。我建议你留20%余量,选100 Mbps左右。
为什么单位转换这么容易翻车?
因为标准不统一。SPI手册里写的是 Mbps,DMA控制器配置的是字节数,你写的软件里用的是 KB/s。三个单位混在一起,算错一步,板子就罢工。
我曾在项目里加了一个小工具——一个纯手工换算函数,每次配参数前先跑一遍:
def bandwidth_convert(value, from_unit, to_unit):
# 全部兜底到 bps
bps_map = {
'bps': 1,
'kbps': 1e3,
'Mbps': 1e6,
'KB/s': 8e3, # 1 KB/s = 8000 bps
'MB/s': 8e6,
}
bps_val = value * bps_map[from_unit]
result = bps_val / bps_map[to_unit]
return result
# 例:5 MB/s 等于多少 Mbps?
print(bandwidth_convert(5, 'MB/s', 'Mbps')) # 40.0
你看,5 MB/s 等于 40 Mbps —— 跟刚才公式对得上。这个小函数我用了好几年,换什么项目都没再算错。
一张图理清带宽知识脉络
下面这张图总结了带宽的三大支柱:定义、吞吐率、单位换算。你看完之后下次配DMA时钟,应该能更有底气了。
避坑指南:我曾经掉过的坑
讲几个真实翻车现场,你遇到了能直接拿去用。
- 坑一:SPI时钟频率当带宽用。 我一直强调,时钟频率(Hz)不等于带宽(bps)。SPI一般一个时钟传1位,所以40 MHz SPI的理论带宽是40 Mbps。但如果你传的是多帧协议或者有硬件流控,实际吞吐率会打折。我见过有人直接把时钟频率当成带宽去配DMA,结果DMA被撑爆。
- 坑二:MB/s 和 Mbps 混淆。 上面说过了,血的教训。我现在看任何文档,第一眼先看单位大小写。只要写“MB/s”我就自动×8。
- 坑三:忽略协议开销。 带宽不是你算出来的理论值。我调过一个SPI + DMA来传ADC采样,SPI时钟设了50 MHz,理论上能到50 Mbps,但ADC每次传输要加16位的无效头,实际速率只有40 Mbps。我一开始没算这个头,导致DMA缓冲区老欠载。后来我加了一个带宽余量系数——你自己算的时候,至少留20%余量。
好了,这一章的核心就是这四句话:带宽≠频率、吞吐率是真实速度、单位换算要统一到bps、永远留余量。你把这些刻进脑子里,后面配DMA和SPI时钟的时候基本不会翻车。