为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > TI CC2530组网演练(BasicRF——无线控制灯的亮灭)

TI CC2530组网演练(BasicRF——无线控制灯的亮灭)

2017-11-28 34页 doc 171KB 136阅读

用户头像

is_062212

暂无简介

举报
TI CC2530组网演练(BasicRF——无线控制灯的亮灭)TI CC2530组网演练(BasicRF——无线控制灯的亮灭) TI CC2530组网演练(BasicRF——无线控制灯的亮灭) 本文将从两个方面着手,一方面分析TI官网下载的CC2530 BasicRF源码中的无线发送,另一方面根据自己的板子来修改实现无线发送控制灯的亮灭。 一、CC2530 BasicRF Basic RF由TI公司提供,它包含了IEEE 802.15.4标准的数据包的收发功能但并没有使用到协议栈,它仅仅是让两个节点进行简单的通信,也就是说Basic RF仅仅是包含着IEEE 802.15.4标准...
TI CC2530组网演练(BasicRF——无线控制灯的亮灭)
TI CC2530组网演练(BasicRF——无线控制灯的亮灭) TI CC2530组网演练(BasicRF——无线控制灯的亮灭) 本文将从两个方面着手,一方面TI官网下载的CC2530 BasicRF源码中的无线发送,另一方面根据自己的板子来修改实现无线发送控制灯的亮灭。 一、CC2530 BasicRF Basic RF由TI公司提供,它包含了IEEE 802.15.4的数据包的收发功能但并没有使用到协议栈,它仅仅是让两个节点进行简单的通信,也就是说Basic RF仅仅是包含着IEEE 802.15.4标准的一小部分而已。其主要特点有: 1、不会自动加入协议、也不会自动扫描其他节点、同时也没有组网指示灯(LED3) 2、没有协议栈里面所说的协调器、路由器或者终端的区分,节点的地位都是相等的 3、没有自动重发的功能 Basic RF layer为双向无线通信提供了一个简单的协议,通过这个协议能够进行数据的发送和接收。Basic RF还提供了安全所使用的CCM-64身份验证和数据加密,它的安全性在文件里定义SECURITY_CCM了。在Project->Option->C/C++ Compiler->Preprocess里面就选择,本次实验并不是什么高度机密,所有在SECURITY_CCM前面带X了。 Basic RF的工作过程:启动、发射、接收 工程文件分析 宏: MCU_IO_DIR_OUTPUT(port, pin); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_DIR_OUTPUT(port, pin);将端口port对应的pin位设置为输出(高电平) 3. * ##为连接符,如port=0,pin=1,即P0DIR |= BM(1); 4. **********************************************************************/ 5. #define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin) 6. #define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BM(pin); ) 7. #define st(x) do { x } while (__LINE__ == -1) 8. #define BM(n) (1 << (n)) MCU_IO_DIR_INPUT(port, pin); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_DIR_INPUT(port, pin);将端口port对应的pin位设置为输入(低电平) 3. **********************************************************************/ 4. #define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin) 5. #define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR |= ~BM(pin); ) 6. #define st(x) do { x } while (__LINE__ == -1) 7. #define BM(n) (1 << (n)) MCU_IO_GET(port, pin); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_GET(port, pin);获取端口port的对应位pin的电平值 3. **********************************************************************/ 4. #define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) 5. #define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) 6. #define BM(n) (1 << (n)) MCU_IO_TGL(port, pin); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_TGL(port, pin);将端口port的对应位pin的电平值设置为相反电平 3. **********************************************************************/ 4. #define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin) 5. #define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; ) 6. #define st(x) do { x } while (__LINE__ == -1) MCU_IO_SET_LOW(port, pin); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_SET_LOW(port, pin);将端口port的对应位pin设置为低电平 3. **********************************************************************/ 4. #define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin) 5. #define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; ) 6. #define st(x) do { x } while (__LINE__ == -1) MCU_IO_SET_HIGH(port, pin); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_SET_HIGH(port, pin);将端口port的对应位pin设置为高电平 3. **********************************************************************/ 4. #define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin) 5. #define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; ) 6. #define st(x) do { x } while (__LINE__ == -1) MCU_IO_SET(port, pin, val); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_SET(port, pin, val);将端口port的对应位pin的电平值设置为val 3. **********************************************************************/ 4. #define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val) 5. #define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) 6. #define st(x) do { x } while (__LINE__ == -1) MCU_IO_OUTPUT(port, pin, val); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_OUTPUT(port, pin, val);将端口port的对应位pin的电平值设置为val 3. * 并且将此IO设置为通用IO,以及设置为输出 4. **********************************************************************/ 5. #define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val) 6. #define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BM(pin); \ 7. P##port##_##pin## = val; \ 8. P##port##DIR |= BM(pin); ) 9. #define st(x) do { x } while (__LINE__ == -1) MCU_IO_OUTPUT(port, pin, func); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_INPUT(port, pin, func);将端口port的对应位pin的设置为通用IO 3. * 并将此IO口设置为func输入模式:上拉、下拉、默认模式(三态) 4. * func指的是IO口的输入模式:MCU_IO_PULLUP、MCU_IO_PULLDOWN、默认模 式 5. **********************************************************************/ 6. #define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func) 7. #define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BM(pin); \ 8. P##port##DIR &= ~BM(pin); \ 9. switch (func) { \ 10. case MCU_IO_PULLUP: \ 11. P##port##INP &= ~BM(pin) ; \ 12. P2INP &= ~BM(port + 5); \ 13. break; \ 14. case MCU_IO_PULLDOWN: \ 15. P##port##INP &= ~BM(pin) ; \ 16. P2INP |= BM(port + 5); \ 17. break; \ 18. default: \ 19. P##port##INP |= BM(pin); \ 20. break; } ) 21. #define st(x) do { x } while (__LINE__ == -1) MCU_IO_PERIPHERAL(port, pin); [cpp] view plaincopyprint? 1. /*********************************************************************** 2. * MCU_IO_PERIPHERAL(port, pin);将端口port的对应位pin的设置为外设功 能 3. **********************************************************************/ 4. #define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin) 5. #define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BM(pin); ) 6. #define BM(n) (1 << (n)) light_switch.c——main函数 [cpp] view plaincopyprint? 1.
void main(void) 
2. { 
3. uint8 appMode = LIGHT; 
4. 
5. // Config basicRF 
6. basicRfConfig.panId = PAN_ID; //网络地址,0x2007 7. basicRfConfig.channel = RF_CHANNEL; //通道,25 // 2.4 GHz RF channel 8. basicRfConfig.ackRequest = TRUE; //是否应当, 1 9. #ifdef SECURITY_CCM 
10. basicRfConfig.securityKey = key; 
11. #endif 
12. 
13. // Initalise board peripherals 
14. /* 
15. * 一些GPIO口初始化,包括以下LEDs和Buttons初始化 
16. * 将LEDs(P0_0、P1_1、P1_4、P0_1)设置为输出、Buttons(P0_1)设置为输入模式且为
三态输入模式 
17. */ 
18. halBoardInit(); 
19. /* 
20. * 多方向按键初始化,不用管 
21. */ 
22. halJoystickInit(); 
23. 
24. // Initalise hal_rf 硬件抽象层rf初始化 25. if(halRfInit()==FAILED) { 
26. HAL_ASSERT(FALSE); 
27. } 
28. 
29. // Indicate that device is powered 将按键1设置为高电平,并将状态设置为1 
30. /* 
31. switch (id) 
32. { 
33. case 1: HAL_LED_SET_1(); break; 
34. case 2: HAL_LED_SET_2(); break; 
35. case 3: HAL_LED_SET_3(); break; 
36. case 4: HAL_LED_SET_4(); led4State=1; break; 37. 
38. default: break; 
39. } 
40. 
41. #define HAL_LED_SET_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED
_1_PORT, HAL_BOARD_IO_LED_1_PIN) 
42. #define HAL_LED_SET_2() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED
_2_PORT, HAL_BOARD_IO_LED_2_PIN) 
43. #define HAL_LED_SET_3() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED
_3_PORT, HAL_BOARD_IO_LED_3_PIN) 
44. #define HAL_LED_SET_4() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED
_4_PORT, HAL_BOARD_IO_LED_4_PIN) 
45. 
46. #define HAL_BOARD_IO_LED_1_PORT 1 // Green 47. #define HAL_BOARD_IO_LED_1_PIN 0 48. #define HAL_BOARD_IO_LED_2_PORT 1 // Red 49. #define HAL_BOARD_IO_LED_2_PIN 1 50. #define HAL_BOARD_IO_LED_3_PORT 1 // Yellow 51. #define HAL_BOARD_IO_LED_3_PIN 4 52. #define HAL_BOARD_IO_LED_4_PORT 0 // Orange 53. #define HAL_BOARD_IO_LED_4_PIN 1 54. */ 
55. halLedSet(1); 
56. 
57. // Print Logo and splash screen on LCD 
58. utilPrintLogo("Light Switch"); //有关LCD的函数不管 
59. 
60. // Wait for user to press S1 to enter menu 61. while (halButtonPushed()!=HAL_BUTTON_1); 62. halMcuWaitMs(350); 
63. halLcdClear(); //lcd清屏,不用管 64. 
65. // Set application role 
66. appMode = appSelectMode(); //模式选择 67. halLcdClear(); 
68. 
69. // Transmitter application 
70. if(appMode == SWITCH) { 
71. // No return from here 
72. appSwitch(); 
73. } 
74. // Receiver application 
75. else if(appMode == LIGHT) { 
76. // No return from here 
77. appLight(); 
78. } 
79. // Role is undefined. This code should not be reached 
80. HAL_ASSERT(FALSE); 
81. } 
hal_board.c——halBoardInit()函数实现 
[cpp] view plaincopyprint? 
1. void halBoardInit(void) 
2. { 
3. //mcu初始化,设置系统时钟 
4. halMcuInit(); 
5. 
6. // LEDs 
7. #ifdef SRF05EB_VERSION_1_3 
8. // SmartRF05EB rev 1.3 has only one accessible LED 
9. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN); 
10. HAL_LED_CLR_1(); 
11. #else 
12. /* 
13. * LEDs(P0_0、P1_1、P1_4、P0_1)设置为输出 
14. */ 
15. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN); 16. HAL_LED_CLR_1(); 
17. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN); 18. HAL_LED_CLR_2(); 
19. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN); 20. HAL_LED_CLR_3(); 
21. MCU_IO_DIR_OUTPUT(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN); 22. HAL_LED_CLR_4(); 
23. #endif 
24. 
25. // Buttons 
26. /* 
27. * Buttons(P0_1)设置为输入模式且为三态输入模式 
28. */ 
29. MCU_IO_INPUT(HAL_BOARD_IO_BTN_1_PORT, HAL_BOARD_IO_BTN_1_PIN, MCU_IO_TRI
STATE); 
30. 
31. // Joystick push input 多方向按键 三态输入模式 
32. MCU_IO_INPUT(HAL_BOARD_IO_JOY_MOVE_PORT, HAL_BOARD_IO_JOY_MOVE_PIN, \ 33. MCU_IO_TRISTATE); 
34. 
35. // Analog input adc模拟,设置对应引脚为外部功能 
36. MCU_IO_PERIPHERAL(HAL_BOARD_IO_JOYSTICK_ADC_PORT, HAL_BOARD_IO_JOYSTICK_
ADC_PIN); 
37. 
38. //lcd初始化 
39. halLcdSpiInit(); 
40. halLcdInit(); 
41. 
42. /* 
43. * halIntOn:开启全局中断-->HAL_INT_ON-->st( EA = 1; ) 44. */ 
45. halIntOn(); 
46. } 
hal_rf.c——halRfInit()函数实现 
[cpp] view plaincopyprint? 
1. uint8 halRfInit(void) 
2. { 
3. // Enable auto ack and auto crc 4. /* 
5. * #define FRMCTRL0 XREG( 0x6189 ) 6. * #define XREG(addr) ((unsigned char volatile __xdata *) 0)[addr]
7. * 即往寄存器FRMCTRL0(0x6189)写数据 8. * #define AUTO_ACK 0x20 
9. * #define AUTO_CRC 0x40 
10. */ 
11. FRMCTRL0 |= (AUTO_ACK | AUTO_CRC); 12. 
13. // Recommended RX settings 
14. /* 
15. * #define TXFILTCFG XREG( 0x61FA ) 16. * #define AGCCTRL1 XREG( 0x61B2 ) 17. * #define FSCAL1 XREG( 0x61AE ) 18. */ 
19. TXFILTCFG = 0x09; //调整AGC目标值 20. AGCCTRL1 = 0x15; //设置 TX 抗混叠过滤器以获得合适的贷款 
21. FSCAL1 = 0x00; //和默认设置比较,降低VCO泄露大约3dB。推荐默认设置以
获得最佳 EVM 
22. 
23. // Enable random generator -> Not implemented yet 24. 
25. // Enable CC2591 with High Gain Mode 26. halPaLnaInit();//在CC2530中此函数没有做任何操作 27. 
28. // Enable RX interrupt 使能接收中断 29. /* 
30. * RFIRQM0 |= BV(6); 
31. * IEN2 |= BV(0); 
32. * #define BV(n) (1 << (n)) 33. */ 
34. halRfEnableRxInterrupt(); 
35. 
36. return SUCCESS; 
37. } 


