[STM32] stm32+cc1101 无线接收不到数据???急!急!急!

[复制链接]
 楼主| 涵潇舒雅 发表于 2014-6-23 16:42 | 显示全部楼层 |阅读模式
本帖最后由 涵潇舒雅 于 2014-6-23 16:49 编辑

cc1101在430单片机 无线通信没有问题,我移植到stm32上,stm32与cc1101之间的通信没有问题,一方发送,一方接收,

发送部分的程序
  1. halSpiStrobe(CCxxx0_SIDLE);
  2.                 delay_ms(10);
  3.                 halRfSendPacket(txBuffer,3);
  4.                 delay_ms(100);
  1. void halRfSendPacket(INT8U *txBuffer, INT8U size)
  2. {
  3. halSpiStrobe(CCxxx0_SFTX);//清空缓冲区
  4.     halSpiWriteReg(CCxxx0_TXFIFO, size);//这个必须要
  5.     halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size);        //写入要发送的数据
  6.     halSpiStrobe(CCxxx0_STX);                //进入发送模式发送数据
  7.     // Wait for GDO0 to be set -> sync transmitted
  8.     while (!(GDO0));
  9.     // Wait for GDO0 to be cleared -> end of packet
  10.     while (GDO0);
  11.   //halSpiStrobe(CCxxx0_SFTX);
  12. }
while (!(GDO0));
// Wait for GDO0 to be cleared -> end of packet
while (GDO0);
//halSpiStrobe(CCxxx0_SFTX);这条指令 能运行通过,没有卡住,说明发送成功?(不知道对不对)

接收部分的程序
  1.     halSpiStrobe(CCxxx0_SIDLE);
  2.                 delay_ms(10);
  3.                 halRfReceivePacket(rcBuffer,3);
  1. INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U length)
  2. {
  3.     INT8U status[2];
  4.     INT8U packetLength;
  5.         INT8U i=(length)*4;  // 具体多少要根据datarate和length来决定
  6.     halSpiStrobe(CCxxx0_SRX);                //进入接收状态
  7.         delay_us(100);
  8.     //while (GDO0)
  9.         while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4))
  10.     {
  11.         delay_us(100);
  12.                 --i;            
  13.     }
  14.          
  15.     if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
  16.     {
  17.                 packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
  18.                 if (packetLength <= length)                 //如果所要的有效数据长度小于等于接收到的数据包的长度
  19.                 {
  20.                         halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
  21.                         length = packetLength;                                //把接收数据长度的修改为当前数据的长度
  22.                         // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  23.                         halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);         //读出CRC校验位
  24.                         halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  25.                         return (status[1] & CRC_OK);                        //如果校验成功返回接收成功
  26.                 }
  27.                 else
  28.                 {
  29.                         length = packetLength;
  30.                         halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
  31.                         return 0;
  32.                 }
  33.                         
  34.     }
  35.         else
  36.          return 0;
  37. }
一直接收不到数据,

