微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI无线射频设计 > + CC430 RF死机

+ CC430 RF死机

时间:10-02 整理:3721RD 点击:


关于CC430F5137 RF部分运行着就死机的问题,这几天没有时间写,先留着帖子,晚上回去慢慢整理
-----------------------12月01日--------------------------
4天过去了,帖子翻的好快,一下子到该版块第八页了,找了半天。
现在开始正式讲述我对于TI无线的认知和分享。由于公司是做遥控器的,
所以涉及到公司保密的问题,我就不上传原文件了。
前段时间在调试CC430F5137程序,调了好久一直没找到原因,我先说一下现象。
CC430分为5系列MUC和CC1101内核,在作为遥控器和发射机使用时,经常会待机睡死。
比如我的接收器通电运行一天一夜后,第二天用遥控器来发射数据,但是发射器接收不到数据,
此时查看接收器的心跳LED仍然继续在跳,所以怀疑是RF部分死机,而单片机正常运行。
到目前为止还没排除是硬件问题所致还是软件缺陷。可能本人能力有限,所以我只能通过换方案来尝试。
现在初步打算换成Silicon的si4463+MSP430的方案试试,距离也比CC1101远。当然如果
我原来的CC430这个问题解决了我还是希望用这个方案的,因为我已经做了几百套遥控器放在仓库,
这损失也不少啊。
下面是这个遥控器的硬件,部分图纸和代码避免不必要的麻烦设置回复可见,希望把这个分享给大家,能给你的开发起到一点点作用。




  1. #include "Mysys_430.h"


  2. // 同步字宏定义
  3. #define Re_power_value 3 //接收功率值为07
  4. #define Tr_power_value 6 //发射功率值为07

  5. /**************************************
  6. CC430无线系统芯片设备设置的基本参数
  7. ***************************************/
  8. Uint8 RF_Frequency; //发射频率
  9. Uint8 RF_FRE_Group=0; //频率组
  10. Uint8 RF_CHANNR=0; //频道号
  11. Uint8 RF_ADDR_NO; //对方设备地址
  12. Uint8 RF_ADDR=0; //设备地址
  13. Uint8 RF_rx_power=0; //设备的接收功率
  14. Uint8 PATABLE_VAL=0; //发射功率级别
  15. Uint8 RF_FIFO_THR=7; //设置接收发送缓存门限值
  16. // 3:0 FIFO_THR[3:0] 设置接收发送缓存门限值;
  17. Uint8 RF_ADDR_chk=1; //设备地址校验状态
  18. //1:0 ADR_CHK[1:0] 控制是否进行地址校验:
  19. // 0 (00) 不进行地址校验
  20. // 1 (01) 地址校验,不接收地址广播
  21. // 2 (10) 地址校验,接收广播地址0x00
  22. // 3 (11) 地址校验,接收广播地址0x00和0xFF
  23. /**********************************/


  24. /****************************************
  25. CC430无线系统芯片4组基础频率的设置表
  26. FREQ0,FREQ1,FREQ2,TEST0的值
  27. RF_para_setting[0][x][x] 为315M的设置表
  28. RF_para_setting[1][x][x] 为433M的设置表
  29. *****************************************/
  30. const Uint8 RF_para_setting[2][4][4]={{{0x4A,0x1D,0x0C,0x0B}, {0x89,0x1D,0x0C,0x0B}, {0xC8,0x1D,0x0C,0x0B}, {0x07,0x1E,0x0C,0x0B}},
  31. {{0x99,0x89,0x10,0x0B}, {0XD8,0x89,0x10,0x0B}, {0x56,0x8A,0x10,0x0B},{0x17,0x8A,0x10,0x0B}}};
  32. // 433Mhz 10PF 10PF
  33. #define RF_FREQ2 RF_para_setting[RF_Frequency][RF_FRE_Group][2] //频率控制器2
  34. #define RF_FREQ1 RF_para_setting[RF_Frequency][RF_FRE_Group][1] //频率控制器1
  35. #define RF_FREQ0 RF_para_setting[RF_Frequency][RF_FRE_Group][0] //频率控制器0
  36. #define RF_TEST0 RF_para_setting[RF_Frequency][RF_FRE_Group][3] //频率测试值
  37. /*****************************************/

  38. /****************************************
  39. CC430无线发射的功率表,共8级
  40. 功率暂时不可调
  41. RF_PATABLE_TAB[0][8] 为315M的功率设置表
  42. RF_PATABLE_TAB[1][8] 为433M的功率设置表
  43. *****************************************/
  44. Uint8 RF_PATABLE_TAB[2][8]={{0x1A,0x24,0x27,0X2B,0X62,0X8B,0XCB,0XC0},
  45. {0x1A,0x24,0x27,0x68,0X40,0X8E,0x8B,0X85}};

  46. /*****************************************/


  47. void InitRadio(RF_SETTINGS *pRfSettings);
  48. void RF_sys_rfSetting_ini(RF_SETTINGS *pRfSettings);
  49. void Transmit(Uint8 *buffer, Uint8 length);
  50. void TI_CC_Wait(Uint16 cycles);
  51. Uint8 Transmit_Wait(Uint16 x);
  52. UINT8 halRfReceivePacket(Uint8 *rxBuffer, Uint8 *length) ; //接收无线数据


  53. /*****************************************
  54. 将初始化的参数值放入 rfSettings 数据结构中
  55. *******************************************/
  56. void RF_sys_rfSetting_ini(RF_SETTINGS *pRfSettings)
  57. {

  58. RF_Frequency=RF_basic_Frequency; //发射频率
  59. RF_FRE_Group=RF_basic_team; //组别
  60. RF_CHANNR=RF_frequency_channel; //频道号
  61. RF_ADDR=RF_Device_address_own; //本机地址
  62. RF_ADDR_NO=RF_Device_address_Other; //对方地址
  63. RF_rx_power=Re_power_value; //本机接收功率
  64. PATABLE_VAL=Tr_power_value; //本机发射功率
  65. RF_FIFO_THR=7;
  66. RF_ADDR_chk=0;


  67. pRfSettings->freq2=RF_FREQ2;
  68. pRfSettings->freq1=RF_FREQ1;
  69. pRfSettings->freq0=RF_FREQ0;
  70. pRfSettings->test0=RF_TEST0;
  71. pRfSettings->channr=RF_CHANNR;
  72. pRfSettings->fifothr&=0xF0;
  73. pRfSettings->fifothr|=RF_FIFO_THR;
  74. pRfSettings->pktctrl1&=0xFC;
  75. pRfSettings->pktctrl1|=RF_ADDR_chk;

  76. pRfSettings->frend0 &=0xF8;
  77. pRfSettings->frend0 |=PATABLE_VAL;

  78. pRfSettings->agcctrl2&=0xF8;
  79. pRfSettings->agcctrl2|=RF_rx_power; //本机接收功率

  80. pRfSettings->addr=RF_ADDR; //本机地址
  81. pRfSettings->sync1=RF_SYNC1;
  82. pRfSettings->sync0=RF_SYNC0; //同步字节

  83. }

  84. /**************************************************
  85. 无线内核写入程序
  86. ***************************************************/
  87. void InitRadio(RF_SETTINGS *pRfSettings)
  88. {
  89. // Set the High-Power Mode Request Enable bit so LPM3 can be entered
  90. // with active radio enabled
  91. PMMCTL0_H = 0xA5;
  92. PMMCTL0_L |= PMMHPMRE_L;
  93. PMMCTL0_H = 0x00;

  94. WriteRfSettings(pRfSettings);
  95. }


  96. /*******************************************************
  97. 无线内核初始化程序
  98. ********************************************************/
  99. void RF_sys_ini(void)
  100. {
  101. // Increase PMMCOREV level to 2 for proper radio operation
  102. // SetVCore(2); 在用电池时,需要用这个函数
  103. RF_sys_rfSetting_ini(&rfSettings); //首先更改参数表
  104. ResetRadioCore(); //复位无线内核

  105. InitRadio(&rfSettings); //初始化无线系统
  106. WriteBurstPATable(RF_PATABLE_TAB[RF_Frequency],8); //初始化发射功率

  107. RF_RX();
  108. Strobe( RF_SIDLE); //无线空闲模式,需要数据双向,这一句可以不要。
  109. }

  110. /*********************************************************
  111. 无线内核定时初始化程序
  112. ************************************************************/
  113. void RF_sys_Reset(void)
  114. {

  115. ResetRadioCore(); //复位无线内核
  116. InitRadio(&rfSettings); //初始化无线系统
  117. WriteBurstPATable(RF_PATABLE_TAB[RF_Frequency],8); //初始化发射功率
  118. RF_RX();

  119. }
  120. //---------------------------------------------------------------------------//
  121. //
  122. //! @brief RF_RX
  123. //! @author zozo
  124. //! @note
  125. //! @param void
  126. //! @return void
  127. //!
  128. //! @deprecated none
  129. //! @since 2010.9.13
  130. //! @see
  131. //---------------------------------------------------------------------------//
  132. void RF_RX(void)
  133. {
  134. RF1AIES |= BIT9; // Falling edge of RFIFG9
  135. RF1AIFG &= BIT9; // Clear a pending interrupt
  136. RF1AIE |= BIT9; // Enable the interrupt

  137. // Radio is in IDLE following a TX, so strobe SRX to enter Receive Mode
  138. Strobe( RF_SRX ); //进入接收状态

  139. receiving = 1; //准备接收
  140. }
  141. //---------------------------------------------------------------------------//
  142. //
  143. //! @brief
  144. //! @author zozo
  145. //! @note
  146. //!
  147. //! @param
  148. //!
  149. //! @return Uint8 1: TURE / 0: FALSE
  150. //!
  151. //! @deprecated none
  152. //! @since 2010.9.13
  153. //! @see
  154. //---------------------------------------------------------------------------//
  155. void ReceiveOff(void)
  156. {
  157. RF1AIE &= BIT9; // Disable RX interrupts
  158. RF1AIFG &= BIT9; // Clear pending IFG

  159. // It is possible that ReceiveOff is called while radio is receiving a packet.
  160. // Therefore, it is necessary to flush the RX FIFO after issuing IDLE strobe
  161. // such that the RXFIFO is empty prior to receiving a packet.
  162. Strobe( RF_SIDLE ); //进入空闲状态
  163. Strobe( RF_SFRX ); //清楚接收缓冲区
  164. }


  165. /************************************************************************
  166. 无线系统进入睡眠状态
  167. **************************************************************************/
  168. void RF_Sleep(void)
  169. {
  170. ReceiveOff();
  171. Strobe(RF_SPWD);
  172. }

  173. /************************************************************************
  174. 无线系统退出睡眠状态
  175. **************************************************************************/
  176. void RF_Sleep_exit(void)
  177. {
  178. Strobe( RF_SIDLE ); //进入空闲状态
  179. RF_RX(); //进入接收状态
  180. }


  181. //---------------------------------------------------------------------------//
  182. //
  183. //! @brief
  184. //! @author zozo
  185. //! @note
  186. //!
  187. //! @param
  188. //!
  189. //! @return Uint8 1: TURE / 0: FALSE
  190. //!
  191. //! @deprecated none
  192. //! @since 2010.9.13
  193. //! @see
  194. //---------------------------------------------------------------------------//
  195. Uint8 halRfReceivePacket(Uint8 *rxBuffer, Uint8 *length)
  196. {
  197. Uint8 status[2];
  198. Uint8 packetLength;

  199. if ((ReadSingleReg( RXBYTES )& NUM_RXBYTES))
  200. {
  201. // Read length byte
  202. packetLength = ReadSingleReg(RF_RXFIFORD);

  203. // Read data from RX FIFO and store in rxBuffer
  204. if (packetLength <=62)
  205. {
  206. ReadBurstReg(RF_RXFIFORD, rxBuffer, packetLength);
  207. *length = packetLength;

  208. // Read the 2 appended status bytes (status[0] = RSSI, status[1] = LQI)
  209. ReadBurstReg(RF_RXFIFORD, status, 2);
  210. // Flush RX FIFO
  211. Strobe( RF_SFRX );
  212. // MSB of LQI is the CRC_OK bit
  213. return (status[CRC_LQI_IDX] & CRC_OK);
  214. }
  215. else
  216. {
  217. //*length = packetLength;
  218. *length = 0; //err process

  219. // Flush RX FIFO
  220. Strobe( RF_SFRX );
  221. return FALSE;
  222. }
  223. }
  224. else
  225. {
  226. //*length = packetLength;
  227. *length = 0; //err process

  228. // Flush RX FIFO
  229. Strobe( RF_SFRX );
  230. return FALSE;
  231. }
  232. }// halRfReceivePacket



  233. //---------------------------------------------------------------------------//
  234. //
  235. //! @brief
  236. //! @author zozo
  237. //! @note
  238. //!
  239. //! @param
  240. //!
  241. //! @return Uint8 1: TURE / 0: FALSE
  242. //!
  243. //! @deprecated none
  244. //! @since 2010.9.13
  245. //! @see
  246. //---------------------------------------------------------------------------//
  247. void Transmit(Uint8 *buffer, Uint8 length)
  248. {
  249. RF1AIES |= BIT9;
  250. RF1AIFG &= BIT9; // Clear pending interrupts
  251. RF1AIE |= BIT9; // Enable TX end-of-packet interrupt
  252. // *buffer=RF_rx_add;
  253. WriteBurstReg(RF_TXFIFOWR, buffer, length); //数据送入发送缓冲区,发送。

  254. Strobe( RF_STX ); // Strobe STX
  255. }


  256. //---------------------------------------------------------------------------//
  257. //
  258. //! @brief
  259. //! @author zozo
  260. //! @note
  261. //!
  262. //! @param
  263. //!
  264. //! @return Uint8 1: TURE / 0: FALSE
  265. //!
  266. //! @deprecated none
  267. //! @since 2010.9.13
  268. //! @see
  269. //---------------------------------------------------------------------------//
  270. void TI_CC_Wait(Uint16 cycles)
  271. {
  272. while(cycles>15) // 15 cycles consumed by overhead
  273. cycles = cycles - 6; // 6 cycles consumed each iteration
  274. }

  275. //---------------------------------------------------------------------------//
  276. //
  277. //! @brief
  278. //! @author zozo
  279. //! @note
  280. //!
  281. //! @param
  282. //!
  283. //! @return Uint8 1: TURE / 0: FALSE
  284. //!
  285. //! @deprecated none
  286. //! @since 2010.9.13
  287. //! @see
  288. //---------------------------------------------------------------------------//
  289. Uint8 Transmit_Wait(Uint16 x)
  290. {
  291. while((!HWREG_BIT_AND(RF1AIFG,BIT9)) && (x))//
  292. {
  293. x--;
  294. TI_CC_Wait(500);
  295. }
  296. if(x)
  297. return TRUE;
  298. else
  299. return FALSE;

  300. }// n*1ms

  301. //---------------------------------------------------------------------------//
  302. //
  303. //! @brief
  304. //! @author zozo
  305. //! @note
  306. //!
  307. //! @param
  308. //!
  309. //! @return Uint8 1: TURE / 0: FALSE
  310. //!
  311. //! @deprecated none
  312. //! @since 2010.9.13
  313. //! @see
  314. //---------------------------------------------------------------------------//
  315. Uint8 halRfSendPacket(Uint8 *txBuffer, Uint8 size)
  316. {
  317. Uint8 rc;

  318. //ReceiveOff();
  319. //receiving = 0;
  320. Transmit( txBuffer,size);
  321. // rc = Transmit_Wait(1000);
  322. // rc = Transmit_Wait(350); //延时21ms
  323. // rc = Transmit_Wait(5); //延时10ms
  324. rc = Transmit_Wait(2); //延时3ms
  325. return rc;
  326. }// halRfSendPacket




  327. /************************************************
  328. 无线中断程序
  329. 1.启动发射程序时:transmitting=1,receiving=0; 发送结束时,进入中断处理
  330. 2.在接收状态时:进入中断后,收到数据RF_rx_state=1,receiving_end=0,receiving=0
  331. 数据放在RxBuffer[]接收缓冲区中
  332. ************************************************/
  333. #pragma vector=CC1101_VECTOR
  334. __interrupt void CC1101_ISR(void)
  335. {
  336. // di();
  337. switch(__even_in_range(RF1AIV,32)) // Prioritizing Radio Core Interrupt
  338. {
  339. case 0: break; // No RF core interrupt pending
  340. case 2: break; // RFIFG0,使用IOCFG0(0X02)寄存器编程的GD0产生的中断
  341. case 4: break; // RFIFG1,使用IOCFG1(0X01)寄存器编程的GD1产生的中断
  342. case 6: break; // RFIFG2,使用IOCFG2(0X00)寄存器编程的GD2产生的中断
  343. case 8: break; // RFIFG3,该中断标志出现(上跳沿):RX FIFO填满或超过RX FIFO门限。
  344. // 该中断标志消失(下跳沿):RX FIFO跌落到RXFIFO门值以下。(相当于GDOx_CFG = 0)
  345. case 10: break; // RFIFG4,该中断标志出现(上跳沿):RX FIFO填满或超过RX FIFO门限或到达数据包结尾
  346. // 该中断标志消失(下跳沿):RX FIFO为空。(相当于GDOx_CFG = 1)
  347. case 12: break; // RFIFG5,该中断标志出现(上跳沿):TX FIFO填满或超过TX FIFO门限。
  348. // 该中断标志消失(下跳沿):TX FIFO跌落到TXFIFO门值以下。(相当于GDOx_CFG = 2)
  349. case 14: break; // RFIFG6,该中断标志出现(上跳沿):TX FIFO填满
  350. // 该中断标志消失(下跳沿):TX FIFO在TX FIFO门限之下。 (相当于GDOx_CFG = 3)
  351. case 16: break; // RFIFG7,该中断标志出现(上跳沿):RX FIFO溢出
  352. // 该中断标志消失(下跳沿):RX FIFO刷新。 (相当于GDOx_CFG = 4)
  353. case 18: break; // RFIFG8,该中断标志出现(上跳沿):TX FIFO下溢
  354. // 该中断标志消失(下跳沿):TX FIFO刷新。(相当于GDOx_CFG = 5)
  355. case 20: // RFIFG9,该中断标志出现(上跳沿):同步字被发送或接收到。
  356. // 该中断标志消失(下跳沿):数据包的结尾或在RX中可选参数地址检查失败时或 RX FIFO溢出

  357. if(receiving)
  358. {

  359. if(!RF_rx_state)
  360. {
  361. // halRfReceivePacket(&RxBuffer[1], &RxBuffer[0]);
  362. // RF_rx_state=1; //接收到数据

  363. if((halRfReceivePacket(&RxBuffer[1], &RxBuffer[0]))&&(RxBuffer[0]==((Data_LEN+RF_ID_lenth+4)<<1))) //CRC校验正确
  364. {
  365. RF_rx_state=1; //接收到数据
  366. }


  367. }
  368. // else
  369. // {
  370. // RF_RX();
  371. // }
  372. receiving_end = 1; // set receive flag
  373. receiving = 0; // no come in until process data
  374. }
  375. else // TX end of packet
  376. {
  377. HWREG_BIT_CLR(RF1AIE,BIT9); // Disable TX end-of-packet interrupt
  378. transmitting = 0;
  379. RF_tx_state=0; // 复位发射状态标志
  380. Strobe( RF_SIDLE ); //无线空闲

  381. // LED_off(LED_red3); //指示灯
  382. }
  383. //else while(1); // trap

  384. break;
  385. case 22: break; // RFIFG10,该中断标志出现(上跳沿):接收的数据包使用CRC检查正确。
  386. // 该中断标志消失(下跳沿):从RX FIFO中读取第一个字节。 (相当于GDOx_CFG = 7)
  387. case 24: break; // RFIFG11,该中断标志出现(上跳沿):测到的PQI的值在设定的PQT值之上
  388. // 该中断标志消失(下跳沿):(LPW) (相当于GDOx_CFG = 8)
  389. case 26: break; // RFIFG12,该中断标志出现(上跳沿):当RSSI电平低于阈值时(依赖于当前CCA_MODE的设置)空闲信道评估。
  390. // 该中断标志消失(下跳沿):RSSI电平高于阈值。(相当于GDOx_CFG = 9)
  391. case 28: break; // RFIFG13,该中断标志出现(上跳沿):载波传感器。RSSI电平高于阈值。
  392. // 该中断标志消失(下跳沿):RSSI的水平低于阈值。(相当于GDOx_CFG = 14)
  393. case 30: break; // RFIFG14,该中断标志出现(上跳沿):WOR的事件0。
  394. // 该中断标志消失(下跳沿):WOR的事件0 + 1 ACLK。(相当于GDOx_CFG = 36)
  395. case 32: break; // RFIFG15,该中断标志出现(上跳沿):WOR的事件1
  396. // 该中断标志消失(下跳沿):RF振荡器稳定或下一个WOR的event0触发。(相当于GDOx_CFG = 37)
  397. }


  398. Strobe( RF_SIDLE ); //进入空闲状态
  399. Strobe( RF_SFRX ); //清除接收缓冲区
  400. RF1AIFG=0; //清除所有中断标志
  401. // ei();
  402. //__bic_SR_register_on_exit(LPM3_bits);
  403. // LPM3_EXIT;
  404. }

复制代码

好的好的,不着急,慢慢写

看一下

嗯 有同感 学习一下

学习学习

学习下,谢谢楼主!

楼主的问题现在解决了吗?应该是寄存器的设置问题,但是不知道怎么配置,请指教!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top