light_switch.c——appSwitch()、appLight()函数实现 [cpp] view plaincopyprint? 
1. static void appSwitch() 
2. { 
3. //lcd有关操作不用管 
4. halLcdWriteLine(HAL_LCD_LINE_1, "Switch"); 
5. halLcdWriteLine(HAL_LCD_LINE_2, "Joystick Push"); 
6. halLcdWriteLine(HAL_LCD_LINE_3, "Send Command"); 7. #ifdef ASSY_EXP4618_CC2420 //没有定义 
8. halLcdClearLine(1); 
9. halLcdWriteSymbol(HAL_LCD_SYMBOL_TX, 1); 
10. #endif 
11. 
12. pTxData[0] = LIGHT_TOGGLE_CMD; // #define LIGHT_TOGGLE_CMD 0 //被传输
的开关命令 
13. 
14. // Initialize BasicRF 
15. basicRfConfig.myAddr = SWITCH_ADDR; //#define SWITCH_ADDR 0x2520 //开关
节点的地址 
16. if(basicRfInit(&basicRfConfig)==FAILED) { 
17. HAL_ASSERT(FALSE); 
18. } 
19. 
20. // Keep Receiver off when not needed to save power 关闭接收 21. basicRfReceiveOff(); 
22. 
23. // Main loop 
24. while (TRUE) { 
25. if( halJoystickPushed() ) { //判断多方向按键是否按下 26. 
27. basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//发送
命令 
28. 
29. // Put MCU to sleep. It will wake up on joystick interrupt 30. halIntOff(); 
31. halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global 32. // interrupt enable 
33. halIntOn(); 
34. 
35. } 
36. } 
37. } 
[cpp] view plaincopyprint? 
1. static void appLight() 
2. { 
3. halLcdWriteLine(HAL_LCD_LINE_1, "Light"); 4. halLcdWriteLine(HAL_LCD_LINE_2, "Ready"); 5. 
6. #ifdef ASSY_EXP4618_CC2420 
7. halLcdClearLine(1); 
8. halLcdWriteSymbol(HAL_LCD_SYMBOL_RX, 1); 9. #endif 
10. 
11. // Initialize BasicRF 
12. basicRfConfig.myAddr = LIGHT_ADDR; //#define LIGHT_ADDR 0xBEEF //电灯
节点的地址 
13. if(basicRfInit(&basicRfConfig)==FAILED) { 14. HAL_ASSERT(FALSE); 
15. } 
16. //使能接收 
17. basicRfReceiveOn(); 
18. 
19. // Main loop 
20. while (TRUE) { 
21. while(!basicRfPacketIsReady());//检查是否收到一个新数据包 
22. 
23. if(basicRfReceive(pRxData, APP_PAYLOAD_LENGTH, NULL)>0) { //收到的数
据复制到pRxData中 
24. if(pRxData[0] == LIGHT_TOGGLE_CMD) { 25. halLedToggle(1); //将其对应的LED1设置相反电平 
26. } 
27. } 
28. } 
29. } 
basic_rf.h——basicRfCfg_t结构体定义 
[cpp] view plaincopyprint? 
1. typedef struct { 
2. uint16 myAddr; //16位短地址(就是节点地址) 
3. uint16 panId; //节点的PAN(个人局域网) ID 4. uint8 channel; //RF通道(必须在11-26之间) 5. uint8 ackRequest; //目标确定就置true 6. #ifdef SECURITY_CCM //是否加密 
7. uint8* securityKey; 
8. uint8* securityNonce; 
9. #endif 
10. } basicRfCfg_t; 
basic_rf.c——basicRfPacketIsReady()、basicRfReceive()、basicRfSendPacket()
函数实现 
[cpp] view plaincopyprint? 
1. uint8 basicRfPacketIsReady(void) 
2. { 
3. /* 
4. * static basicRfRxInfo_t rxi= { 0xFF }; // Make sure sequence numbers 
are 
5. * 确保数据序列号为0xFF 
6. */ 
7. return rxi.isReady; 
8. } 
[cpp] view plaincopyprint? 
1. uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi) 2. { 
3. // Accessing shared variables -> this is a critical region 4. // Critical region start 
5. halIntOff(); 
6. memcpy(pRxData, rxi.pPayload, min(rxi.length, len)); 7. if(pRssi != NULL) { 
8. if(rxi.rssi < 128){ 
9. *pRssi = rxi.rssi - halRfGetRssiOffset(); 10. } 
11. else{ 
12. *pRssi = (rxi.rssi - 256) - halRfGetRssiOffset(); 
13. } 
14. } 
15. rxi.isReady = FALSE; 
16. halIntOn(); 
17. 
18. // Critical region end 
19. 
20. return min(rxi.length, len); 
21. } 
[cpp] view plaincopyprint? 
1. uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length) 
2. { 
3. uint8 mpduLength; 
4. uint8 status; 
5. 
6. // Turn on receiver if its not on 7. if(!txState.receiveOn) { 
8. halRfReceiveOn(); 
9. } 
10. 
11. // Check packet length 
12. length = min(length, BASIC_RF_MAX_PAYLOAD_SIZE); 13. 
14. // Wait until the transceiver is idle 15. halRfWaitTransceiverReady(); 
16. 
17. // Turn off RX frame done interrupt to avoid interference on the SPI int
erface 
18. halRfDisableRxInterrupt(); 
19. 
20. mpduLength = basicRfBuildMpdu(destAddr, pPayload, length); 
21. 
22. #ifdef SECURITY_CCM 
23. halRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BAS
IC_RF_SECURITY_M); 
24. txState.frameCounter++; // Increment frame counter field 25. #else 
26. halRfWriteTxBuf(txMpdu, mpduLength); 
27. #endif 
28. 
29. // Turn on RX frame done interrupt for ACK reception 30. halRfEnableRxInterrupt(); 
31. 
32. // Send frame with CCA. return FAILED if not successful 33. if(halRfTransmit() != SUCCESS) { 
34. status = FAILED; 
35. } 
36. 
37. // Wait for the acknowledge to be received, if any 38. if (pConfig->ackRequest) { 
39. txState.ackReceived = FALSE; 
40. 
41. // We'll enter RX automatically, so just wait until we can be sure t
hat the ack reception should have finished 
42. // The timeout consists of a 12-symbol turnaround time, the ack pack
et duration, and a small margin 
43. halMcuWaitUs((12 * BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATIO
N) + (2 * BASIC_RF_SYMBOL_DURATION) + 10); 
44. 
45. // If an acknowledgment has been received (by RxFrmDoneIsr), the ack
Received flag should be set 
46. status = txState.ackReceived ? SUCCESS : FAILED; 47. 
48. } else { 
49. status = SUCCESS; 
50. } 
51. 
52. // Turn off the receiver if it should not continue to be enabled 53. if (!txState.receiveOn) { 
54. halRfReceiveOff(); 
55. } 
56. 
57. if(status == SUCCESS) { 
58. txState.txSeqNumber++; 
59. } 
60. 
61. #ifdef SECURITY_CCM 
62. halRfIncNonceTx(); // Increment nonce value 
63. #endif 
64. 
65. return status; 
66. 
67. } 
二、无线控制灯的亮灭 
实现:通过按S1键来控制另一个板子上的LED1灯的亮灭 
1、电路原理图 

