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

更新时间:2023-09-25 11:22:02 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

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. 3. 4. 5. 6. 7. 8.

/*********************************************************************** * MCU_IO_DIR_OUTPUT(port, pin);将端口port对应的pin位设置为输出(高电平) * ##为连接符,如port=0,pin=1,即P0DIR |= BM(1);

**********************************************************************/ #define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin) #define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BM(pin); ) #define st(x) do { x } while (__LINE__ == -1) #define BM(n) (1 << (n))

MCU_IO_DIR_INPUT(port, pin);

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6. 7.

/*********************************************************************** * MCU_IO_DIR_INPUT(port, pin);将端口port对应的pin位设置为输入(低电平) **********************************************************************/ #define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin) #define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR |= ~BM(pin); ) #define st(x) do { x } while (__LINE__ == -1) #define BM(n) (1 << (n))

MCU_IO_GET(port, pin); [cpp] view plaincopyprint?

1. 2. 3. 4.

/*********************************************************************** * MCU_IO_GET(port, pin);获取端口port的对应位pin的电平值

**********************************************************************/ #define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin)

5. 6.

#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) #define BM(n) (1 << (n))

MCU_IO_TGL(port, pin);

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6.

/*********************************************************************** * MCU_IO_TGL(port, pin);将端口port的对应位pin的电平值设置为相反电平 **********************************************************************/ #define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin) #define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; ) #define st(x) do { x } while (__LINE__ == -1)

MCU_IO_SET_LOW(port, pin);

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6.

/*********************************************************************** * MCU_IO_SET_LOW(port, pin);将端口port的对应位pin设置为低电平

**********************************************************************/ #define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin) #define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; ) #define st(x) do { x } while (__LINE__ == -1)

MCU_IO_SET_HIGH(port, pin);

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6.

/*********************************************************************** * MCU_IO_SET_HIGH(port, pin);将端口port的对应位pin设置为高电平

**********************************************************************/ #define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin) #define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; ) #define st(x) do { x } while (__LINE__ == -1)

MCU_IO_SET(port, pin, val);

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6.

/*********************************************************************** * MCU_IO_SET(port, pin, val);将端口port的对应位pin的电平值设置为val **********************************************************************/ #define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val) #define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) #define st(x) do { x } while (__LINE__ == -1)

MCU_IO_OUTPUT(port, pin, val);

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6. 7. 8.

/*********************************************************************** * MCU_IO_OUTPUT(port, pin, val);将端口port的对应位pin的电平值设置为val * 并且将此IO设置为通用IO,以及设置为输出 **********************************************************************/ #define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val) #define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BM(pin); \\

P##port##_##pin## = val; \\ 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. 3. 4. 5. 6. 7. 8.

/*********************************************************************** * MCU_IO_INPUT(port, pin, func);将端口port的对应位pin的设置为通用IO * 并将此IO口设置为func输入模式:上拉、下拉、默认模式(三态) * func指的是IO口的输入模式:MCU_IO_PULLUP、MCU_IO_PULLDOWN、默认模式

**********************************************************************/ #define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func) #define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BM(pin); \\

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. 3. 4. 5. 6.

/*********************************************************************** * MCU_IO_PERIPHERAL(port, pin);将端口port的对应位pin的设置为外设功能

**********************************************************************/ #define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin) #define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BM(pin); ) #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(\); //有关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. 2. 3. 4. 5. 6. 7. 8. 9.

