This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1101:C1101接收器在&quot 处被吸入;while (GDO0);"一天之后被吸入

Guru**** 2586415 points
Other Parts Discussed in Thread: CC1101, CC1100

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/963519/cc1101-c1101-receiver-is-stucked-at-while-gdo0-after-one-day

器件型号:CC1101
主题中讨论的其他器件: CC1100

大家好、

我在接收器模式(433MHz)下的 CC1101出现问题。 起初、它正常工作、但一天之后、代码被占用在"while (GDO0)"上;它不读取任何值。

我使用 SFRX 进行溢出。

我使用 STM32F07xx MCU、我使用 SPI 连接。 我使用4MHz 振荡器。

我能理解,请帮我,我不能理解哪里出错了?

我的主接收器代码:

和接收器代码:

和 GDO 中断代码:

RF 初始化代码:

我的射频设置:

//地址配置=无地址检查
//基频= 432.999817
// CRC 自动刷新= false
// CRC 使能= true
//载波频率= 432.999817
//通道编号= 0
//通道间距= 199.951172
//数据格式=正常模式
//数据速率= 1.19948
//偏差= 25.390625
//设备地址= 0
//曼彻斯特启用= false
//调制= true
//调制格式= GFSK
// PA 斜升= false
//数据包长度= 20
//数据包长度模式=可变数据包长度模式。 由同步字之后的第一个字节配置的数据包长度
//前导码计数= 4
// RX 滤波器带宽= 101.562500
//同步字限定器模式= 16/16 +载波侦听高于阈值
// TX 功率= 0
// Whitening = false
//
// CC1101的射频设置
//