接收发送的寄存器配置都是一样的

  1. const RF_SETTINGS rfSettings =
  2. {
  3.         0x00,
  4.     0x08,   // FSCTRL1   Frequency synthesizer control.
  5.     0x00,   // FSCTRL0   Frequency synthesizer control.
  6.     0x10,   // FREQ2     Frequency control word, high byte.
  7.     0xA7,   // FREQ1     Frequency control word, middle byte.
  8.     0x62,   // FREQ0     Frequency control word, low byte.
  9.     0x5B,   // MDMCFG4   Modem configuration.
  10.     0xF8,   // MDMCFG3   Modem configuration.
  11.     0x03,   // MDMCFG2   Modem configuration.
  12.     0x22,   // MDMCFG1   Modem configuration.
  13.     0xF8,   // MDMCFG0   Modem configuration.

  14.     0x00,   // CHANNR    Channel number.
  15.     0x47,   // DEVIATN   Modem deviation setting (when FSK modulation is enabled).
  16.     0xB6,   // FREND1    Front end RX configuration.
  17.     0x10,   // FREND0    Front end RX configuration.
  18.     0x18,   // MCSM0     Main Radio Control State Machine configuration.
  19.     0x1D,   // FOCCFG    Frequency Offset Compensation Configuration.
  20.     0x1C,   // BSCFG     Bit synchronization Configuration.
  21.     0xC7,   // AGCCTRL2  AGC control.
  22.     0x00,   // AGCCTRL1  AGC control.
  23.     0xB2,   // AGCCTRL0  AGC control.

  24.     0xEA,   // FSCAL3    Frequency synthesizer calibration.
  25.     0x2A,   // FSCAL2    Frequency synthesizer calibration.
  26.     0x00,   // FSCAL1    Frequency synthesizer calibration.
  27.     0x11,   // FSCAL0    Frequency synthesizer calibration.
  28.     0x59,   // FSTEST    Frequency synthesizer calibration.
  29.     0x81,   // TEST2     Various test settings.
  30.     0x35,   // TEST1     Various test settings.
  31.     0x09,   // TEST0     Various test settings.
  32.     0x0B,   // IOCFG2    GDO2 output pin configuration.
  33.     0x06,   // IOCFG0D   GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

  34.     0x05,   // PKTCTRL1  Packet automation control.
  35.     0x05,   // PKTCTRL0  Packet automation control.
  36.     0x01,   // ADDR      Device address.
  37.     0x20    // PKTLEN    Packet length.
  38. };
小弟现在实在是找不到头绪了,望各位大神不吝赐教!!!!!!

NE5532 发表于 2014-6-23 20:46 | 显示全部楼层
楼主用的是CC1100的模块,另外加的MCU,还是MCU和无线模块做在同一块电路板上的?
 楼主| 涵潇舒雅 发表于 2014-6-24 09:25 | 显示全部楼层
NE5532 发表于 2014-6-23 20:46
楼主用的是CC1100的模块,另外加的MCU,还是MCU和无线模块做在同一块电路板上的? ...

另外加的mcu,现在能收到数据,但是收到的数据是乱码,crc校验过不了!!!!!
 楼主| 涵潇舒雅 发表于 2014-6-24 09:25 | 显示全部楼层
NE5532 发表于 2014-6-23 20:46
楼主用的是CC1100的模块,另外加的MCU,还是MCU和无线模块做在同一块电路板上的? ...

stm32+cc1101
NE5532 发表于 2014-6-24 09:34 | 显示全部楼层
那就没有硬件不同的影响,楼主需要自己核对初始化配置CC1101的相关函数,是否被正确移植,可以试着用读版本号、读RSSI、读AFC等方式来判断配置是否正常。
 楼主| 涵潇舒雅 发表于 2014-6-24 10:00 | 显示全部楼层
NE5532 发表于 2014-6-24 09:34
那就没有硬件不同的影响,楼主需要自己核对初始化配置CC1101的相关函数,是否被正确移植,可以试着用读版本 ...

我现在用stm32+cc1101发送,msp430+cc1101接收,数据是正常的,当msp430+cc1101发送,stm32接收的时候,数据就是乱码了???不知道为啥?寄存器配置都是一样的,直接拷贝过来的!!
NE5532 发表于 2014-6-24 11:04 | 显示全部楼层
那问题显然出在发送端,检查你发送端FIFO写、发送启动、发送完成标志查询这些步骤的函数是否有问题。432和STM32中断硬件、SPI端口硬件不同,代码上是肯定有差别的。
 楼主| 涵潇舒雅 发表于 2014-6-24 16:39 | 显示全部楼层
NE5532 发表于 2014-6-24 11:04
那问题显然出在发送端,检查你发送端FIFO写、发送启动、发送完成标志查询这些步骤的函数是否有问题。432和S ...

