2.10 数据包长度
- CC1101 支持恒定长度数据包协议和可变长度协议。
- 可变或固定数据包长度模式能支持的长度可达 255 字节。
- 大于255个字节的数据包,必须使用无限数据包长度模式;
使用不同长度的配置来支持数据包格式。必须确保在发送前半个或任何字节的时候TX模式不被关闭
2.10.1 固定数据包长度
- 固定数据包长度模式通过设定PKTCTRL0.LENGTH_CONFIG=0来选择。
- 期望的数据包长度通过PKTLEN寄存器来设置,不包括长度字节和可选的CRC;
2.10.2 可变数据包长度
- 可变数据包长度模式,PKTCTRL0.LENGTH_CONFIG=1,数据包长度由同步字后面的第一个字节配置。
- 数据包长度定义为有效载荷,不包括长度字节和可选的CRC。
- PKTLEN用来配置允许接收的最大数据包长度。
- 任何接收的数据包长度大于PKTLEN的值都将被丢弃。
2.10.3 可变长数据包收发逻辑
数据包长度寄存器PKTLEN,在接收和发送时可以重新编程。结合固定数据包长度模式(PKTCTRL0.LENGTH_CONFIG=0),这使与变长数据包不同的长度配置成为可能。(在可变数据包长度模式下长度字节是同步字节后第一个字节)在接收开始,数据包长度设置为一个大的值。MCU读取足够多的字节来解析数据包中的长度区域。然后依照这个值对PKTLEN进行设置。当数据包处理器中的字节计数器等于PKTLEN寄存器的值时数据包结束。因此,MCU必须在内部计数器达到数据包长度之前确认正确的长度
2.10.4 无限数据包长度模式(大于255个字节)
- PKTCTRL0.LENGTH_CONFIG=2,数据包长度将设置为无限长,发送和接收将持续到手动关闭。
2.10.5 无限数据包长度收发逻辑
- 数据包自动控制寄存器PKTCTRL0,可以在TX和RX期间重新编程。这就使发送和接收数据包长度超过256字节并且仍然使用数据包处理器硬件支持成为可能。
- 在数据包开始时,必须激活无限数据包长度模式(PKTCTRL0.LENGTH_CONFIG=2)。
- 在发送端,PKTLEN寄存器设置为:mod(长度,256)。
- 在接收端,MCU读出足够长度的字节来解析出数据包长度并设置PKTLEN寄存器为:mod(长度,256)。
- 当数据包中还有少于256字节数据,MCU禁止数据包无限长度模式并且激活固定长度模式。
- 当内部字节计数器到PKTLEN时,发送和接收结束。
- (无线进入的状态由TXOFF_MODE 或 RXOFF_MODE决定)自动CRC添加/校验也可以使用(通过设置PKTCTRL0.CRC_EN=1)。
例子:发送一个600字节的数据包时,MCU必须按照以下执行:
- 设置PKTCTRL0.LENGTH_CONFIG=2。
- 重新设置PKTLEN寄存器的值为:(600,256)=88. (600%256 = 88)
- 至少发送345字节(600-255),例如通过填充64字节 TX FIFO 6次(发送384字节)。
- 设置PKTCTRL0.LENGTH_CONFIG=0。
- 当数据包计数器达到88发送完成。一共600字节被发送。
600个字节发送
.11 接收模式下的数据包过滤
CC1101支持三种不同类型的数据包过滤:
- 地址过滤
- 最大长度过滤
- CRC过滤
2.11.1 地址过滤
- 设置PKTCTRL1.ADR_CHK为任意大于0的值使能数据包地址过滤。
- 数据包处理器启动后将比较数据包中的目标地址字节和在ADDR寄存器中设置的节点地址
或者当PKTCTRL1.ADR_CHK=10时的广播地址0x00
以及PKTCTRL1.ADR_CHK=11时的广播地址0x00和0xFF。
如果接收的地址匹配到一个正确地址,数据包被接收并写入到RX FIFO。
如果地址匹配失败,数据包将被丢弃,重新启动接收模式(不管MCSM1.RXOFF_MODE的设置)。 - 如果当时用无限数据包长度模式和使能地址过滤时接收地址匹配到正确的地址,0xFF将被写入到RX FIFO,其次是地址字节和有效载荷。
2.11.2 最大长度过滤
在可变数据包模式,PKTCTRL0.LENGTH_CONFIG=1,PKTLEN.PACKET_LENGTH寄存器用来设置最大允许的数据包长度。如果接收的长度字节大于这个值,数据包将被丢弃,重新启动接收模式(不管MCSM1.RXOFF_MODE的设置)。
2.11.3 CRC过滤
- 当CRC校验失败时过滤数据包,通过设置PKTCTRL1.CRC_AUTOFLUSH=1使能;
- CRC自动清除功能将在CRC校验失败时清空所有RX FIFO;
- 在自动清空RX FIFO后,下一个状态依赖于MCSM1.RXOFF_MODE的设置;
- 当使用自动清除功能,在可变数据包长度模式下最大数据包长度为63字节,在定长数据包长度模式下是64字节;
- 注意当PKTCTRL1.APPEND_STATUS使能,最大允许数据包长度将减少2个字节,以确保在数据包的结尾附加的2字节的状态字节在RX FIFO中占用的空间;
- 当CRC校验错误以后全部RX FIFO被清空;
- 在接收正确的数据包前之前接收到的数据包必须从FIFO中读出。直到CRC校验正确MCU才从正确的数据包中读取数据;
2.12发送模式下的数据包处理
- 需要发送的有效载荷必须写入到TX FIFO;
- 如果使能可变数据包长度第一个字节必须写长度字节;
- 长度字节的值等于数据包的有效载荷(包含可选的地址字节);
- 如果在接收端使能地址识别,写入到TX FIFO中的第二个字节必须是地址字节;
- 如果使能固定数据包长度,写入到TX FIFO中的第一个字节必须是地址字节(接收端使用地址识别);
- 调制器将首先发送预置数量的前导字节;
- 如果TX FIFO中有可发送的数据,调制器将发送2字节(可选4字节)同步字,紧接着是TX FIFO中的有效载荷;
- 如果使能CRC,校验时计算TX FIFO中的所有数据,然后跟随有效数据发送2个附加字节;
- 如果在完整的数据包发送完成之前TX FIFO变为空的,无线将进入TXFIFO_UNDERFLOW状态。退出该状态的唯一方法是运行SFTX命令;
- 发送下溢后再向TX FIFO写入数据不能重启TX模式;
- 如果whitening(白化)被使能,同步字后面的所有字节将被whitened。这必须在FEC/Interleaver之前完成。Whitening通过设置PKTCTRL0.WHITE_DATA=1使能;
- 如果FEC/Interleaving(交错器)被使能,同步字后面的所有数据在调制之前将被interleaver 和 FEC编码加密。FEC通过设置MDMCFG1.FEC_EN=1使能;
2.13接收模式下的数据包处理
- 在接收模式,解调器和数据包处理器将寻找一个有效的前导和同步字。
- 当找到后,解调器将获得位和字节同步,并将接收第一个有效字节。
- 如果使能FEC/Interleaver,FEC解码器将开始解码第一个有效字节。Interleaver将在数据被其他任何处理之前解密。
- 如果使能whitening,在此基础上数据将被de-whitening(反白化)。
- 当使能可变数据包长度模式时,第一个字节是长度字节。数据包处理器储存该值为数据包长度并且通过该长度字节指示接收的字节数量。
- 如果使用固定数据包长度模式,数据包处理器将接收预置数量的字节。
- 接下来,数据包处理器可选的检测地址并且只有地址匹配才继续接收。
- 如果使能自动CRC校验,数据包处理器计算CRC并与CRC校验结果相匹配。
在有效载荷的结尾,数据包处理器将可选的写入两个复交数据包状态字节,包括CRC状态、LQI和RSSI。
2.14 MCU数据包处理
如果在固件中执行一个数据包导向的无线协议,MCU需要知道一个数据包什么时候收到/发送。加之,超过64字节长度的数据包,当接收时需要读取RX FIFO和当发送时TX FIFO需要重新填充。这就意味着MCU必须知道有多少个字节可以从RX FIFO中读取或者可以向TX FIFO中写入。有两种方法可以获得必要的状态信息。
- 中断驱动方法
当同步字接收/发送完成或者完整的数据包接收/发送通过设置IOCFGx.GDOx_CFG=0x06,GDO脚可以用在RX和TX中产生一个中断。
此外,
IOCFGx.GDOx_CFG还有两个配置用来产生中断,源于有多少字节在RX FIFO或TX FIFO。
IOCFGx.GDOx_CFG=0x00和IOCFGx.GDOx_CFG=0x01为RX FIFO,
IOCFGx.GDOx_CFG=0x02和IOCFGx.GDOx_CFG=0x03为TX FIFO。 - SPI轮询
PKTSTATUS可以使用给定的速率查询以获得GDO0和GDO2当前值。
RXBYTES 和 TXBYTES可以使用给定的速率查询以获得RX FIFO或者TX FIFO中的字节数。
合二为一的,RX FIFO和TX FIFO中的字节数量可以从每次头字节、数据字节或命令选通在SPI总线上发送时MISO引脚返回的芯片状态字节读取。
推荐使用中断驱动方法因为高速率SPI轮询将减小RX的灵敏度。
2.15 RSSI
- RSSI的值时在选择的通道中信号功率级别的估计。
- 这个值基于RX中当前增益的设置和信道中的标准信号等级。
- 在RX模式,RSSI可以连续的从RSSI状态寄存器读取知道解调器检测到一个同步字(当同步字检测使能)。此时RSSI读取的值将被冻结知道芯片下一次进入RX状态。
RSSI的值以dBm和1/2 dB给出。
RSSI更新速率,fRSSI 依赖于接收滤波带宽和AGCCTRL0.FILTER_LENGTH。
- 如果使能PKTCTRL1.APPEND_STATUS,数据包最后的RSSI值自动添加到有效载荷后面的第一个附加字节。
- 从RSSI状态寄存器读出的RSSI值时2个补足的数字。下面的程序可以将RSSI转换为完整的功率级别(RSSI_dBm)。
- 读取RSSI状态寄存器
- 将读到的数据从16进制数转换到二进制数(RSSI_dec)
- 如果RSSI_dec≧128,RSSI_dBm =(RSSI_dec - 256)/2 – RSSI_offset 4)
4 ) 如果RSSI_dec<128,RSSI_dBm =RSSI_dec /2 – RSSI_offset
2.16 净信道评估(CCA)
- CCA用来显示当前信道是空闲还是繁忙。
- 通过设定IOCFGx.GDOx_CFG=0x09,当前的CCA状态在任何一个GDO引脚都可以查看。
- MCSM1.CCA_MODE用来选择当确定CCA时使用的模式。
- 当CC1101在RX状态时给出STX 或 SFSTXON命令选通,仅能在净信道条件完成才能进入TX或FSTXON状态。
- 此外,芯片将仍处于RX状态。如果信道接下来变为可用的,在一个新的命令选通通过SPI接口发送之前,无线不会进入TX或FSTXON状态。这个特性叫做TX-if-CCA。可以编程设置4种CCA条件:
- 始终(禁止CCA,总是进入TX)
- 如果RSSI低于门限值
- 除非正常接收一个数据包
- 以上两个(RSSI低于门限值和没有正常接收一个数据包)
2.17 链路质量指示(LQI)
- 信号链路质量指示是一个公制的接收信号的当前质量。
- 若 PKTCTRL1.APPEND_STATUS启用,则这个值自动附加在接收数据包的末端。
- 这个值也可从 LQI 状态寄存器上读取。
LQI 由跟随同步词汇的 64 个符号(头 8 个数据包字节)计算得来。LQI 最好用作连接
质量的一个相对的度量,因为这个值决定于调制格式。
2.18 上电启动序列
- 当电源给电,系统必须复位。
- 通过下面描述的2个序列中的一个来完成,即自动上电复位(POR)或者手动复位。
- 自动上电复位或手动复位之后,推荐转换GDO0引脚上输出的信号。
- 默认设置是以CLK_XOSC/192的频率输出一个时钟信号。
- 然而,为了在TX和RX中优化执行,必须GD0/1/2 引脚配置中的配置来配置GDO脚。
2.18.1 自动POR
CC1101内部包含上电复位电路。最小的需求见表15,完整的上电复位功能必须遵循。当CHIP_RDYn变低内部上电序列完成。在CSn拉低后在SO引脚上可以查看CHIP_RDYn。
当CC1101复位完成,芯片将进入IDLE状态,晶振开始运行。如果芯片在上电之后有足够的时间让晶振稳定,在捕获CSn变低之后SO引脚将马上变低。如果在复位完成之前CSn被拉低,SO引脚将首先变高,指示晶振没有稳定,变低之前见下图。
自动POR
2.18.2 手动复位
CC1101上的其它全部复位时使用SRES命令。通过执行这个命令,所有内部寄存器和状态恢复默认,IDLE状态。手动复位序列如下(图 手动复位):
- 设置SCLK=1,SI=0,避免引脚控制模式可能出现的问题。
- 选通CS低/高。
- 保持CS为低,然后拉高,至少40us才可以拉低
- 将CSn拉低等到SO拉低(CHIP_RDYn)。
- 在SI线上发布SRES选通。
- 当SO再一次拉低,复位完成,芯片进入IDLE状态
手动复位
注意:以上复位程序只需要在电源给电之后。如果用户在这之后想要复位CC1101,只需要执行SRES命令选通。
2. 19无线唤醒WOR
当使能WOR时,芯片不需要MCU干预,自动周期性的从深睡中醒来接收数据;
当WOR使能时,MCU送出SWOR命令后,CC1100就释放CSn,进入SLEEP状态。在送出WOR前,必须使能RC振荡器,它是WOR定时器的时钟源(750/),它会是芯片进入IDLE然后睡RX状态,如果没有接收到数据包,在设定的时间后,重新从RX状态回到SLEEP状态。
WOR定时器有两个事件:EVENT0和EVENT1。当WOR激活时,在SLEEP中,到达EVENT0时,就打开数字校准器,启动晶振。在EVENT0设定地时间后出现EVENT1。
CC1100 WOR有两种不同地方式:有或没有自动同步。