[STM32]

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

[复制链接]
9345|40
手机看帖
扫描二维码
随时随地手机跟帖
涵潇舒雅|  楼主 | 2014-6-23 16:42 | 显示全部楼层 |阅读模式
本帖最后由 涵潇舒雅 于 2014-6-23 16:49 编辑

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

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

接收部分的程序
    halSpiStrobe(CCxxx0_SIDLE);
                delay_ms(10);
                halRfReceivePacket(rcBuffer,3);
INT8U halRfReceivePacket(INT8U *rxBuffer, INT8U length) 
{
    INT8U status[2];
    INT8U packetLength;
        INT8U i=(length)*4;  // 具体多少要根据datarate和length来决定
    halSpiStrobe(CCxxx0_SRX);                //进入接收状态
        delay_us(100);
    //while (GDO0)
        while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4))
    {
        delay_us(100);
                --i;            
    }
         
    if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO)) //如果接的字节数不为0
    {
                packetLength = halSpiReadReg(CCxxx0_RXFIFO);//读出第一个字节,此字节为该帧数据长度
                if (packetLength <= length)                 //如果所要的有效数据长度小于等于接收到的数据包的长度
                {
                        halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength); //读出所有接收到的数据
                        length = packetLength;                                //把接收数据长度的修改为当前数据的长度
                        // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
                        halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);         //读出CRC校验位
                        halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
                        return (status[1] & CRC_OK);                        //如果校验成功返回接收成功
                }
                else
                {
                        length = packetLength;
                        halSpiStrobe(CCxxx0_SFRX);                //清洗接收缓冲区
                        return 0;
                }
                        
    }
        else
         return 0;
}
一直接收不到数据,

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

const RF_SETTINGS rfSettings = 
{
        0x00,
    0x08,   // 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.
    0x5B,   // MDMCFG4   Modem configuration.
    0xF8,   // MDMCFG3   Modem configuration.
    0x03,   // MDMCFG2   Modem configuration.
    0x22,   // MDMCFG1   Modem configuration.
    0xF8,   // MDMCFG0   Modem configuration.

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

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

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

相关帖子

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,猜的话,收发两边的包结构寄存器应该是对应的,手册里应该有介绍 ...
halSpiWriteReg(CCxxx0_TXFIFO, size);//这个必须要
    halSpiWriteReg(CCxxx0_TXFIFO, 0x01);//目标地址
试了一下 这样就可以 谢谢斑竹的回复

使用特权

评论回复
涵潇舒雅|  楼主 | 2014-6-26 10:56 | 显示全部楼层
NE5532 发表于 2014-6-24 16:48
没有用过CC1101,我用的是CC1020和SI4432,猜的话,收发两边的包结构寄存器应该是对应的,手册里应该有介绍 ...

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

        WORmode =1; //开启WORMOD模式
        //当输入数据 不符合规则的时候返回错误
        if(Time<15 | Time>61946643)
                return 0;
        /* WOR WOR_RES设定
  以WOR_RES所能区分的最大时限 区分WOR_RES大小
  
  WOR_RES值时间(极限最大值)(ms)
  0 1890.4615 *14.34 (最小值)
  1 60494.7692
  2 1935832.6153
  3 61946643.6923
  */
        if(Time<1890) WOR_RES=0;
        else if(Time<60494) WOR_RES=1;
        else if(Time<1935832) WOR_RES=2;
        else if(Time<61946643) WOR_RES=3;
        if(!WOR_RES)
            WOR_rest=1;
        else
        {
            for(t=0;t<(5*WOR_RES);t++)
                WOR_rest *= 2;
        }
        EVENT0 = F_xosc/1000;
        if(EVENT0>Time)
        {
                EVENT0 = EVENT0*Time;
                EVENT0 = EVENT0/(750*WOR_rest);
        }
        else
        {
                EVENT0 = (Time/(750*WOR_rest))*EVENT0;
        }
       
        halSpiStrobe(CCxxx0_SIDLE); //空闲模式

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

}
这是我的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 回复TA
已发送 
abc583041743| | 2015-3-11 23:36 | 显示全部楼层
楼主啊~求程序哦~~~~感谢楼主~!!!!!!583041743@qq.com

使用特权

评论回复
评论
涵潇舒雅 2015-4-17 16:23 回复TA
已发送 
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

粉丝