2、分析 
既然要实现通过按S1键来控制另一个板子上的LED1灯的亮灭,那么首先需要将被控制版上的LED1对应的P1_0设置为输出模式,且当P1_为低电平时LED1等亮,为高电平时LED1等灭。以及将控制板上的S1对应的P0_4设置为输入模式,当检测到P0_4引脚为低电平示按键S1被按下,反之为高电平时表示按键S1没有被按下。由于
CC2530中的无线发送功能是内置的,不是外设,即TI官网下载的CC2530 BasicRF中的无线发送代码仍然适合我的板子,不需要怎么修改。这样,将按键S1端作为无线发送的发送端,而LED1端作为无线发送的接收端。 
根据上面的代码分析,来实现自己的无线点灯,代码修改如下: 
(1)、首先根据上面的分析,可以知道TI官网的CC2530 BasicRF中有4个LED,其分别是P0_0、P1_1、P1_4、P0_1,而我的板子中有个两个LED灯,分别是LED1(P1_0)、LED2(P1_1)。所有需要修改LED1的引脚定义,修改hal_board.h对应LEDs的引脚定义处。 
修改前: 
[cpp] view plaincopyprint? 
1. // LEDs 
2. #define HAL_BOARD_IO_LED_1_PORT 0 // Green 
3. #define HAL_BOARD_IO_LED_1_PIN 0 
4. #define HAL_BOARD_IO_LED_2_PORT 1 // Red 
5. #define HAL_BOARD_IO_LED_2_PIN 1 
6. #define HAL_BOARD_IO_LED_3_PORT 1 // Yellow 
7. #define HAL_BOARD_IO_LED_3_PIN 4 
8. #define HAL_BOARD_IO_LED_4_PORT 0 // Orange 
9. #define HAL_BOARD_IO_LED_4_PIN 1 
修改后: 
[cpp] view plaincopyprint? 
1. // LEDs 
2. #define HAL_BOARD_IO_LED_1_PORT 1 // Green******************LED1 
3. #define HAL_BOARD_IO_LED_1_PIN 0 
4. #define HAL_BOARD_IO_LED_2_PORT 1 // Red********************LED2 
5. #define HAL_BOARD_IO_LED_2_PIN 1 
6. #define HAL_BOARD_IO_LED_3_PORT 1 // Yellow 
7. #define HAL_BOARD_IO_LED_3_PIN 4 
8. #define HAL_BOARD_IO_LED_4_PORT 0 // Orange 
9. #define HAL_BOARD_IO_LED_4_PIN 1 
(2)、首先根据上面的分析,可以知道TI官网的CC2530 BasicRF中有1个按键S1,对应的引脚为P0_1,而我板子上的按键S1引脚为P0_4。所有需要修改LED1的引脚定义,修改hal_board.h对应Buttons的引脚定义处。 
修改前: 
[cpp] view plaincopyprint? 
1. // Buttons 
2. #define HAL_BOARD_IO_BTN_1_PORT 0 // Button S1 
3. #define HAL_BOARD_IO_BTN_1_PIN 1 
修改后: 
[cpp] view plaincopyprint? 
1. // Buttons 
2. #define HAL_BOARD_IO_BTN_1_PORT 0 // Button S1 
3. #define HAL_BOARD_IO_BTN_1_PIN 4 
(3)、将板子的LED1和LED2灯,设置为关闭状态,修改light_switch.c的main函数,在halLedSet(1)上面添加一行代码:halLesSet(2); 
[cpp] view plaincopyprint? 
1. halLedSet(2); //关闭LED2 
2. halLedSet(1); //关闭LED1 
(4)、根据上面的light_switch.c中的appSwitch()函数分析,在其函数内死循环中,它是去判断多方向按键是否按下,而实际需要判断自己板子的单方向按键是否按下。 
修改前: 
[cpp] view plaincopyprint? 
1. while (TRUE) { 
2. if( halJoystickPushed() ) { //判断多方向按键是否按下 
3. 
4. basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//发送
命令 
5. 
6. // Put MCU to sleep. It will wake up on joystick interrupt 
7. halIntOff(); 
8. halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global 
9. // interrupt enable 
10. halIntOn(); 
11. 
12. } 
13. } 
修改后: 
[cpp] view plaincopyprint? 
1. while (TRUE) { 
2. //if( halJoystickPushed() ) { //判断多方向按键是否按下 
3. if (halButtonPushed()){ 
4. basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//发送
命令 
5. 
6. // Put MCU to sleep. It will wake up on joystick interrupt 
7. halIntOff(); 
8. halMcuSetLowPowerMode(HAL_MCU_LPM_3); // Will turn on global 
9. // interrupt enable 
10. halIntOn(); 
11. 
12. } 
13. } 
(5)、将light_switch.c中的main函数中一些有关lcd屏的操作、模式选择、等待用户按键等代码注释掉,注释如下: 
[cpp] view plaincopyprint? 
1. #if 0 
2. // Print Logo and splash screen on LCD 
3. utilPrintLogo("Light Switch"); //有关LCD的函数不管 
4. 
5. // Wait for user to press S1 to enter menu 
6. while (halButtonPushed()!=HAL_BUTTON_1); 
7. halMcuWaitMs(350); 
8. halLcdClear(); //lcd清屏,不用管 
9. 
10. // Set application role 
11. appMode = appSelectMode(); //模式选择 
12. halLcdClear(); 
13. 
14. // Transmitter application 
15. if(appMode == SWITCH) { 
16. // No return from here 
17. appSwitch(); 
18. } 
19. // Receiver application 
20. else if(appMode == LIGHT) { 
21. // No return from here 
22. appLight(); 
23. } 
24. #endif 
(7)、根据是控制端(按键端)还是终端(LED灯端),在main函数添加不同函数。如果是
将程序下载到控制端板子上,在main函数HAL_ASSERT(FLASE)上方添加appSwitch()函
数,而如果是将程序下载到终端板子上,在main函数HAL_ASSERT(FLASE)上方添加
appLight()函数。 
控制端: 
[cpp] view plaincopyprint? 
1. appSwitch(); 
2. 
3. // Role is undefined. This code should not be reached 
4. HAL_ASSERT(FALSE); 
终端: 
[cpp] view plaincopyprint? 
1. appLight(); 
2. 
3. // Role is undefined. This code should not be reached 
4. HAL_ASSERT(FALSE); 
准备就绪 
按下S1 

