带宽基本概念:从入门到精通

带宽到底是个什么东西?

做嵌入式通信,你肯定绕不开“带宽”这个词。我当年带新人时,总有人问:“带宽是不是就等于频率?” 其实差远了。

带宽,说白了就是一条数据传输通道在单位时间内能运送的**数据量**。就好比水管——频率是水龙头开关的速度,带宽才是水管的粗细和流量。我自己调试过一款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

下面这张表你看着记,考试和调板子都用得上:

单位全称换算关系(十进制)
bpsbits per second基本单位
kbpskilobits per second1 kbps = 1000 bps
Mbpsmegabits per second1 Mbps = 1000 kbps = 1,000,000 bps
KB/skilobytes per second1 KB/s = 8000 bps
MB/smegabytes per second1 MB/s = 8,000,000 bps = 8 Mbps
我个人习惯: 所有计算都先统一到 bps。比如你看到“2 MB/s”,心里马上转过弯来 —— 那是 16 Mbps,否则你配SPI时钟一定会配错。

换算公式就那么几条:

  • 比特 → 字节:除以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时钟,应该能更有底气了。

带宽概念核心框架 带宽 Bandwidth 传输带宽定义 数据吞吐率 (Mbps) 单位换算体系 bps ↔ KB/s Mbps ↔ MB/s 理论值 vs 实际值 三大概念相互关联,换算时务必统一到 bps

避坑指南:我曾经掉过的坑

讲几个真实翻车现场,你遇到了能直接拿去用。

  • 坑一: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%余量。
切记: 任何芯片手册上的“最大吞吐率”都是理想波形下的理论值。实际应用时,至少打八折。如果你要匹配DMA和SPI时钟,永远用 实际吞吐率 而不是理论最大值。

好了,这一章的核心就是这四句话:带宽≠频率、吞吐率是真实速度、单位换算要统一到bps、永远留余量。你把这些刻进脑子里,后面配DMA和SPI时钟的时候基本不会翻车。