最近有做有关无线电发送和接收的课设,故写下此篇记录学习
当然,内容基于CC1101中文手册
# CC1101模块学习
翻阅数据手册可知道,CC1101通过SPI接口配置参数以达到最优性能。
关键参数如下:
功率降低/提升模式
晶体振荡器功率降低/提升
接收/传输模式
RF 信道选择
数据率
调制格式化
RX信道滤波器带宽
RF 输出功率
64 位传输FIFO数据缓冲
数据包通信硬件支持
交错前向误差校正
数据白化
电磁波激活(WOR)
一、 4 线串行配置和数据接口
CC1100通过4线SPI兼容接口(SI,SO,SCLK 和CSn)配置。这个接口同时用作写和读缓 存数据。
SPI 接口上所有的地址和数据转换 被最先在重要的位上处理。 SPI 接口上所有的处理都同一个包含一个读 /写位,一个突发访问位和一个 6 位地址的 头字节一起作用。
在地址和数据转换期间,CSn脚(芯片选择, 低电平有效)必须保持为低电平。如果在过 程中CSn变为高电平,则转换取消。
当CSn变低,在开始转换头字节之前,MCU 必须等待,直到SO脚变低。这表明电压调 制器已经稳定,晶体正在运作中。除非芯片处在SLEEP 或 XOFF 状态,SO 脚在 CSn变低之后总会立即变低。
配置寄存器写和读操作:
1、芯片状态位
先看图
当头字节在SPI接口上被写入时,芯片状态 字节在SO脚上被CC1100写入。
首先是第7位CHIP_RDYn。它信号表明晶体正处于工作中, 调节数字供给电压是稳定的。
然后是第4到第6位,这三位共同表明了当前模块的状态模式
最后是第0位到第4位,其实是决定发送数据的长度?
2、寄存器访问
CC1100配置寄存器位于SPI地址从0x00到 0x2F 之间。所有的配置寄存器均能读和写。读/写 位控制寄存器是读或者写。当对寄存器写 时,每当一个待写入的数据字节传输到 SI 脚时,状态字节将被送至SO脚。
通过在地址头设置突发位,连续地址的寄存器能高效地被访问。这个地址在内部计数器内设置起始地址。每增加一个新的字节(每8 个时钟脉冲),计数器值增加1。突发访问,不管是读访问还是写访问,必须通过设置 CSn 为高来终止。
对与剩下的0x30-0x3D 间的地址来说,突发位用以在状态寄存器和命令滤波之间选择(如下)。状态寄存器只读。突发读取对状态寄存器是 不可取的,故它们每次只能被读一个。
3、命令滤波
命令滤波可被视为CC1100的单字节指令。 通过命令滤波寄存器的选址,内部序列被启动。这些命令用来关闭晶体振荡器,开启传输模式和电磁波激活等。
命令滤波寄存器的访问和一个寄存器的写操作一样,但没有数据被传输。就是说,只有R/W 位(置为0),突发访问(置为0) 和六个地址位(0x30和0x3D之间)被写。 一个命令滤波可能在任何其他 SPI 访问之 后,而不需要将CSn拉至高电平。
4、FIFO访问
先解释一下什么是FIFO,FIFO(First In First Out,先进先出)是一种数据缓存器,常用于不同时钟域之间的数据传输。它的特点是数据按照进入的顺序依次输出,类似于排队的方式。FIFO在FPGA中是非常常用的IP核,广泛应用于接口模块、数据转换和协议处理等场合。
64 字节TX FIFO和64字节RX FIFO通过 0x3F 被访问。当读/写位为0时,TX FIFO 被访问,当读/写位为1时,RX FIFO被访 问。 也就是TX FIFO (发送)是只写的,而RX FIFO(接收)是只读的。
突发位用来决定FIFO访问是单字节还是突发访问。单字节访问方式期望地址的突发位为0及1数据字节。在数据字节之后等待一个新的地址,因此,CSn继续保持低。突发访问方式允许一地址字节,然后是连续的数据字节,直到通过设置 CSn 为高来关断访问。(中译中:单字节访问就是一个地址+一个数据,突发访问方式就是一个地址+n个数据,直到CSn拉高来结束)
头字节访问FIFO:
头字节 | 访问方式 |
---|---|
0x3F | 单字节访问TX FIFO |
0x7F | 突发访问TX FIFO |
0xBF | 单字节访问RX FIFO |
0XFF | 突发访问RX FIFO |
当对TX FIFO写时,状态字节对每个SO脚上的新数据字节是输出量,这个状态位能用来侦测对 TX FIFO 写数据时的下溢。注意,状态字节包含在写入字节到TX FIFO 的过程前空闲的字节数。当最后一个适合TX FIFO的字节被 传送至SI脚后,被SO脚接收的状态位会表 明在TX FIFO中只有一个字节是空闲的。传输FIFO可能会通过发布一个SFTX命令滤波而被淹没。相似地,一个SFRX命令滤波会淹没接收FIFO。当进入休眠状态时,两个FIFO都被清空。
SFTX:冲洗TX FIFO缓冲
SFRX:冲洗RX FIFO缓冲
5、PATABLE访问
PATABLE用来选择PA能量控制设置。在接收此地址之后,SPI等待至少8个字节。通过控制 PATABLE,能实现可控的PA能量上升和下 降,减少的带宽的ASK调制整型也如此。
二、微控制器接口和引脚结构
微控制器为SPI 配置接口(SI,SO,SCLK 和 CSn)使用4个I/O引脚。
CC1100 有两个专用的配置引脚(GDO0、GDO1)和一个共享引脚(SO),能输出对控制软件有用的内部状态信 息。这些引脚能用来对MCU产生中断。
GDO1/SO 的默认设置为 3 状态输出。通过选择任意其他的控制选项, GDO1/SO 脚将成为一般引脚。当CSn为低 时,此引脚的功能如一般SO脚。
在同步和异步连续模式下,处于传输模式时 GDO0脚被用作连续TX数据输入脚。提一嘴GDO0脚也能用作集成于芯片的模拟温度传感器。
可选通信控制特性
通过重复使用 SPI 接口上的 SI,SCLK 和 CSn,CC1100 含有一个可选的控制电磁波 方式。这个特性使通信的主要状态有一个简 单的3脚控制:休眠,空闲,RX和TX。控制MCSM0.PIN_CTRL_EN配置位,可开 启这一可选功能。
当CSn为高,SI和SCLK设置为理想状态时,状态变化的命令被发出,如下所示。当CSn变低,SI和SCLK的状态被 闭锁,根据引脚配置一个命令滤波在内部产 生。只能用这种功能改变状态。这意味着, 例如,如果SI和SCLK设置为RX且CSn 固定,则RX不会被重新启动。当CSn为低, SI 和SCLK为一般SPI功能。
所有引脚控制命令滤波被立即执行,除 SPWD滤波外。SPWD滤波一直延迟到CSn 变高为止。
三、接收信道滤波带宽
为了满足不同信道宽度要求,使接收器信道 滤波装置可编程控制。 MDMCFG4.CHANBW_E 和MDMCFG4.CHANBW_M 配置寄存器控制 接收器信道滤波带宽。
CC1100 支持 54-63kHz 到 600-700kHz 之间 的信道滤波带宽。然而,在300kHz之上, 灵敏度和模块化性能会稍微降低。
为得到最高性能,信道滤波带宽应该选择 为:信号带宽最多占80%信道滤波带宽。举例:
设置信道滤波带宽为 500kHz,信号应该处 于500kHz的80%之内,即400kHz。假设发 送装置和接收装置均为频率为915MHz,正 负 20ppm 频率波动,总的频率波动为 915MHz 的正负40ppm,即正负37kHz。如 果整个发送信号带宽将在 400 kHz 内被接 收,那么发送信号带宽应该为 400kHz-237kHz 的最大值,即326kHz。
四、配置寄存器
CC1100 的配置通过程序控制8位寄存器完成。在芯片重启之后,所有的寄存器置默认值。
在下表中,有14个命令滤波寄存器。访问这些寄存器将会发起内部状态或模式的改变。
地址 | 滤波名 | 描述 |
---|---|---|
0x30 | SRES | 重启芯片 |
0x31 | SFSTXON | 开启和校准频率合成器(若MCSM0.FS AUTOCAL=1) |
0x32 | SXOFF | 关闭晶体振荡器 |
0x33 | SCAL | 校准频率合成器并关断(开启快速启动)。在不设置手动校准 模式(MCSM0.FS_AUTOCAL=0)的情况下,SCAL能从空闲 模式滤波。 |
0x34 | SRX | 启用 RX。若上一状态为空闲且 MCSM0.FS_AUTOCAL=1 则 首先运行校准。 |
0x35 | STX | 空闲状态:启用TX。若MCSM0.FS_AUTOCAL=1首先运行校 准。若在RX状态且CCA启用:若信道为空则进入TX |
0x36 | SIDLE | 离开RX/TX,关断频率合成器并离开电磁波激活模式若可用 |
0x37 | SAFC | 运行频率合成器的AFC调节 |
0x38 | SWOR | 运行自动RX选举序列(电磁波激活) |
0x39 | SPWD | 当CSn为高时进入功率降低模式。 |
0x3A | SFRX | 冲洗RX FIFO缓冲 |
0x3B | SFTX | 冲洗TX FIFO缓冲 |
0x3C | SWORRST | 重新设置真实时间时钟 |
0x3D | SNOP | 无操作。可能用来为更简单的软件将滤波命令变为2字节。 |
在下表中,有47个一般的8位配置寄存器。
地址 | 寄存器 | 描述 |
---|---|---|
0x00 | IOCFG2 | GDO2输出脚配置 |
0x01 | IOCFG1 | GDO1输出脚配置 |
0x02 | IOCFG0 | GDO0输出脚配置 |
0x03 | FIFOTHR | RX FIFO和TX FIFO门限 |
0x04 | SYNC1 | 同步词汇,高字节 |
0x05 | SYNC0 | 同步词汇,低字节 |
0x06 | PKTLEN | 数据包长度 |
0x07 | PKTCTRL1 | 数据包自动控制 |
0x08 | PKTCTRL0 | 数据包自动控制 |
0x09 | ADDR | 设备地址 |
0x0A | CHANNR | 信道数 |
0x0B | FSCTRL1 | 频率合成器控制 |
0x0C | FSCTRL0 | 频率控制词汇,高字节 |
0x0D | FREQ2 | 频率控制词汇,中间字 |
0x0E | FREQ1 | 频率控制词汇,低字节 |
0x0F | FREQ0 | 调制器配置 |
0x10 | MDMCFG4 | 调制器配置 |
0x11 | MDMCFG3 | 调制器配置 |
0x12 | MDMCFG2 | 调制器配置 |
0x13 | MDMCFG1 | 调制器配置 |
0x14 | MDMCFG0 | 调制器背离设置 |
0x15 | DEVIATN | 主通信控制状态机配置 |
0x16 | MCSM2 | 主通信控制状态机配置 |
0x17 | MCSM1 | 主通信控制状态机配置 |
0x18 | MCSM0 | 频率偏移补偿配置 |
0x19 | FOCCFG | 位同步配置 |
0x1A | BSCFG | AGC控制 |
0x1B | AGCTRL2 | AGC控制 |
0x1C | AGCTRL1 | AGC控制 |
0x1D | AGCTRL0 | 高字节时间0暂停 |
0x1E | WOREVT1 | 低字节时间0暂停 |
0x1F | WOREVT0 | 电磁波激活控制 |
0x20 | WORCTRL | 前末端RX配置 |
0x21 | FREND1 | 前末端TX配置 |
0x22 | FREND0 | 频率合成器校准 |
0x23 | FSCAL3 | 频率合成器校准 |
0x24 | FSCAL2 | 频率合成器校准 |
0x25 | FSCAL1 | 频率合成器校准 |
0x26 | FSCAL0 | RC振荡器配置 |
0x27 | RCCTRL1 | RC振荡器配置 |
0x28 | RCCTRL0 | 频率合成器校准控制 |
0x29 | FSTEST | 产品测试 |
0x2A | PTEST | AGC测试 |
0x2B | AGCTEST | 不同的测试设置 |
0x2C | TEST2 | 不同的测试设置 |
0x2D | TEST1 | 不同的测试设置 |
0x2E | TEST0 |
五、配置流程
参考代码:
//默认对应的引脚已经正确定义
const uint8_t PaTabel[ ] = { 0xc0, 0xC8, 0x84, 0x60, 0x68, 0x34, 0x1D, 0x0E};
static const uint8_t CC1101InitData[ 22 ][ 2 ]=
{
{ CC1101_IOCFG0, 0x06 },
{ CC1101_FIFOTHR, 0x47 },
{ CC1101_PKTCTRL0, 0x05 },
{ CC1101_CHANNR, 0x96 }, //430M
{ CC1101_FSCTRL1, 0x06 },
{ CC1101_FREQ2, 0x0F },
{ CC1101_FREQ1, 0x62 },
{ CC1101_FREQ0, 0x76 },
{ CC1101_MDMCFG4, 0xF6 },
{ CC1101_MDMCFG3, 0x43 },
{ CC1101_MDMCFG2, 0x13 },
{ CC1101_DEVIATN, 0x15 },
{ CC1101_MCSM0, 0x18 },
{ CC1101_FOCCFG, 0x16 },
{ CC1101_WORCTRL, 0xFB },
{ CC1101_FSCAL3, 0xE9 },
{ CC1101_FSCAL2, 0x2A },
{ CC1101_FSCAL1, 0x00 },
{ CC1101_FSCAL0, 0x1F },
{ CC1101_TEST2, 0x81 },
{ CC1101_TEST1, 0x35 },
{ CC1101_MCSM1, 0x3B },
};
void CC1101_Init( void )
{
uint8_t i = 0;
CC1101_Gpio_Init( ); //引脚初始化
CC1101_Reset( ); //模块复位
for( i = 0; i < 22; i++ )
{
CC1101_Write_Reg( CC1101InitData[i][0], CC1101InitData[i][1] ); //写入配置参数
}
CC1101_Set_Address( 0x05, BROAD_0AND255 ); //写入设备地址 和地址模式
CC1101_Set_Sync( 0x8799 ); //写入同步字段
CC1101_Write_Reg(CC1101_MDMCFG1, 0x72 ); //调制解调器配置
CC1101_Write_Multi_Reg( CC1101_PATABLE, (uint8_t*)PaTabel, 8 );
}