|
使用CC2500模块,S52芯片,连接方式如下:
sbit GDO0 = P2^2;
sbit GDO2 = P2^3;
sbit MISO = P1^6;
sbit MOSI = P1^5;
sbit SCK = P1^7;
sbit CSN = P2^4;
CC2500配置如下表
spi_write_reg(CCxxx0_IOCFG2, 0x0b); // 00 GDO2 output pin config.
spi_write_reg(CCxxx0_IOCFG0, 0x06); // 02 GDO0 output pin config.
spi_write_reg(CCxxx0_PKTLEN, 0xff); // 06 Packet length.
// 当固定长度数据包启用时表明数据包的长度。
// 若使用可变长度数据包,这个值表示允许的最大长度数据包。
spi_write_reg(CCxxx0_PKTCTRL1, 0x05); // 07 Packet automation control.
// 2个状态字节(RSSI 和LQI值)将附加在数据包的有效载荷上。
// 使能接收包的地址检查,不响应广播
spi_write_reg(CCxxx0_PKTCTRL0, 0x05); // 08 Packet automation control.
// 白化关闭, 正常模式(使用TX FIFO和RX FIFO), 开启CRC校准
// 可变长度数据包(通过同步词汇后的第一个位配置数据包长度)
spi_write_reg(CCxxx0_ADDR, 0x01); // 09 Device address.
// 数据包过滤时使用的地址检查
spi_write_reg(CCxxx0_CHANNR, 0x00); // 0a Channel number.
// 8位无符号信道数,被信道空间设置相乘,再加到基频率上
spi_write_reg(CCxxx0_FREQ2, 0x5d); // 0d Freq control word, high byte.
spi_write_reg(CCxxx0_FREQ1, 0x93); // 0e Freq control word, mid byte.
spi_write_reg(CCxxx0_FREQ0, 0xb1); // 0f Freq control word, low byte.
// 上述3个寄存器计算carrier频率f=26M*(0x5D93B1)/65536=2433MHz
spi_write_reg(CCxxx0_FSCTRL1, 0x07); // 0b Freq synthesizer control.
// RX中使用的理想IF频率=26M*7/1024=101Khz
spi_write_reg(CCxxx0_FSCTRL0, 0x00); // 0c Freq synthesizer control.
spi_write_reg(CCxxx0_MDMCFG4, 0x2d); // 10 Modem configuration.
// 设定信道带宽BW=203kHz, 用户指定符号率的指数DRATE_E=13
spi_write_reg(CCxxx0_MDMCFG3, 0x3b); // 11 Modem configuration.
// 用户指定符号率的尾数
spi_write_reg(CCxxx0_MDMCFG2, 0x73); // 12 Modem configuration.
// 通信信号的调制格式=MSK, 失能曼切斯特编码/译码
// 开启TX时的重复同步词汇发送和RX时的32位同步词汇侦测(30/32同步词汇位被侦测)
spi_write_reg(CCxxx0_MDMCFG1, 0x22); // 13 Modem configuration.
// 失能FEC(前向误差校正), 发送的前导位最小数目=4,
spi_write_reg(CCxxx0_MDMCFG0, 0xf8); // 14 Modem configuration.
// 信道空间的8位尾数
spi_write_reg(CCxxx0_DEVIATN, 0x00); // 15 Modem dev (when FSK mod en)
// 当MSK调制启用时:设置相位转换所使用的符号周期的片断
spi_write_reg(CCxxx0_FREND1, 0xb6); // 21 Front end RX configuration.
// 前端RX配置
spi_write_reg(CCxxx0_FREND0, 0x10); // 22 Front end RX configuration.
// 选择PA功率设定,PATABLE的索引值=0
spi_write_reg(CCxxx0_FOCCFG, 0x1d); // 19 Freq Offset Compens. Config
// 频率偏移补偿配置
spi_write_reg(CCxxx0_BSCFG, 0x1c); // 1a Bit synchronization config.
// 位同步配置
spi_write_reg(CCxxx0_MCSM1, 0x3f); // 17 MainRadio Cntrl State Machine
// 接收完数据包后的下一状态 = 保持在RX
// 发送完数据包后的下一状态 = RX
spi_write_reg(CCxxx0_MCSM0, 0x18); // 18 MainRadio Cntrl State Machine
// 当从空闲到RX或TX(或FSTXON)自动进行校准
spi_write_reg(CCxxx0_AGCCTRL2, 0xc7); // 1b AGC control.
// AGC控制寄存器
spi_write_reg(CCxxx0_AGCCTRL1, 0x00); // 1c AGC control.
// AGC控制寄存器
spi_write_reg(CCxxx0_AGCCTRL0, 0xB2); // 1d AGC control.
// AGC控制寄存器
spi_write_reg(CCxxx0_FSCAL3, 0xea); // 23 Frequency synthesizer cal.
// 频率合成器校准配置和结果寄存器
spi_write_reg(CCxxx0_FSCAL2, 0x0a); // 24 Frequency synthesizer cal.
// 频率合成器校准配置和结果寄存器
spi_write_reg(CCxxx0_FSCAL1, 0x00); // 25 Frequency synthesizer cal.
// 频率合成器校准配置和结果寄存器
spi_write_reg(CCxxx0_FSCAL0, 0x11); // 26 Frequency synthesizer cal.
// 频率合成器校准配置和结果寄存器
spi_write_reg(CCxxx0_FSTEST, 0x59); // 29 Frequency synthesizer cal.
// 测试用。不需要写此寄存器
spi_write_reg(CCxxx0_TEST2, 0x88); // 2c Various test settings.
// 测试用。不需要写此寄存器
spi_write_reg(CCxxx0_TEST1, 0x31); // 2d Various test settings.
// 测试用。不需要写此寄存器
spi_write_reg(CCxxx0_TEST0, 0x0b); // 2e Various test settings.
// 测试用。不需要写此寄存器
调用了2500初始化后,通过写某个寄存器,然后将某个寄存器的值读出后,和写入的一致,应该是说明CC2500已经驱动完成,但是调用CC2500发送数据包,发下系统阻塞在GDO0脚,程序为
// Wait for GDO0 to be set -> sync transmitted
while(!GDO0);
// Wait for GDO0 to be cleared -> end of packet
while(GDO0);
通过示波器测试GDO0脚,发现GDO0脚永远为低电平。
有人知道问题会在哪里?如何解决
只测试了发送程序,对应的接收设备没有开启。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|