TI_WRITE_REG (CCxxx0_IOCFG2、0x29);//GDO2输出引脚配置
TI_WRITE_reg (CCxxx0_IOCFG1、0x2E);//GDO1输出引脚配置
TI_WRITE_REG (CCxxx0_IOCFG0、0x06);//GDO0输出引脚配置
TI_WRITE_reg (CCxxx0_FIFOHR、0x47);//RX FIFO 和 TX FIFO 阈值
TI_WRITE_reg (CCxxx0_SYNC1、0xD3);//同步字、高字节
TI_WRITE_reg (CCxxx0_SYNC0、0x91);//同步字、低字节
TI_WRITE_reg (CCxxx0_PKTLEN、0xFF);//数据包长度
TI_WRITE_REG (CCxxx0_PKTCTRL1、0x04);//数据包自动化控制
TI_WRITE_REG (CCxxx0_PKTCTRL0、0x05);//数据包自动化控制
TI_WRITE_reg (CCxxx0_ADDR、0x00);//器件地址
TI_WRITE_reg (CCxxx0_CHANNR、0x00);//通道编号
TI_WRITE_REG (CCxxx0_FSCTRL1、0x08);//频率合成器控制
TI_WRITE_REG (CCxxx0_FSCTRL0、0x00);//频率合成器控制
TI_WRITE_REG (CCxxx0_FREQ2、0x10);//频率控制字、高字节
TI_WRITE_reg (CCxxx0_FREQ1、0xB4);//频率控制字、中间字节
TI_WRITE_reg (CCxxx0_FREQ0、0x2E);//频率控制字、低字节
TI_WRITE_REG (CCxxx0_MDMCFG4、0xCA);//调制解调器配置
TI_WRITE_REG (CCxxx0_MDMCFG3、0x83);//调制解调器配置
TI_WRITE_reg (CCxxx0_MDMCFG2、0x93);//调制解调器配置
TI_WRITE_reg (CCxxx0_MDMCFG1、0x22);//调制解调器配置
TI_WRITE_reg (CCxxx0_MDMCFG0、0xF8);//调制解调器配置
TI_WRITE_REG (CCxxx0_DEVIATN、0x34);//调制解调器偏差设置
TI_WRITE_REG (CCxxx0_MCSM2、0x07);//主无线电控制状态机配置
TI_WRITE_REG (CCxxx0_MCSM1、0x30);//主无线电控制状态机配置
TI_WRITE_REG (CCxxx0_MCSM0、0x18);//主无线电控制状态机配置
TI_WRITE_reg (CCxxx0_FOCCFG、0x16);//频率偏移补偿配置
TI_WRITE_REG (CCxxx0_BSCFG、0x6C);//位同步配置
TI_WRITE_REG (CCxxx0_AGCCTRL2、0x43);//AGC 控制
TI_WRITE_reg (CCxxx0_AGCCTRL1、0x40);//AGC 控制
TI_WRITE_REG (CCxxx0_AGCCTRL0、0x91);//AGC 控制
TI_WRITE_REG (CCxxx0_WOREVT1、0x87);//高字节事件0超时
TI_WRITE_REG (CCxxx0_WOREVT0、0x6B);//低字节事件0超时
TI_WRITE_reg (CCxxx0_WORCTRL、0xf8);//无线电控制唤醒
TI_WRITE_reg (CCxxx0_FREND1、0x56);//前端 RX 配置
TI_WRITE_reg (CCxxx0_FREND0、0x10);//前端 TX 配置
TI_WRITE_reg (CCxxx0_FSCAL3、0xE9);//频率合成器校准
TI_WRITE_reg (CCxxx0_FSCAL2、0x2A);//频率合成器校准
TI_WRITE_reg (CCxxx0_FSCAL1、0x00);//频率合成器校准
TI_WRITE_REG (CCxxx0_FSCAL0、0x1F);//频率合成器校准
TI_WRITE_REG (CCxxx0_RCCTRL1、0x41);//RC 振荡器配置
TI_WRITE_REG (CCxxx0_RCCTRL0、0x00);//RC 振荡器配置
TI_WRITE_reg (CCxxx0_FSTEST、0x59);//频率合成器校准控制
TI_WRITE_reg (CCxxx0_ptest、0x7F);//生产测试
TI_WRITE_reg (CCxxx0_AGCTEST、0x3F);//AGC 测试
TI_WRITE_REG (CCxxx0_TEST2、0x81);//各种测试设置
TI_WRITE_reg (CCxxx0_TEST1、0x35);//各种测试设置
TI_WRITE_REG (CCxxx0_TEST0、0x09);//各种测试设置

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我的主接收器代码:

    //用于接收器调制解调器
    //Power_UP_RESET ();
    TI_init (&hspi1、CS_GPIO_Port、CS_Pin);
    POWER_UP_RESET ();
    TI_init (&hspi1、CS_GPIO_Port、CS_Pin);
    init_serial (&huart1);

    TI_WRITE_reg (CCxxx0_IOCFG0、0x06);

    REMOVE_TOOTERS_VALUE_PRV = 0;
    _HAL_GPIO_EXTI_CLEAR_IT (GPIO_PIN_0);
    HAL_NVIC_EnableIRQ (EXTI0_1_IRQn);

    /*用户代码末尾2 */

    /*无限循环*/
    /*用户代码在*/时开始
    while (1)

    #if Channal_Using //Kanal ayarı için
    RX_CHANNEL = HAL_GPIO_ReadPin (CHAN4_GPIO_Port、CHAN4_Pin)<< 3 | HAL_GPIO_ReadPin (CHAN3_GPIO_Port、CHAN3_Pin)<< 2 |
    HAL_GPIO_ReadPin (CHAN2_GPIO_Port、CHAN2_Pin)<< 1 | HAL_GPIO_ReadPin (CHAN1_GPIO_Port、CHAN1_Pin)<< 0;
    Input_Channal (Rx_channel);
    #else //测试 işleminde
    Input_Channal (CHANNAL_1);
    #endif

    _HAL_GPIO_EXTI_CLEAR_IT (GPIO_PIN_0);// Interruptın beklenen bitlerini temizler

    GDO0_FLAG = 0;//interrupta girip girmediğini anlamak için

    TI_STROBE (CCxxx0_SFRX);//接收器和发送器寄存器 ini 模板
    TI_STROBE (CCxxx0_SRX);
    RX_STATUS = TI_READ_STATUS (CCxxx0_RXBYTES);//gelen verilerin boyutunu söyler
    MARC_STATE = TI_READ_STATUS (CCxxx0_MARCSTATE);

    //如果(!(RX_state & 0x7f))继续;// gelen veri boyutu 0x7f geçmiyorsa devam et
    // Bunun nedeni fazla gelen veri boyutu 0-6 bit arasında olması
    while ((RX_state>>7)==1)//RX_M Ω BYTESın 7。 Biti 1 ise RX_overflow durumunda olmuştur è s
    {// RX bufferini temizleyip tekrar Okuma moduna geçilmektedir
    TI_STROBE (CCxxx0_sidle);//空闲调制 gelir
    TI_STROBE (CCxxx0_SFRX);//接收器 reglerini 模块化器
    TI_STROBE (CCxxx0_SRX);
    //NVIC_SystemReset();
    RX_STATUS = TI_READ_STATUS (CCxxx0_RXBYTES);//gelen verilerin boyutunu söyler

    while (GDO0_FLAG = 0);//gelen veri olduğunda while döngüsünden geçer
    LQI = TI_READ_STATUS (CCxxx0_LQI);// alınan sinyalin doğruluğunu belirtir
    //Sinyalin 0-6 bitleri LQI ve 7. biti ise CRC kontrol bitidir
    // Eğer crc biti 1 ise data tam gelmiştir、crc biti 0 ise data tam gelmemiştir
    RSS = TI_READ_STATUS (CCxxx0_RSSI);// alınan sinyalin gücünü belirtir

    //接收信号强度,alınan sinyalin gücüne göre çekim gücü
    if (rss < 125 && rss >= 15)
    ReceivedSignalStruth=3;
    否则(RSS < 15 && RSS >=-15)
    ReceivedSignalStruth=2;
    其他
    ReceivedSignalStruth=1;

    IF (LQI 和 CRC_OK)/*CRC_OK*/
    //0x80;LQI 状态寄存器7. 咬一口,热凝胶

    if (TI_receive_packet (buffer、&length)!= false)// Eğer paket Okuma ksiyonu false değeri göndermez ise aşağıdaki fonskiyonları başlatır

    REMOTE_buttons_Values = buffer[0];//RF kumandadan gelen buton değerlerini okuyoruz ilk 3位
    REMOTE_POT_VALUE = buffer[1];//RF kumandadaki POT değerlerini okuyoruz

    //RF kumandanın Seri numarasını okuyup 32 bitlik değişkenlere atadık
    RF_ID1 =(缓冲区[2]<<24)+(缓冲区[3]<<16)+(缓冲区[4]<8)+缓冲区[5];
    RF_ID2 =(buffer[6]<< 24)+(buffer[7]<< 16)+(buffer[8]<8)+ buffer[9];
    RF_ID3 =(buffer[10]<<24)+(buffer[11]<16)+(buffer[12]<8)+ buffer[13];
    RF_ID4 =(缓冲器[14]<<8)+缓冲器[15];

    REMOTE_SOFT_REV = buffer[16];//RF elcikten gelen yazılım sürümü
    REMOTE_HARD_rev = buffer[17];//RF elcikten gelen donanım sürümü
    REMOTE_BAT_LEVEL = buffer[18];//RF elciğin batarya seviyesi
    for (synq=0;synq < 6;synq++)//kumanda model adı

    remote_model[synq]= buffer[synq+19];

    for (synq=0;synq < 7;synq++)//kumanda tür adı

    REMOTE_TYP[synq]= buffer[synq+25];

    if (remote_buttons_values_prev!= remote_buttons_Values)

    //USB üzerinden gönderilecek veri
    CDC_Transmit _FS ((INT8_t*)消息、sprintf (消息、"[fpp]\Natur=FP RFR\nAMdl=R-100\Naseri=%2x%4x%x%x%x\nADnSrm=%d\nAYzSrm=%d\nKTur=%s\nKm=%nkm\nkm=%d\nkm\nkm=%d\nkm=%d\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm\nkm=%d\nkm\nd\n
    STM32F07_ID、STM32F07_Rev_ID、ID_U1、ID_U2、ID_U3、choused_Hard_Vers、 choosed_SOFT_Rev、
    REMOVE_TYPE、REMOVE_MODEL、RF_ID1、RF_ID2、RF_ID3、 rf_id4、remote_hard_rev、remote_soft_rev、remote_bat_level、ReceivedSignalStrh、
    遥控按钮值);
    REMOVE_TOOTERS_VALUES = REMOVE_TOOTERS_VALUES;

    否则 if (remote_pot_value_prev!= remote_pot_value)

    CDC_Transmit _FS ((INT8_t*)消息、sprintf (消息、"[fpp]\Natur=FP RFR\nAMdl=R-100\Naseri=%2x%4x%x%x%x\nADnSrm=%d\nAYzSrm=%d\nKTur=%s\nKm=%nkm\nkm=%nkm\nkm=%d\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm\nkm=%d\nkm\nkm=%d\nkm\nkm\nkm=%d\nkm\n
    STM32F07_ID、STM32F07_Rev_ID、ID_U1、ID_U2、ID_U3、choused_Hard_Vers、 choosed_SOFT_Rev、
    REMOVE_TYPE、REMOVE_MODEL、RF_ID1、RF_ID2、RF_ID3、 rf_id4、remote_hard_rev、remote_soft_rev、remote_bat_level、ReceivedSignalStrh、
    REMOTE POT_VALUE));
    REMOVE_POT_value_prev = REMOVE_POT_VALUE;

    LED_Control (ON);

    HAL_DELAY (20);

    LED_Control (关闭);

    其他

    signal_read_State_Flag = false;


    其他

    状态= TI_READ_STATUS (CCxxx0_PKTSTATUS);

    GDO0_FLAG = 0;

    /*用户代码结束,同时*/

    /*用户代码 begin 3 */

    /*用户代码结束3 */

    和接收器代码:


    bool TI_receive_packet (byte* rxBuffer、uint8 * length)

    字节 STATUS[2];
    uint8 packet_len;
    //此状态寄存器是安全读取的,因为它以后不会更新
    //数据包已被接收(请参阅 CC1100和2500勘误手册)


    IF (TI_READ_STATUS (CCxxx0_RXBYTES)& Bytes_in_RXFIFO)

    //读取长度字节
    packet_len = TI_read_reg (CCxxx0_RXFIFO);

    //从 RX FIFO 读取数据并将其存储在 rxBuffer 中
    如果(packet_len <=*长度)

    TI_READ_BURST_REG (CCxxx0_RXFIFO、rxBuffer、packet_len);
    *length = packet_len;

    //读取附加的2个状态字节(STATUS[0]= RSSI、STATUS[1]= LQI)
    TI_READ_BURST_REG (CCxxx0_RXFIFO、状态、2);

    // LQI 的 MSB 是 CRC_OK 位
    返回(STATUS[LQI]和 CRC_OK);

    其他

    *length = packet_len;

    //在清空 FIFO 之前确保对讲机处于空闲状态
    //(除非 RXOFF_MODE 已更改、否则此时无线电应处于空闲状态)
    TI_STROBE (CCxxx0_sidle);

    //刷新 RX FIFO
    TI_STROBE (CCxxx0_SFRX);
    return (false);


    否则返回(false);

    和 GDO 中断代码:

    /*配置 GPIO 引脚:GDO0_Pin */
    GPIO_InitStruct.Pin = GDO0_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    HAL_GPIO_Init (GDO0_GPIO_Port、&GPIO_InitStructt);

    /* EXTI 中断 init*/
    HAL_NVIC_setPriority (EXTI0_1_IRQn、0、0);
    HAL_NVIC_EnableIRQ (EXTI0_1_IRQn);

    /*用户代码 begin 4 */
    void HAL_GPIO_EXTI_Callback (uint16_t GPIO_Pin)

    if (GPIO_Pin = GDO0_Pin){
    GDO0_FLAG = 1;

    RF 初始化代码:


    void TI_init (SPI_HandleTypeDef* hspi、GPIO_typedef* cs_port、uint16_t cs_pin)

    //uint8 I;
    //uint16延迟;
    字节状态;
    HAL_SPI = hspi;
    CS_GPIO_Port = cs_port;
    CS_Pin = CS_Pin;

    for (int i=0;i<10;i++){
    状态= TI_READ_STATUS (CCxxx0_VERSION);
    if (status!= 0x14)



    TI_STROBE (CCxxx0_sidle);//ïåðåâîäèì ìîäåì â 空闲
    TI_STROBE (CCxxx0_SFRX);//î÷èùàåì RX FIFO
    TI_STROBE (CCxxx0_SFTX);//î÷èùàåì TX FIFO
    TI_write_settings();
    TI_WRITE_BURST_REG (CCxxx0_PATABLE、8);//为 true

    TI_WRITE_reg (CCxxx0_FIFOTHR、0x07);

    TI_STROBE (CCxxx0_sidle);//ïåðåâîäèì ìîäåì â 空闲
    TI_STROBE (CCxxx0_SFRX);//î÷èùàåì RX FIFO
    TI_STROBE (CCxxx0_SFTX);//î÷èùàåì TX FIFO

    TI_STROBE (CCxxx0_sidle);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    不确定我是否理解代码中正在进行的所有操作。

    首先、在频带 SRX 和在 GDO0上获得下降沿中断(IOCFG0 = 0x06)之间根本无需执行任何操作:

    while (1)
    {
    GDO0_FLAG = 0;
    TI_STROBE (CCxxx0_SFRX);
    TI_STROBE (CCxxx0_SRX);
    RX_STATUS = TI_READ_STATUS (CCxxx0_RXBYTES);
    MARC_STATE = TI_READ_STATUS (CCxxx0_MARCSTATE);
    
    //这不是必需的
    while ((RX_state>>7)==1)
    {
    TI_STROBE (CCxxx0_sidle);
    TI_STROBE (CCxxx0_SFRX);
    TI_STROBE (CCxxx0_SRX);
    RX_STATUS = TI_READ_STATUS (CCxxx0_RXBYTES);
    }
    
    //在轮循 RX 之后,只需等待中断即可
    while (GDO0_FLAG = 0);
    

    当您收到中断(GDO0_FLAG)时、您应该检查 FIFO 中是否有数据、如果有、您应该读取 FIFO 并检查 CRC。

    我看到您没有使用任何类型的长度过滤、但您的代码没有写入、因此您可以支持比 FIFO 更长的数据包。

    我猜您会遇到一些问题、例如您收到的一些长度字节大于61的噪声。 您要么未正确处理溢出、要么运行到勘误手册中描述的 RXFIFO_OVERflow 错误中。

    要验证溢出是否是一个问题、您可以首先发送长度大于61的虚拟数据包。 为此、您可以在发送器侧使用固定的数据包长度并发送62或更大的数据包作为第一个字节、以模拟大于61的长度字节。

    验证了这一点后、您可以通过设置 PKTLEN = 61在接收器上实施长度过滤

    Siri

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Siri、

    感谢您的回复。

    我向接收器调制解调器发送了62字节的数据包长度、接收器调制解调器被占用、您说过。  

    那么我的说明: CCxxx0_PKTLEN、0x3D 和 CCxxx0_FIFOHR、0x15、那么接收器不会卡住。  

    我删除了不是 cassary 代码。

    我会进行测试,但我不认为有任何问题。

    非常感谢。