+ CC430 RF死机
时间:10-02
整理:3721RD
点击:
关于CC430F5137 RF部分运行着就死机的问题,这几天没有时间写,先留着帖子,晚上回去慢慢整理
-----------------------12月01日--------------------------
4天过去了,帖子翻的好快,一下子到该版块第八页了,找了半天。
现在开始正式讲述我对于TI无线的认知和分享。由于公司是做遥控器的,
所以涉及到公司保密的问题,我就不上传原文件了。
前段时间在调试CC430F5137程序,调了好久一直没找到原因,我先说一下现象。
CC430分为5系列MUC和CC1101内核,在作为遥控器和发射机使用时,经常会待机睡死。
比如我的接收器通电运行一天一夜后,第二天用遥控器来发射数据,但是发射器接收不到数据,
此时查看接收器的心跳LED仍然继续在跳,所以怀疑是RF部分死机,而单片机正常运行。
到目前为止还没排除是硬件问题所致还是软件缺陷。可能本人能力有限,所以我只能通过换方案来尝试。
现在初步打算换成Silicon的si4463+MSP430的方案试试,距离也比CC1101远。当然如果
我原来的CC430这个问题解决了我还是希望用这个方案的,因为我已经做了几百套遥控器放在仓库,
这损失也不少啊。
下面是这个遥控器的硬件,部分图纸和代码避免不必要的麻烦设置回复可见,希望把这个分享给大家,能给你的开发起到一点点作用。
- #include "Mysys_430.h"
- // 同步字宏定义
- #define Re_power_value 3 //接收功率值为07
- #define Tr_power_value 6 //发射功率值为07
- /**************************************
- CC430无线系统芯片设备设置的基本参数
- ***************************************/
- Uint8 RF_Frequency; //发射频率
- Uint8 RF_FRE_Group=0; //频率组
- Uint8 RF_CHANNR=0; //频道号
- Uint8 RF_ADDR_NO; //对方设备地址
- Uint8 RF_ADDR=0; //设备地址
- Uint8 RF_rx_power=0; //设备的接收功率
- Uint8 PATABLE_VAL=0; //发射功率级别
- Uint8 RF_FIFO_THR=7; //设置接收发送缓存门限值
- // 3:0 FIFO_THR[3:0] 设置接收发送缓存门限值;
- Uint8 RF_ADDR_chk=1; //设备地址校验状态
- //1:0 ADR_CHK[1:0] 控制是否进行地址校验:
- // 0 (00) 不进行地址校验
- // 1 (01) 地址校验,不接收地址广播
- // 2 (10) 地址校验,接收广播地址0x00
- // 3 (11) 地址校验,接收广播地址0x00和0xFF
- /**********************************/
- /****************************************
- CC430无线系统芯片4组基础频率的设置表
- FREQ0,FREQ1,FREQ2,TEST0的值
- RF_para_setting[0][x][x] 为315M的设置表
- RF_para_setting[1][x][x] 为433M的设置表
- *****************************************/
- const Uint8 RF_para_setting[2][4][4]={{{0x4A,0x1D,0x0C,0x0B}, {0x89,0x1D,0x0C,0x0B}, {0xC8,0x1D,0x0C,0x0B}, {0x07,0x1E,0x0C,0x0B}},
- {{0x99,0x89,0x10,0x0B}, {0XD8,0x89,0x10,0x0B}, {0x56,0x8A,0x10,0x0B},{0x17,0x8A,0x10,0x0B}}};
- // 433Mhz 10PF 10PF
- #define RF_FREQ2 RF_para_setting[RF_Frequency][RF_FRE_Group][2] //频率控制器2
- #define RF_FREQ1 RF_para_setting[RF_Frequency][RF_FRE_Group][1] //频率控制器1
- #define RF_FREQ0 RF_para_setting[RF_Frequency][RF_FRE_Group][0] //频率控制器0
- #define RF_TEST0 RF_para_setting[RF_Frequency][RF_FRE_Group][3] //频率测试值
- /*****************************************/
- /****************************************
- CC430无线发射的功率表,共8级
- 功率暂时不可调
- RF_PATABLE_TAB[0][8] 为315M的功率设置表
- RF_PATABLE_TAB[1][8] 为433M的功率设置表
- *****************************************/
- Uint8 RF_PATABLE_TAB[2][8]={{0x1A,0x24,0x27,0X2B,0X62,0X8B,0XCB,0XC0},
- {0x1A,0x24,0x27,0x68,0X40,0X8E,0x8B,0X85}};
- /*****************************************/
- void InitRadio(RF_SETTINGS *pRfSettings);
- void RF_sys_rfSetting_ini(RF_SETTINGS *pRfSettings);
- void Transmit(Uint8 *buffer, Uint8 length);
- void TI_CC_Wait(Uint16 cycles);
- Uint8 Transmit_Wait(Uint16 x);
- UINT8 halRfReceivePacket(Uint8 *rxBuffer, Uint8 *length) ; //接收无线数据
- /*****************************************
- 将初始化的参数值放入 rfSettings 数据结构中
- *******************************************/
- void RF_sys_rfSetting_ini(RF_SETTINGS *pRfSettings)
- {
-
- RF_Frequency=RF_basic_Frequency; //发射频率
- RF_FRE_Group=RF_basic_team; //组别
- RF_CHANNR=RF_frequency_channel; //频道号
- RF_ADDR=RF_Device_address_own; //本机地址
- RF_ADDR_NO=RF_Device_address_Other; //对方地址
- RF_rx_power=Re_power_value; //本机接收功率
- PATABLE_VAL=Tr_power_value; //本机发射功率
- RF_FIFO_THR=7;
- RF_ADDR_chk=0;
-
-
- pRfSettings->freq2=RF_FREQ2;
- pRfSettings->freq1=RF_FREQ1;
- pRfSettings->freq0=RF_FREQ0;
- pRfSettings->test0=RF_TEST0;
- pRfSettings->channr=RF_CHANNR;
- pRfSettings->fifothr&=0xF0;
- pRfSettings->fifothr|=RF_FIFO_THR;
- pRfSettings->pktctrl1&=0xFC;
- pRfSettings->pktctrl1|=RF_ADDR_chk;
-
- pRfSettings->frend0 &=0xF8;
- pRfSettings->frend0 |=PATABLE_VAL;
-
- pRfSettings->agcctrl2&=0xF8;
- pRfSettings->agcctrl2|=RF_rx_power; //本机接收功率
-
- pRfSettings->addr=RF_ADDR; //本机地址
- pRfSettings->sync1=RF_SYNC1;
- pRfSettings->sync0=RF_SYNC0; //同步字节
-
- }
- /**************************************************
- 无线内核写入程序
- ***************************************************/
- void InitRadio(RF_SETTINGS *pRfSettings)
- {
- // Set the High-Power Mode Request Enable bit so LPM3 can be entered
- // with active radio enabled
- PMMCTL0_H = 0xA5;
- PMMCTL0_L |= PMMHPMRE_L;
- PMMCTL0_H = 0x00;
-
- WriteRfSettings(pRfSettings);
- }
- /*******************************************************
- 无线内核初始化程序
- ********************************************************/
- void RF_sys_ini(void)
- {
- // Increase PMMCOREV level to 2 for proper radio operation
- // SetVCore(2); 在用电池时,需要用这个函数
- RF_sys_rfSetting_ini(&rfSettings); //首先更改参数表
- ResetRadioCore(); //复位无线内核
-
- InitRadio(&rfSettings); //初始化无线系统
- WriteBurstPATable(RF_PATABLE_TAB[RF_Frequency],8); //初始化发射功率
-
- RF_RX();
- Strobe( RF_SIDLE); //无线空闲模式,需要数据双向,这一句可以不要。
- }
- /*********************************************************
- 无线内核定时初始化程序
- ************************************************************/
- void RF_sys_Reset(void)
- {
- ResetRadioCore(); //复位无线内核
- InitRadio(&rfSettings); //初始化无线系统
- WriteBurstPATable(RF_PATABLE_TAB[RF_Frequency],8); //初始化发射功率
- RF_RX();
- }
- //---------------------------------------------------------------------------//
- //
- //! @brief RF_RX
- //! @author zozo
- //! @note
- //! @param void
- //! @return void
- //!
- //! @deprecated none
- //! @since 2010.9.13
- //! @see
- //---------------------------------------------------------------------------//
- void RF_RX(void)
- {
- RF1AIES |= BIT9; // Falling edge of RFIFG9
- RF1AIFG &= BIT9; // Clear a pending interrupt
- RF1AIE |= BIT9; // Enable the interrupt
-
- // Radio is in IDLE following a TX, so strobe SRX to enter Receive Mode
- Strobe( RF_SRX ); //进入接收状态
-
- receiving = 1; //准备接收
- }
- //---------------------------------------------------------------------------//
- //
- //! @brief
- //! @author zozo
- //! @note
- //!
- //! @param
- //!
- //! @return Uint8 1: TURE / 0: FALSE
- //!
- //! @deprecated none
- //! @since 2010.9.13
- //! @see
- //---------------------------------------------------------------------------//
- void ReceiveOff(void)
- {
- RF1AIE &= BIT9; // Disable RX interrupts
- RF1AIFG &= BIT9; // Clear pending IFG
- // It is possible that ReceiveOff is called while radio is receiving a packet.
- // Therefore, it is necessary to flush the RX FIFO after issuing IDLE strobe
- // such that the RXFIFO is empty prior to receiving a packet.
- Strobe( RF_SIDLE ); //进入空闲状态
- Strobe( RF_SFRX ); //清楚接收缓冲区
- }
- /************************************************************************
- 无线系统进入睡眠状态
- **************************************************************************/
- void RF_Sleep(void)
- {
- ReceiveOff();
- Strobe(RF_SPWD);
- }
- /************************************************************************
- 无线系统退出睡眠状态
- **************************************************************************/
- void RF_Sleep_exit(void)
- {
- Strobe( RF_SIDLE ); //进入空闲状态
- RF_RX(); //进入接收状态
- }
- //---------------------------------------------------------------------------//
- //
- //! @brief
- //! @author zozo
- //! @note
- //!
- //! @param
- //!
- //! @return Uint8 1: TURE / 0: FALSE
- //!
- //! @deprecated none
- //! @since 2010.9.13
- //! @see
- //---------------------------------------------------------------------------//
- Uint8 halRfReceivePacket(Uint8 *rxBuffer, Uint8 *length)
- {
- Uint8 status[2];
- Uint8 packetLength;
- if ((ReadSingleReg( RXBYTES )& NUM_RXBYTES))
- {
- // Read length byte
- packetLength = ReadSingleReg(RF_RXFIFORD);
- // Read data from RX FIFO and store in rxBuffer
- if (packetLength <=62)
- {
- ReadBurstReg(RF_RXFIFORD, rxBuffer, packetLength);
- *length = packetLength;
- // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
- ReadBurstReg(RF_RXFIFORD, status, 2);
- // Flush RX FIFO
- Strobe( RF_SFRX );
- // MSB of LQI is the CRC_OK bit
- return (status[CRC_LQI_IDX] & CRC_OK);
- }
- else
- {
- //*length = packetLength;
- *length = 0; //err process
- // Flush RX FIFO
- Strobe( RF_SFRX );
- return FALSE;
- }
- }
- else
- {
- //*length = packetLength;
- *length = 0; //err process
- // Flush RX FIFO
- Strobe( RF_SFRX );
- return FALSE;
- }
- }// halRfReceivePacket
- //---------------------------------------------------------------------------//
- //
- //! @brief
- //! @author zozo
- //! @note
- //!
- //! @param
- //!
- //! @return Uint8 1: TURE / 0: FALSE
- //!
- //! @deprecated none
- //! @since 2010.9.13
- //! @see
- //---------------------------------------------------------------------------//
- void Transmit(Uint8 *buffer, Uint8 length)
- {
- RF1AIES |= BIT9;
- RF1AIFG &= BIT9; // Clear pending interrupts
- RF1AIE |= BIT9; // Enable TX end-of-packet interrupt
- // *buffer=RF_rx_add;
- WriteBurstReg(RF_TXFIFOWR, buffer, length); //数据送入发送缓冲区,发送。
-
- Strobe( RF_STX ); // Strobe STX
- }
- //---------------------------------------------------------------------------//
- //
- //! @brief
- //! @author zozo
- //! @note
- //!
- //! @param
- //!
- //! @return Uint8 1: TURE / 0: FALSE
- //!
- //! @deprecated none
- //! @since 2010.9.13
- //! @see
- //---------------------------------------------------------------------------//
- void TI_CC_Wait(Uint16 cycles)
- {
- while(cycles>15) // 15 cycles consumed by overhead
- cycles = cycles - 6; // 6 cycles consumed each iteration
- }
- //---------------------------------------------------------------------------//
- //
- //! @brief
- //! @author zozo
- //! @note
- //!
- //! @param
- //!
- //! @return Uint8 1: TURE / 0: FALSE
- //!
- //! @deprecated none
- //! @since 2010.9.13
- //! @see
- //---------------------------------------------------------------------------//
- Uint8 Transmit_Wait(Uint16 x)
- {
- while((!HWREG_BIT_AND(RF1AIFG,BIT9)) && (x))//
- {
- x--;
- TI_CC_Wait(500);
- }
- if(x)
- return TRUE;
- else
- return FALSE;
- }// n*1ms
- //---------------------------------------------------------------------------//
- //
- //! @brief
- //! @author zozo
- //! @note
- //!
- //! @param
- //!
- //! @return Uint8 1: TURE / 0: FALSE
- //!
- //! @deprecated none
- //! @since 2010.9.13
- //! @see
- //---------------------------------------------------------------------------//
- Uint8 halRfSendPacket(Uint8 *txBuffer, Uint8 size)
- {
- Uint8 rc;
-
- //ReceiveOff();
- //receiving = 0;
- Transmit( txBuffer,size);
- // rc = Transmit_Wait(1000);
- // rc = Transmit_Wait(350); //延时21ms
- // rc = Transmit_Wait(5); //延时10ms
- rc = Transmit_Wait(2); //延时3ms
- return rc;
- }// halRfSendPacket
- /************************************************
- 无线中断程序
- 1.启动发射程序时:transmitting=1,receiving=0; 发送结束时,进入中断处理
- 2.在接收状态时:进入中断后,收到数据RF_rx_state=1,receiving_end=0,receiving=0
- 数据放在RxBuffer[]接收缓冲区中
- ************************************************/
- #pragma vector=CC1101_VECTOR
- __interrupt void CC1101_ISR(void)
- {
- // di();
- switch(__even_in_range(RF1AIV,32)) // Prioritizing Radio Core Interrupt
- {
- case 0: break; // No RF core interrupt pending
- case 2: break; // RFIFG0,使用IOCFG0(0X02)寄存器编程的GD0产生的中断
- case 4: break; // RFIFG1,使用IOCFG1(0X01)寄存器编程的GD1产生的中断
- case 6: break; // RFIFG2,使用IOCFG2(0X00)寄存器编程的GD2产生的中断
- case 8: break; // RFIFG3,该中断标志出现(上跳沿):RX FIFO填满或超过RX FIFO门限。
- // 该中断标志消失(下跳沿):RX FIFO跌落到RXFIFO门值以下。(相当于GDOx_CFG = 0)
- case 10: break; // RFIFG4,该中断标志出现(上跳沿):RX FIFO填满或超过RX FIFO门限或到达数据包结尾
- // 该中断标志消失(下跳沿):RX FIFO为空。(相当于GDOx_CFG = 1)
- case 12: break; // RFIFG5,该中断标志出现(上跳沿):TX FIFO填满或超过TX FIFO门限。
- // 该中断标志消失(下跳沿):TX FIFO跌落到TXFIFO门值以下。(相当于GDOx_CFG = 2)
- case 14: break; // RFIFG6,该中断标志出现(上跳沿):TX FIFO填满
- // 该中断标志消失(下跳沿):TX FIFO在TX FIFO门限之下。 (相当于GDOx_CFG = 3)
- case 16: break; // RFIFG7,该中断标志出现(上跳沿):RX FIFO溢出
- // 该中断标志消失(下跳沿):RX FIFO刷新。 (相当于GDOx_CFG = 4)
- case 18: break; // RFIFG8,该中断标志出现(上跳沿):TX FIFO下溢
- // 该中断标志消失(下跳沿):TX FIFO刷新。(相当于GDOx_CFG = 5)
- case 20: // RFIFG9,该中断标志出现(上跳沿):同步字被发送或接收到。
- // 该中断标志消失(下跳沿):数据包的结尾或在RX中可选参数地址检查失败时或 RX FIFO溢出
-
- if(receiving)
- {
-
- if(!RF_rx_state)
- {
- // halRfReceivePacket(&RxBuffer[1], &RxBuffer[0]);
- // RF_rx_state=1; //接收到数据
-
- if((halRfReceivePacket(&RxBuffer[1], &RxBuffer[0]))&&(RxBuffer[0]==((Data_LEN+RF_ID_lenth+4)<<1))) //CRC校验正确
- {
- RF_rx_state=1; //接收到数据
- }
-
-
- }
- // else
- // {
- // RF_RX();
- // }
- receiving_end = 1; // set receive flag
- receiving = 0; // no come in until process data
- }
- else // TX end of packet
- {
- HWREG_BIT_CLR(RF1AIE,BIT9); // Disable TX end-of-packet interrupt
- transmitting = 0;
- RF_tx_state=0; // 复位发射状态标志
- Strobe( RF_SIDLE ); //无线空闲
-
- // LED_off(LED_red3); //指示灯
- }
- //else while(1); // trap
-
- break;
- case 22: break; // RFIFG10,该中断标志出现(上跳沿):接收的数据包使用CRC检查正确。
- // 该中断标志消失(下跳沿):从RX FIFO中读取第一个字节。 (相当于GDOx_CFG = 7)
- case 24: break; // RFIFG11,该中断标志出现(上跳沿):测到的PQI的值在设定的PQT值之上
- // 该中断标志消失(下跳沿):(LPW) (相当于GDOx_CFG = 8)
- case 26: break; // RFIFG12,该中断标志出现(上跳沿):当RSSI电平低于阈值时(依赖于当前CCA_MODE的设置)空闲信道评估。
- // 该中断标志消失(下跳沿):RSSI电平高于阈值。(相当于GDOx_CFG = 9)
- case 28: break; // RFIFG13,该中断标志出现(上跳沿):载波传感器。RSSI电平高于阈值。
- // 该中断标志消失(下跳沿):RSSI的水平低于阈值。(相当于GDOx_CFG = 14)
- case 30: break; // RFIFG14,该中断标志出现(上跳沿):WOR的事件0。
- // 该中断标志消失(下跳沿):WOR的事件0 + 1 ACLK。(相当于GDOx_CFG = 36)
- case 32: break; // RFIFG15,该中断标志出现(上跳沿):WOR的事件1
- // 该中断标志消失(下跳沿):RF振荡器稳定或下一个WOR的event0触发。(相当于GDOx_CFG = 37)
- }
-
-
- Strobe( RF_SIDLE ); //进入空闲状态
- Strobe( RF_SFRX ); //清除接收缓冲区
- RF1AIFG=0; //清除所有中断标志
- // ei();
- //__bic_SR_register_on_exit(LPM3_bits);
- // LPM3_EXIT;
- }
好的好的,不着急,慢慢写
看一下
嗯 有同感 学习一下
学习学习
学习下,谢谢楼主!
楼主的问题现在解决了吗?应该是寄存器的设置问题,但是不知道怎么配置,请指教!