void halBoardInit(void) {

//mcu初始化,设置系统时钟 halMcuInit();

// LEDs

#ifdef SRF05EB_VERSION_1_3

// SmartRF05EB rev 1.3 has only one accessible LED

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. 2. 3. 4. 5. 6.

uint8 halRfInit(void) {

// Enable auto ack and auto crc /*

* #define FRMCTRL0 XREG( 0x6189 )

* #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. 2. 3. 4. 5.

static void appSwitch() {

//lcd有关操作不用管

halLcdWriteLine(HAL_LCD_LINE_1, \); halLcdWriteLine(HAL_LCD_LINE_2, \);

6. halLcdWriteLine(HAL_LCD_LINE_3, \); 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, \); 4. halLcdWriteLine(HAL_LCD_LINE_2, \); 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. 2.

typedef struct {

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. 2. 3. 4. 5. 6. 7. 8.

uint8 basicRfPacketIsReady(void) { /*

* static basicRfRxInfo_t rxi= { 0xFF }; // Make sure sequence numbers are

* 确保数据序列号为0xFF */

return rxi.isReady; }

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6. 7.

uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi) {

// Accessing shared variables -> this is a critical region // Critical region start halIntOff();

memcpy(pRxData, rxi.pPayload, min(rxi.length, len)); 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. 2. 3. 4. 5. 6. 7. 8. 9.

// LEDs

#define HAL_BOARD_IO_LED_1_PORT 0 // Green #define HAL_BOARD_IO_LED_1_PIN 0

#define HAL_BOARD_IO_LED_2_PORT 1 // Red #define HAL_BOARD_IO_LED_2_PIN 1

#define HAL_BOARD_IO_LED_3_PORT 1 // Yellow #define HAL_BOARD_IO_LED_3_PIN 4

#define HAL_BOARD_IO_LED_4_PORT 0 // Orange #define HAL_BOARD_IO_LED_4_PIN 1

暂无评论 您还没有登录,请[登录]或[注册] * 以上用户言论只代表其个人观点,不代表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 Splashtop 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 o o o o o o o

文章分类 访问:14717次 积分:640 等级:

排名:千里之外 原创:51篇 转载:5篇 译文:0篇 评论: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)

阅读排行 ? ? ? ? ? ?

(413)

我的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中断操作——一个中断处理程序处理一个端口的多个中断)

? ? ? ?

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

修改后:

[cpp] view plaincopyprint?

1. 2. 3. 4. 5. 6. 7. 8. 9.

// LEDs

#define HAL_BOARD_IO_LED_1_PORT 1 // Green******************LED1 #define HAL_BOARD_IO_LED_1_PIN 0

#define HAL_BOARD_IO_LED_2_PORT 1 // Red********************LED2 #define HAL_BOARD_IO_LED_2_PIN 1

#define HAL_BOARD_IO_LED_3_PORT 1 // Yellow #define HAL_BOARD_IO_LED_3_PIN 4

#define HAL_BOARD_IO_LED_4_PORT 0 // Orange #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. 2. 3.

// Buttons

#define HAL_BOARD_IO_BTN_1_PORT 0 // Button S1 #define HAL_BOARD_IO_BTN_1_PIN 1

修改后:

[cpp] view plaincopyprint?

1. 2. 3.

// Buttons

#define HAL_BOARD_IO_BTN_1_PORT 0 // Button S1 #define HAL_BOARD_IO_BTN_1_PIN 4

(3)、将板子的LED1和LED2灯,设置为关闭状态,修改light_switch.c的main函数,在halLedSet(1)上面添加一行代码:halLesSet(2);

[cpp] view plaincopyprint?

1. 2.

halLedSet(2); //关闭LED2 halLedSet(1); //关闭LED1

(4)、根据上面的light_switch.c中的appSwitch()函数分析,在其函数内死循环中,它是去判断多方向按键是否按下,而实际需要判断自己板子的单方向按键是否按下。

修改前:

[cpp] view plaincopyprint?

1. 2. 3. 4. 5.

while (TRUE) {

if( halJoystickPushed() ) { //判断多方向按键是否按下

basicRfSendPacket(LIGHT_ADDR, pTxData, APP_PAYLOAD_LENGTH);//发送命令

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. 2. 3. 4.

while (TRUE) {

//if( halJoystickPushed() ) { //判断多方向按键是否按下 if (halButtonPushed()){

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(\); //有关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. 2. 3. 4.

终端:

appSwitch();

// Role is undefined. This code should not be reached HAL_ASSERT(FALSE);

[cpp] view plaincopyprint?

1. 2. 3. 4.

appLight();

// Role is undefined. This code should not be reached HAL_ASSERT(FALSE);

准备就绪

按下S1

本文来源:https://www.bwwdw.com/article/20nd.html

Top