一个典型蓝牙控制器的基本结构如图,右上角处理器处理上层协议,并通过ahb的总线接口将命令与数据配置到reg和sram中。生成的串行bit数据送入左下modem。左边的radio为蓝牙收发的模拟电路,接受link控制的配置。
![570404d6db56f14403403270125f92d6.png](https://img-blog.csdnimg.cn/img_convert/570404d6db56f14403403270125f92d6.png)
以上结构中,除了跟cpu交互用到的bus interface, register,sram,还有另外很多模块,这里逐一解释一下功能。
这里最核心的模块是mem control,基本所有模块都连接它,这相当于一个仲裁器,允许多个部件按优先级访问sram,sram中的命令和数据,可以同时被cpu,包控制器,事件控制器,射频控制这些部件访问。
timing gen负责产生蓝牙对应的各种时序信号。包括1us 625us 312.5us的脉冲。其中1us对应着蓝牙每个符号的发送时长,也就是发送给modem的串行数据流,每个bit发送1us。625us对应slot时长,发送广播包的间隔至少是1slot
aes ccm负责蓝牙数据的加密解密。蓝牙包的数据部分可以传输加密数据。加密方法使用aes ccm,基础加密模块128位的aes, ccm的操作方法如下,
先通过ccm B生成32位mic值,然后通过ccm A对数据进行加密。ccm B的结构如图。
![e039f465dc28a7e90cf8660b04ffde3d.png](https://img-blog.csdnimg.cn/img_convert/e039f465dc28a7e90cf8660b04ffde3d.png)
其中cs sk是128位的aes key,B1-BX 是需要传输的包的内容,这里的Y0-YX 只取YX的的最低32位作为mic。 B0的128位构成如下
![f7bd73700de6d93455d1362d3a09680e.png](https://img-blog.csdnimg.cn/img_convert/f7bd73700de6d93455d1362d3a09680e.png)
其中nounce的104位结构如下
![9fad3fe55eb72357fc52313faedd8864.png](https://img-blog.csdnimg.cn/img_convert/9fad3fe55eb72357fc52313faedd8864.png)
这里packetcounter用来计数发送了多少包,iv是初始向量,也由软件设置。
得到mic后通过ccm A加密数据,结构如图。
![65b475656090872122a9fa59b77b2628.png](https://img-blog.csdnimg.cn/img_convert/65b475656090872122a9fa59b77b2628.png)
其中cs sk是128位的aes key,mic是刚才CCM B算出的,这里的A0-An 128位构成如下
![4b6f0f94861d7cd8fbb02ddb0543a062.png](https://img-blog.csdnimg.cn/img_convert/4b6f0f94861d7cd8fbb02ddb0543a062.png)
ccm A得到的加密数据在发送最后需要添加加密的mic一起发送,解密的过程与加密相反,先解密,然后检查mic是否正确。
int controller在发送,接收到包,或者出错是产生中断,通知cpu进行处理。
frequency selection 负责对发送的包选择传输频率。蓝牙的发送频率与频道对应关系如下
![56550936549c859380305f25458fb9ff.png](https://img-blog.csdnimg.cn/img_convert/56550936549c859380305f25458fb9ff.png)
其中频道37 38 39为广播频道,其他为数据频道,建立连接前的adv包,通过广播频道发送,数据包通过数据频道发送。本模块在发送或者接受包数据前,需要先调整射频部分的振荡器,让他工作在合适的频点
radio control负责控制射频部分的时序以及相应参数配置,包括何时开启发射或接受电路的电源,何时让振荡器起震,调整并锁定agc,填充数据,关闭电路等。
bit strem中的 CRC和whiten,分别对应包数据的CRC校验生成与数据白化
这里crc生成24位校验位,使用的多项式为
![9dded3bb2f880aadfb7a131c7df70e22.png](https://img-blog.csdnimg.cn/img_convert/9dded3bb2f880aadfb7a131c7df70e22.png)
数据白化为了避免发射数据长期不翻转,人工增加翻转率,使用的移位多项式如下。
![c2518ad1ebca12c6f11d3e8fe4780931.png](https://img-blog.csdnimg.cn/img_convert/c2518ad1ebca12c6f11d3e8fe4780931.png)
移位寄存器的初始值为发射或接收的 频道代码。
packet control负责控制包的收发过程中的状态跳转,比如发包时的发送前缀码,发送同步吗,发送包头,发数据,发crc等
event control控制adv init connect scan 各个状态以及子状态之间的跳转,
event scheduler 控制从mem中预取指令数据,触发event control,协调各模块工作。
white list 负责对地址白名单进行检索,决定是否与之配对。
对于7种广播包,在发送时,都会在包的数据段发送48wei的device addr, 比如adv ind
![8067ef91220a61d975768e296b66ddd5.png](https://img-blog.csdnimg.cn/img_convert/8067ef91220a61d975768e296b66ddd5.png)
这里advA 的48位定义如下
![e82f871b325df24985393fc7dbd273d9.png](https://img-blog.csdnimg.cn/img_convert/e82f871b325df24985393fc7dbd273d9.png)
接收到这个包的设备,可以选择对这个包依据advA进行过滤,如果内存中有这个地址,则进行回应,如果没有这个地址,则直接丢弃这个包。
以上是link控制器的主要功能介绍。