一、433MHz无线通讯模块简介
1. 产品简介:
433MHz无线通讯模块,采用Chipcon公司的高性能CC1101无线通信芯片,最大传输数率达500kbps叠泉乡村俱乐部
,并可软件修改波特率,开阔地传输距离达到300米,具有无线唤醒等功能,灵敏度达到-110dBm,可靠性高,可广泛应用于各种场合的短距离无线通信领域。 2. 性能特点:
(1) 433MHz免费ISM频段免许可证使用;
(2) 最高工作速率500kbps,支持2-FSK、GFSK和MSK调制方式;
(3) 可软件修改波特率参数:
高波特率:更快的数据传输速率,
低波特率:更强的抗干扰性和穿透能力,
更好地满足客户在不同条件下的使用要求;
(4) 高灵敏度(1.2kbps下-110dBm,1%数据包误码率);
(5) 内置硬件CRC 检错和点对多点通信地址控制 ;
(6) 较低的电流消耗(RX中,15.6mA,2.4kbps,433MHz);
(7) 可编程控制的输出功率,对所有的支持频率可达+10dBm;
(8) 支持低功率电磁波激活功能;
(9) 支持传输前自动清理信道访问(CCA),即载波侦听系统; (10) 快速频率变动合成器带来的合适的频率跳跃系统;
科学技术与工程(11) 模块可软件设地址,软件编程非常方便;
(12) 标准DIP间距接口,便于嵌入式应用;
(13) 单独的64字节RX和TX数据FIFO。
3. 主要应用领域:
极低功率UHF无线收发器,315/433/868/915MHz ISM/SRD波段系统,AMR-自动仪表读数,电子消费产品,远程遥控控制,低功率遥感勘测,住宅和建筑自动控制,无线警报和安全系统,工业监测和控制,无线传感器网络,无线唤醒功能,低功耗手持终端产品等。
二、 硬件设计
1. 模块接口说明
CC1101与STM32引脚连接表如表1所示。
表1 CC1101与STM32引脚连接表
CC1101部分 | STM32部分 seer2.61 | 功能 |
引脚位号 | 名称 | 引脚位号 | 名称 |
1 | SCK | 26 | PB13/SPI2_SCK | SPI接口时钟线 |
2 | SO | 27 | PB14/SPI2_MISO | SPI接口MISO |
20 | SI | 28 | PB15/SPI2_MOSI | SPI接口MOSI |
3 | GDO2 | 41 | PB5 | 通用IO |
6 | GDO0 | 18 | PB0 | 通用IO |
7 | CSN | 25 | PB12/NSS2 | 芯片片选使能 |
| | | | |
图1 CC1101 的外引脚图(俯视)
三、 软件设计
1. SPI读写操作
u8 SPI_FLASH_SendByte(u8 byte)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
宁夏大学图书馆 /* Send byte through the SPI2 peripheral */
SPI_I2S_SendData(SPI2, byte);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI2);
}
2. SPI写寄存器操作
void halSpiWriteReg(INT8U addr, INT8U value)
{
SPI_FLASH_CS_LOW();
while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_SO) );
dmtn SPI_FLASH_SendByte(addr); //写地址
SPI_FLASH_SendByte(value); //写入配置
SPI_FLASH_CS_HIGH();
}
3. SPI读寄存器操作
INT8U halSpiReadReg(INT8U addr)
{
INT8U temp, value;
temp = addr|READ_SINGLE;//读寄存器命令
SPI_FLASH_CS_LOW();
while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_SO) );//MISO
SPI_FLASH_SendByte(temp);
value = SPI_FLASH_SendByte(0);
SPI_FLASH_CS_HIGH();
return value;
}
4. 模块初始化设置
const RF_SETTINGS rfSettings
= {
奥运知识 0x06, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x10, // FREQ2 Frequency control word, high byte.
0xA7, // FREQ1 Frequency control word, middle byte.
0x62, // FREQ0 Frequency control word, low byte.
0xf6, // MDMCFG4 Modem configuration.
0x83, // MDMCFG3 Modem configuration.
0x13, // MDMCFG2 Modem configuration.
0x22, // MDMCFG1 Modem configuration.
0xF8, // MDMCFG0 Modem configuration.
0x00, // CHANNR Channel number.
0x15, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0x56, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end RX configuration.
0x18, // MCSM0 Main Radio Control State Machine configuration.
0x16, // FOCCFG Frequency Offset Compensation Configuration.
0x6C, // BSCFG Bit synchronization Configuration.
0x03, // AGCCTRL2 AGC control.
0x40, //0x00, // AGCCTRL1 AGC control.
0x91, // AGCCTRL0 AGC control.
0xE9, // FSCAL3 Frequency synthesizer calibration.
0x2A, // FSCAL2 Frequency synthesizer calibration.
0x00, // FSCAL1 Frequency synthesizer calibration.
0x1F, // FSCAL0 Frequency synthesizer calibration.
0x59, // FSTEST Frequency synthesizer calibration.
0x81, // TEST2 Various test settings.
0x35, // TEST1 Various test settings.
0x09, // TEST0 Various test settings.
0x29, // IOCFG2 GDO2 output pin configuration.
0x06, // IOCFG0D GDO0 output pin configuration.
0x04, // PKTCTRL1 Packet automation control.
0x05, // PKTCTRL0 Packet automation control.
0x00, // ADDR Device address.
0xff // PKTLEN Packet length.
};
5. 数据发送流程操作
void halRfSendPacket(INT8U *txBuffer, INT8U size)
{
halSpiWriteReg(CCxxx0_TXFIFO, size); //写入长度
halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
halSpiStrobe(CCxxx0_STX); //进入发送模式发送数据
// Wait for GDO0 to be set -> sync transmitted
while (!GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_GD0) );//while (!GDO0);
// Wait for GDO0 to be cleared -> end of packet
while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_GD0) );// while (GDO0);
halSpiStrobe(CCxxx0_SFTX);
}
6. 数据接收流程操作
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U *length)
{
INT8U status[2];
INT8U packetLength;
INT8U i=(*length)*4; // 具体多少要根据datarate和length来决定
halSpiStrobe(CCxxx0_SRX); //进入接收状态
Delay(5);
while (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_GD0) )//while (GDO0)
{
Delay(2);
--i;
if(i<1)
return 0;
}
if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0