可能是我硬件的原因, 焊了几个板子,只有一对是正常的,斑竹我想问一下,cc1101地址滤波功能,接收方设置PKTCTRL1为0x05;开始地址滤波,addr=0x02;但是怎么在发送方把目标地址添加到发送包里,没有看到介绍啊??
NE5532 发表于 2014-6-24 16:48 | 显示全部楼层
没有用过CC1101,我用的是CC1020和SI4432,猜的话,收发两边的包结构寄存器应该是对应的,手册里应该有介绍,没有的,可以问TI技术支持。
 楼主| 涵潇舒雅 发表于 2014-6-24 17:06 | 显示全部楼层
NE5532 发表于 2014-6-24 16:48
没有用过CC1101,我用的是CC1020和SI4432,猜的话,收发两边的包结构寄存器应该是对应的,手册里应该有介绍 ...
  1. halSpiWriteReg(CCxxx0_TXFIFO, size);//这个必须要
  2.     halSpiWriteReg(CCxxx0_TXFIFO, 0x01);//目标地址
试了一下 这样就可以 谢谢斑竹的回复
 楼主| 涵潇舒雅 发表于 2014-6-26 10:56 | 显示全部楼层
NE5532 发表于 2014-6-24 16:48
没有用过CC1101,我用的是CC1020和SI4432,猜的话,收发两边的包结构寄存器应该是对应的,手册里应该有介绍 ...

斑竹 请教一下,您有没有用过WOR模式?
  1. u8 CC1101_InitWOR(u32 Time)
  2. {
  3.         //uint16 T_Event0=60; //把 EVENT0的时间设定为1S
  4.         u32 EVENT0=0;
  5.         u16 WOR_RES=1;
  6.         u16 WOR_rest=1; //2^(5*WOR_RES)的值
  7.         u8 t;

  8.         WORmode =1; //开启WORMOD模式
  9.         //当输入数据 不符合规则的时候返回错误
  10.         if(Time<15 | Time>61946643)
  11.                 return 0;
  12.         /* WOR WOR_RES设定
  13.   以WOR_RES所能区分的最大时限 区分WOR_RES大小
  14.   
  15.   WOR_RES值时间(极限最大值)(ms)
  16.   0 1890.4615 *14.34 (最小值)
  17.   1 60494.7692
  18.   2 1935832.6153
  19.   3 61946643.6923
  20.   */
  21.         if(Time<1890) WOR_RES=0;
  22.         else if(Time<60494) WOR_RES=1;
  23.         else if(Time<1935832) WOR_RES=2;
  24.         else if(Time<61946643) WOR_RES=3;
  25.         if(!WOR_RES)
  26.             WOR_rest=1;
  27.         else
  28.         {
  29.             for(t=0;t<(5*WOR_RES);t++)
  30.                 WOR_rest *= 2;
  31.         }
  32.         EVENT0 = F_xosc/1000;
  33.         if(EVENT0>Time)
  34.         {
  35.                 EVENT0 = EVENT0*Time;
  36.                 EVENT0 = EVENT0/(750*WOR_rest);
  37.         }
  38.         else
  39.         {
  40.                 EVENT0 = (Time/(750*WOR_rest))*EVENT0;
  41.         }
  42.        
  43.         halSpiStrobe(CCxxx0_SIDLE); //空闲模式

  44.         halSpiWriteReg(CCxxx0_MCSM2, 0x10); //RX_TIME 0 占空比最大
  45.         //在TX,RX后 自动校准XSOC时限 (10) 149-155uS
  46.         halSpiWriteReg(CCxxx0_MCSM0, 0x18); //校准 FS_AUTOCAL[1:0] 01 重IDLE转到TX OR RX模式时
  47.         //写入 事件0时间
  48.         halSpiWriteReg(CCxxx0_WOREVT1, (u8)(EVENT0>>8)); // High byte Event0 timeout
  49.         halSpiWriteReg(CCxxx0_WOREVT0, (u8)EVENT0); // Low byte Event0 timeout.
  50.         //启动 WOR RCosc校准
  51.         //因为进入休眠后只使用RC频率周期,RC受环境和温度影响较大,所以必须一段时间或者WOR唤醒后重新校准一次时钟.
  52.         //在WOR没启动之前 RC须得先行启动
  53.         // tEvent1时间设置为最大,设置 T_event1 ~ 1.4 ms
  54.         halSpiWriteReg(CCxxx0_WORCTRL, 0x78| WOR_RES); //tEvent1 =0111
  55. //          把SO口 设置成通知口 当有数据过来时 置低
  56.         halSpiWriteReg(CCxxx0_IOCFG2, 0x06); //0x24);
  57.        
  58.         halSpiStrobe(CCxxx0_SFRX);
  59.        
  60.         halSpiStrobe(CCxxx0_SWORRST); //复位到 事件1
  61.         halSpiStrobe(CCxxx0_SWOR); //启动WOR
  62.        
  63.         // CC1101_WriteCode(CCxxx0_SPWD); //进入断电模式
  64.         return 1;

  65. }