, TI CC2530基础实验(串口编程——USART0收发测试总结) 
, IAR——Unable to open file 'lnk51ew_cc2530b.xcl' 
主推荐 
代码分析 interface 局域网 路由器 终端 猜你在找 
zigbee tools-f8w2530xcl 
特征向量 
IAR编译出现Errore46 Undefined external "_NOP" referred in main Fatal Errore72 Segment ZIGNV_ADDRESS_SPACE must be defined in a segment definition option 
-Z -b 
1-2 实验2 点对点通信 
【精品课程】零基础学Java系列从入门到精通 
【精品课程】JavaScript for Qt Quick(QML) 
【精品课程】微信公众平台开发入门 
【精品课程】C语言及程序设计初步 
【精品课程】零基础学HTML 5实战开发(第一季) 
准备好了么, 跳吧 ~更多职位尽在 CSDN JOB 高级数据架构师——Hadoop 
猎上网络科技(上海)有限公司 
| 
35-40K/月 
我要跳槽 
PHP开发工程师——新媒体 
成都索贝数码科技股份有限公司 | 
6-10K/月 
我要跳槽 
招募IT猎头顾问——技术人员转行的新出路 
上海科锐福克斯人才顾问有限公司 | 
0.5-1K/月 
我要跳槽 
网站及无线产品UI设计师 青岛天胜网络供应链有限公司 | 
4-6K/月 
我要跳槽 
查看评论 
暂无评论 
您还没有登录,请[登录]或[注册] 
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场 
核心技术类目 
全部主题 Hadoop AWS 移动游戏 Java Android iOS Swift 智能硬
件 Docker OpenStack VPN Spark ERPIE10 Eclipse CRM JavaScript 数据库 Ubuntu NFC WAP jQuery BI HTML5 Spring Apache .NET API HTML SDK IIS Fedora XML LBS Unity S
plashtop UML components Windows 
Mobile Rails QEMU KDE Cassandra CloudStack FTC coremail OPhone CouchBase 云计算 iOS6 Rackspace Web App SpringSide Maemo Compuware 大数
据 aptech Perl Tornado Ruby Hibernate ThinkPHP HBase Pure Solr Angular Cloud Foundry Redis Scala Django Bootstrap 
个人资料 

