概述
- 最高传输速率:500kbps
- RX 功耗:15.6ma
- 单独的64 字节RX 和 TX 数据 FIFO
通信接口
cc2500 提供了spi 接口与外部的mcu通信。cc2500 作为spi slave
接口连线如下:
主控mcu 的spi 配置:
spi 模式 | spi 配置 | 备注 |
---|---|---|
SPI_MODE | SPI_MODE_Master | 主控 |
SPI_DATASIZE | SPI_DataSize_8b | 8bit |
SPI_CPOL | SPI_CPOL_High | sck 空闲为低 |
SPI_CPHA | SPI_CPHA_2Edge | sck 第一沿取样 |
SPI_FirstBit | MSB | 高位在前 |
常规用途/测试输出控制引脚(GDO0,GDO1,GDO2)
分别用IOCFG2,IOCFG1,IOCFG0 三个寄存器配置这三个引脚的功能。这三个寄存器分别可配置的参数范围是0-0x3F,每个参数对应的含义,参考cc2500 datasheet。
我使用的配置方案。
IOCFG2 | IOCFG1 | IOCFG0 |
---|---|---|
0x29 | 0x2E | 0x06 |
- GDO0
-
上电后,初始化cc2500 前,GDO0 以135khz的频率输出方波。初始化完IOCFG0 寄存器后,保持为低电平。
-
发射模式下。平常为低电平。当mcu 对cc2500 下达STX(发射)命令后,GDO0 会从低变成高,表示CC2500 正在发射资料。等到GDO0由低高变低时,表示CC2500 发射完成。
-
接收模式下。平常GDO0 为低电平,当MCU 对CC2500 下达SRX(接收)指令后,当接到封包且preamble 和 syncword 正确时,GDO0 会从低变高,表示正在接收资料,等到GDO0 由高变低时,表示接收完成。编程时,可以设置为下降沿中断接收数据包。
-
- GDO1 和在spi 接口上的SO 脚是同一脚,因此这个脚上控制的输出在CS 高时才有用。GDO1 默认是3态
- GDO2 没使用。
寄存器
寄存器概述
寄存器类型 | 地址范围 | 说明 |
---|---|---|
配置寄存器 | 0-> 0x2F | 配置CC2500。可读写,长度为一个字节 |
选通命令 | 0x30->0x3F | 当执行写寄存器操作时 表示 mcu 下达的切换命令,只需要写寄存器地址;当执行读寄存器操作时,CC2500 会返回RF 的相关参数 |
发射功率寄存器 | 0x3E | 决定发射功率,最多可设置8组,共8种功率 |
TX/RX FIFO | 0x3F | 写入时,写入TX FIFO;读取时,读取RX FIFO。长度各为64 bytes |
头字节
每次MCU 发起通信,写入的第一个字节成为头字节。头字节有固定的格式。第一个bit 表示读写位,第二个bit表示single or burst 访问,后面6bits 表示地址。
状态字
每次MCU 发起通信,写入头字节到CC2500 ,CC2500 返回一个状态字。状态字的定义如下
bits | 名称 | 描述 |
---|---|---|
7 | CHIP_RDYn | 当功率和晶体已经稳定,该位保持为低 |
6:4 | STATE[2:0] | 表示CC2500当前主状态机状态 |
3:0 | FIFO_BYTES_AVAILABLE[3:0] | TX FIFO 中的自由比特数 |
寄存器的访问
mcu 访问CC2500 寄存器时,第一个字节写入头字节(参考前面说明)。如果是写寄存器,第二个字节是要写入的参数;如果是读寄存器,第二个字节可以是0xFF。
write | read |
---|---|
Single byte: + 0x00 | Single byte: + 0x80 |
Burst: + 0x40 | Burst: + 0xC0 |
突发访问
对于连续地址访问,如果每次都要写入一次地址,将会很浪费时间资源。CC2500 提供了突发访问的机制,访问第一个地址时,设置突然访问位,后续的访问,将不需要再写入地址。scs 拉高结束突发访问。典型的应用场景是FIFO 的访问。
调试
- 可以通过查看CC2500 返回的状态字,查看当前处于的状态。
- 比较一下写入和读出寄存器内容是否一致,判断spi 读写是否正常。
- 可以利用频谱仪捕抓发送频率信息,验证自己配置的频点参数是否符合预期。
遇到的坑
- 焊接了几块CC2500 ,其中一款spi读写寄存器正常,就是收不到数据。其他几块正常,还没找到原因。
- cc2500 周边电路元器件虚焊,导致cc2500 gdo0 输入的电平有异常。我平常习惯于用逻辑分析仪分析数据,一开始没怀疑GDO0 的电压问题,一直在纠结为什么GDO0 没提示收到数据包。