这是我的wor初始化,电流有突变,但是GDO2引脚没有电平变化,接收不到数据?
tiankun88 发表于 2014-11-15 09:36 | 显示全部楼层
哥们  能不能把你的发送 接收程序发给我参考一下 啊  我现在只能用STM32+CC1101进行发送,还不能用MSP430+CC1101接收啊  很是头疼 不知道哪里出现问题哦。如果可以就发到扣扣邮箱里979341713@qq.com
 楼主| 涵潇舒雅 发表于 2014-11-22 09:55 | 显示全部楼层
tiankun88 发表于 2014-11-15 09:36
哥们  能不能把你的发送 接收程序发给我参考一下 啊  我现在只能用STM32+CC1101进行发送,还不能用MSP430+C ...

已发送 请注意查收
tiankun88 发表于 2014-11-25 16:15 | 显示全部楼层
涵潇舒雅 发表于 2014-11-22 09:55
已发送 请注意查收

哥们,谢啦!430的程序我有,我自己写的程序是用430的程序移植到STM32上的,可是就是不能通信!
temmoo 发表于 2014-12-29 12:09 | 显示全部楼层
楼主我也遇到这样的问题,能发一份你调好的给我吗?我的邮箱是764786050@qq.com
rainam 发表于 2015-3-9 19:51 | 显示全部楼层
你好大哥,我遇到了和你一样的问题,能不能麻烦你将STM32+CC1101发送+接受的程序发给我学习一样,我是一个新手
rainam 发表于 2015-3-9 19:52 | 显示全部楼层
rainam 发表于 2015-3-9 19:51
你好大哥,我遇到了和你一样的问题,能不能麻烦你将STM32+CC1101发送+接受的程序发给我学习一样,我是一个 ...

我的邮箱是412509885@qq.com

评论

已发送  发表于 2015-4-17 16:23
abc583041743 发表于 2015-3-11 23:36 | 显示全部楼层
楼主啊~求程序哦~~~~感谢楼主~!!!!!!583041743@qq.com

评论

已发送  发表于 2015-4-17 16:23
tiankun88 发表于 2015-3-17 12:53 | 显示全部楼层
涵潇舒雅 发表于 2014-6-24 10:00
我现在用stm32+cc1101发送,msp430+cc1101接收,数据是正常的,当msp430+cc1101发送,stm32接收的时候, ...

大哥,能把STM32+CC1101发送的程序加MSP430+CC1101的程序发一份给我吗 谢啦!很长时间都找不到原因!
leinou 发表于 2015-4-11 15:32 | 显示全部楼层
你有么有成功啊,我的也是做SMT32+CC1101的接收,在spi2初始化以后,无法读取cc1101的寄存器,读出来都是0x00,一只检查引脚配置问题,但是都找不到原因。引脚部分跟stm8的引脚配置是一样的,下一步不知道怎么弄了,如果你弄好能否交流下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

164

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部