Thanksgining 

o 访问:14717次 o 积分:640 

o 等级: o 排名:千里之外 o 原创:51篇 o 转载:5篇 o 译文:0篇 o 评论:3条 
文章分类 
, 【C】(3) 
, 【Linux C】(9) 
, 【Zigbee】(14) 
, 【knx 协议】(1) 
, 【CPU】(3) 
, 【Java】(1) 
, 【Android】(5) 
, 【从实践中学习Android】(2) , 【Android UI编程专栏】(9) , 【Android 网络编程专栏】(4) , 【Android 多线程编程专栏】(3) , 【Android 数据存储专栏】(4) , 【Ubuntu】(1) 
, 【Git】(1) 
, 【GitHub】(0) 
文章搜索 
文章存档 
, 2015年02月(10) 
, 2015年01月(16) 
, 2014年12月(25) 
, 2014年11月(5) 
阅读排行 
, 我的Android进阶之旅:经典的大牛博客推荐(665) 
, ZStack-CC2530-2.5.1a主要代码分析总结——明白ZStack-OSAL的原理和思想(609) , Android UI编程(1)——九宫格(GridView)(447) 
, git pull——git库版本与本地库版本冲突总结(420) 
, TI CC2530(DMA编程——手动触发DMA传送,一个数组拷贝到另一个数组里)(416) , TI CC2530基础实验(GPIO通用I/O中断操作——一个中断处理程序处理一个端口的多个中断)
(413) 
, TI CC2530基础实验(普通GPIO操作——点亮led灯)(412) , TI CC2530基础实验(普通GPIO操作——按一下按键亮一下灯)(376) , Android 数据存储——SQLite实例、判断数据库中表是否存在(375) , ZStack-CC2530-2.5.1a协议栈数据传输(371) 
评论排行 
, Android UI编程(6)——HandlerThread(3) 
, Android 网络编程(3)——使用URLConnection提交请求(0) , Android UI编程(2)——多级列表(ExpandableListView)(0) , Android UI编程(1)——九宫格(GridView)(0) 
, 我的Android进阶之旅:经典的大牛博客推荐(0) 
, Android设备使用网络连接调试(0) 
, ZStack-CC2530-2.5.1a协议栈数据传输(0) 
, ZStack-CC2530-2.5.1a主要代码分析总结——明白ZStack-OSAL的原理和思想(0) , ZStack-OSAL中任务初始化中的afRegister函数调用分析总结(0) , 彻底明白Zigbee术语——群集(Cluster)、端点(EndPoint)等(0) 
推荐文章 
最新评论 
, Android UI编程(6)——HandlerThread 
砍瓜-切菜: 好的,谢谢指点,有点明白了,本人android新手,许多都不懂,有些问题,感觉稀里糊涂的,
希望博主海... 
, 
, Android UI编程(6)——HandlerThread 
Thanksgining: 只有启动了HandlerThread线程,才能通过handlerThread.getLooper()... , 
, Android UI编程(6)——HandlerThread 
砍瓜-切菜: 请教博主一个问题,在您的示例程序中,这个handlerThread.start(); 的作用是什么... , 
公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告|合作伙
伴|论坛反馈 
网站客服杂志客服微博客服webmaster@csdn.net400-600-2320|北京创新乐知信息技术有限公司 版权
所有|江苏乐知网络技术有限公司 提供商务支持 

京 ICP 证 070598 号|Copyright ? 1999-2014, CSDN.NET, All Rights Reserved 
/
本文档为【TI CC2530组网演练&#40;BasicRF——无线控制灯的亮灭&#41;】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索