From 310543de711df3b82d8c3adcf0c0822a093615a4 Mon Sep 17 00:00:00 2001 From: Asryn Date: Mon, 4 Oct 2021 22:26:10 +0800 Subject: [PATCH] 2021-10-04 --- README.md | 1 + .../Aæ�¿/CC2530_lib/basicrf/basic_rf.c | 523 ++++ .../Aæ�¿/CC2530_lib/basicrf/basic_rf.h | 123 + .../Aæ�¿/CC2530_lib/basicrf/basic_rf_security.c | 60 + .../Aæ�¿/CC2530_lib/basicrf/basic_rf_security.h | 8 + .../Aæ�¿/CC2530_lib/board/hal_board.c | 17 + .../Aæ�¿/CC2530_lib/board/hal_board.h | 307 +++ Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.c | 98 + Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.h | 9 + Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.c | 57 + Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.h | 4 + .../Aæ�¿/CC2530_lib/common/hal_adc.c | 56 + .../Aæ�¿/CC2530_lib/common/hal_adc.h | 86 + .../Aæ�¿/CC2530_lib/common/hal_cc8051.h | 53 + .../Aæ�¿/CC2530_lib/common/hal_clock.c | 75 + .../Aæ�¿/CC2530_lib/common/hal_clock.h | 66 + .../Aæ�¿/CC2530_lib/common/hal_defs.h | 105 + .../Aæ�¿/CC2530_lib/common/hal_digio.c | 492 ++++ .../Aæ�¿/CC2530_lib/common/hal_digio.h | 46 + .../Aæ�¿/CC2530_lib/common/hal_int.c | 60 + .../Aæ�¿/CC2530_lib/common/hal_int.h | 21 + .../Aæ�¿/CC2530_lib/common/hal_mcu.c | 116 + .../Aæ�¿/CC2530_lib/common/hal_mcu.h | 17 + Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.c | 418 ++++ Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.h | 56 + .../Aæ�¿/CC2530_lib/common/hal_rf_security.c | 393 +++ .../Aæ�¿/CC2530_lib/common/hal_rf_security.h | 21 + .../Aæ�¿/CC2530_lib/common/hal_rf_util.c | 60 + .../Aæ�¿/CC2530_lib/common/hal_rf_util.h | 10 + .../Aæ�¿/CC2530_lib/common/hal_sleep.c | 41 + .../Aæ�¿/CC2530_lib/common/hal_sleep.h | 10 + .../Aæ�¿/CC2530_lib/common/hal_timer_32k.c | 130 + .../Aæ�¿/CC2530_lib/common/hal_timer_32k.h | 17 + .../Aæ�¿/CC2530_lib/common/hal_uart.c | 286 +++ .../Aæ�¿/CC2530_lib/common/hal_uart.h | 35 + .../Aæ�¿/CC2530_lib/common/hal_uart1.c | 282 +++ .../Aæ�¿/CC2530_lib/common/hal_uart1.h | 35 + .../Aæ�¿/CC2530_lib/moudle/dma_ad590.c | 38 + .../Aæ�¿/CC2530_lib/moudle/dma_ad590.h | 9 + .../Aæ�¿/CC2530_lib/moudle/dma_bma.c | 193 ++ .../Aæ�¿/CC2530_lib/moudle/dma_bma.h | 16 + Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.c | 59 + Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.h | 8 + .../Aæ�¿/CC2530_lib/moudle/dma_eeprom.c | 175 ++ .../Aæ�¿/CC2530_lib/moudle/dma_eeprom.h | 11 + .../Aæ�¿/CC2530_lib/moudle/dma_imc.c | 64 + .../Aæ�¿/CC2530_lib/moudle/dma_imc.h | 11 + .../Aæ�¿/CC2530_lib/moudle/dma_itg.c | 204 ++ .../Aæ�¿/CC2530_lib/moudle/dma_itg.h | 25 + Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.c | 39 + Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.h | 6 + Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.c | 39 + Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.h | 9 + .../Aæ�¿/CC2530_lib/moudle/dma_sht.h | 219 ++ .../Aæ�¿/CC2530_lib/moudle/dma_tc72.c | 101 + .../Aæ�¿/CC2530_lib/moudle/dma_tc72.h | 8 + .../Aæ�¿/CC2530_lib/moudle/dma_tgs.c | 39 + .../Aæ�¿/CC2530_lib/moudle/dma_tgs.h | 6 + .../Aæ�¿/CC2530_lib/moudle/dma_tgs2602.c | 39 + .../Aæ�¿/CC2530_lib/moudle/dma_tgs2602.h | 9 + .../Aæ�¿/CC2530_lib/mylib/Flash_data.c | 73 + .../Aæ�¿/CC2530_lib/mylib/Flash_data.h | 17 + Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/TIMER.c | 59 + Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/TIMER.h | 4 + .../Aæ�¿/CC2530_lib/mylib/UART_PRINT.c | 112 + .../Aæ�¿/CC2530_lib/mylib/UART_PRINT.h | 17 + .../Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c | 74 + .../Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h | 4 + Zigbee无线通信/Aæ�¿/CC2530_lib/readme.doc | Bin 0 -> 32768 bytes Zigbee无线通信/Aæ�¿/CC2530_lib/utils/util.c | 129 + Zigbee无线通信/Aæ�¿/CC2530_lib/utils/util.h | 31 + .../Aæ�¿/Project/Debug/Exe/rf_set.d51 | Bin 0 -> 73318 bytes .../Aæ�¿/Project/Debug/Obj/BMA020.r51 | Bin 0 -> 30878 bytes .../Aæ�¿/Project/Debug/Obj/basic_rf.r51 | Bin 0 -> 51053 bytes .../Aæ�¿/Project/Debug/Obj/dma_itg.r51 | Bin 0 -> 48974 bytes .../Aæ�¿/Project/Debug/Obj/get_adc.r51 | Bin 0 -> 27521 bytes .../Aæ�¿/Project/Debug/Obj/get_swsensor.r51 | Bin 0 -> 3331 bytes .../Aæ�¿/Project/Debug/Obj/hal_board.r51 | Bin 0 -> 4732 bytes .../Aæ�¿/Project/Debug/Obj/hal_clock.r51 | Bin 0 -> 4835 bytes .../Aæ�¿/Project/Debug/Obj/hal_digio.r51 | Bin 0 -> 34769 bytes .../Aæ�¿/Project/Debug/Obj/hal_int.r51 | Bin 0 -> 5001 bytes .../Aæ�¿/Project/Debug/Obj/hal_led.r51 | Bin 0 -> 5369 bytes .../Aæ�¿/Project/Debug/Obj/hal_mcu.r51 | Bin 0 -> 9780 bytes .../Aæ�¿/Project/Debug/Obj/hal_rf.r51 | Bin 0 -> 23045 bytes .../Aæ�¿/Project/Debug/Obj/hal_rf_security.r51 | Bin 0 -> 149669 bytes .../Aæ�¿/Project/Debug/Obj/hal_uart.r51 | Bin 0 -> 25779 bytes .../Aæ�¿/Project/Debug/Obj/rf_set.pbd | 19 + .../Aæ�¿/Project/Debug/Obj/rf_set.r51 | Bin 0 -> 21741 bytes .../Aæ�¿/Project/Debug/Obj/sensor.r51 | Bin 0 -> 19466 bytes Zigbee无线通信/Aæ�¿/Project/Debug/Obj/util.r51 | Bin 0 -> 27059 bytes Zigbee无线通信/Aæ�¿/Project/rf_set.c | 144 ++ Zigbee无线通信/Aæ�¿/Project/rf_set.dep | 524 ++++ Zigbee无线通信/Aæ�¿/Project/rf_set.ewd | 1281 ++++++++++ Zigbee无线通信/Aæ�¿/Project/rf_set.ewp | 2157 +++++++++++++++++ Zigbee无线通信/Aæ�¿/Project/rf_set.eww | 10 + .../Aæ�¿/Project/sensor_drv/BMA020.c | 285 +++ .../Aæ�¿/Project/sensor_drv/BMA020.h | 29 + .../Aæ�¿/Project/sensor_drv/dma_itg.c | 292 +++ .../Aæ�¿/Project/sensor_drv/dma_itg.h | 20 + .../Aæ�¿/Project/sensor_drv/get_adc.c | 160 ++ .../Aæ�¿/Project/sensor_drv/get_adc.h | 16 + .../Aæ�¿/Project/sensor_drv/get_swsensor.c | 57 + .../Aæ�¿/Project/sensor_drv/get_swsensor.h | 13 + .../Aæ�¿/Project/sensor_drv/sensor.c | 166 ++ .../Aæ�¿/Project/sensor_drv/sensor.h | 30 + Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.c | 325 +++ Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.h | 14 + .../Aæ�¿/Project/settings/rf_set.cspy.bat | 15 + .../Aæ�¿/Project/settings/rf_set.dbgdt | 5 + .../Aæ�¿/Project/settings/rf_set.dni | 24 + .../Aæ�¿/Project/settings/rf_set.wsdt | 49 + .../Bæ�¿/CC2530_lib/basicrf/basic_rf.c | 523 ++++ .../Bæ�¿/CC2530_lib/basicrf/basic_rf.h | 123 + .../Bæ�¿/CC2530_lib/basicrf/basic_rf_security.c | 60 + .../Bæ�¿/CC2530_lib/basicrf/basic_rf_security.h | 8 + .../Bæ�¿/CC2530_lib/board/hal_board.c | 17 + .../Bæ�¿/CC2530_lib/board/hal_board.h | 307 +++ Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.c | 98 + Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.h | 9 + Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.c | 57 + Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.h | 4 + .../Bæ�¿/CC2530_lib/common/hal_adc.c | 56 + .../Bæ�¿/CC2530_lib/common/hal_adc.h | 86 + .../Bæ�¿/CC2530_lib/common/hal_cc8051.h | 53 + .../Bæ�¿/CC2530_lib/common/hal_clock.c | 75 + .../Bæ�¿/CC2530_lib/common/hal_clock.h | 66 + .../Bæ�¿/CC2530_lib/common/hal_defs.h | 105 + .../Bæ�¿/CC2530_lib/common/hal_digio.c | 492 ++++ .../Bæ�¿/CC2530_lib/common/hal_digio.h | 46 + .../Bæ�¿/CC2530_lib/common/hal_int.c | 60 + .../Bæ�¿/CC2530_lib/common/hal_int.h | 21 + .../Bæ�¿/CC2530_lib/common/hal_mcu.c | 116 + .../Bæ�¿/CC2530_lib/common/hal_mcu.h | 17 + Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.c | 418 ++++ Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.h | 56 + .../Bæ�¿/CC2530_lib/common/hal_rf_security.c | 393 +++ .../Bæ�¿/CC2530_lib/common/hal_rf_security.h | 21 + .../Bæ�¿/CC2530_lib/common/hal_rf_util.c | 60 + .../Bæ�¿/CC2530_lib/common/hal_rf_util.h | 10 + .../Bæ�¿/CC2530_lib/common/hal_sleep.c | 41 + .../Bæ�¿/CC2530_lib/common/hal_sleep.h | 10 + .../Bæ�¿/CC2530_lib/common/hal_timer_32k.c | 130 + .../Bæ�¿/CC2530_lib/common/hal_timer_32k.h | 17 + .../Bæ�¿/CC2530_lib/common/hal_uart.c | 286 +++ .../Bæ�¿/CC2530_lib/common/hal_uart.h | 35 + .../Bæ�¿/CC2530_lib/common/hal_uart1.c | 282 +++ .../Bæ�¿/CC2530_lib/common/hal_uart1.h | 35 + .../Bæ�¿/CC2530_lib/moudle/dma_ad590.c | 38 + .../Bæ�¿/CC2530_lib/moudle/dma_ad590.h | 9 + .../Bæ�¿/CC2530_lib/moudle/dma_bma.c | 193 ++ .../Bæ�¿/CC2530_lib/moudle/dma_bma.h | 16 + Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.c | 59 + Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.h | 8 + .../Bæ�¿/CC2530_lib/moudle/dma_eeprom.c | 175 ++ .../Bæ�¿/CC2530_lib/moudle/dma_eeprom.h | 11 + .../Bæ�¿/CC2530_lib/moudle/dma_imc.c | 64 + .../Bæ�¿/CC2530_lib/moudle/dma_imc.h | 11 + .../Bæ�¿/CC2530_lib/moudle/dma_itg.c | 204 ++ .../Bæ�¿/CC2530_lib/moudle/dma_itg.h | 25 + Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.c | 39 + Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.h | 6 + Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.c | 39 + Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.h | 9 + .../Bæ�¿/CC2530_lib/moudle/dma_sht.h | 219 ++ .../Bæ�¿/CC2530_lib/moudle/dma_tc72.c | 101 + .../Bæ�¿/CC2530_lib/moudle/dma_tc72.h | 8 + .../Bæ�¿/CC2530_lib/moudle/dma_tgs.c | 39 + .../Bæ�¿/CC2530_lib/moudle/dma_tgs.h | 6 + .../Bæ�¿/CC2530_lib/moudle/dma_tgs2602.c | 39 + .../Bæ�¿/CC2530_lib/moudle/dma_tgs2602.h | 9 + .../Bæ�¿/CC2530_lib/mylib/Flash_data.c | 73 + .../Bæ�¿/CC2530_lib/mylib/Flash_data.h | 17 + Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/TIMER.c | 59 + Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/TIMER.h | 4 + .../Bæ�¿/CC2530_lib/mylib/UART_PRINT.c | 112 + .../Bæ�¿/CC2530_lib/mylib/UART_PRINT.h | 17 + .../Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c | 74 + .../Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h | 4 + Zigbee无线通信/Bæ�¿/CC2530_lib/readme.doc | Bin 0 -> 32768 bytes Zigbee无线通信/Bæ�¿/CC2530_lib/utils/util.c | 129 + Zigbee无线通信/Bæ�¿/CC2530_lib/utils/util.h | 31 + .../Bæ�¿/Project/Debug/Exe/rf_set.d51 | Bin 0 -> 73756 bytes .../Bæ�¿/Project/Debug/Obj/BMA020.r51 | Bin 0 -> 29402 bytes .../Bæ�¿/Project/Debug/Obj/basic_rf.r51 | Bin 0 -> 48119 bytes .../Bæ�¿/Project/Debug/Obj/dma_itg.r51 | Bin 0 -> 46022 bytes .../Bæ�¿/Project/Debug/Obj/get_adc.r51 | Bin 0 -> 25541 bytes .../Bæ�¿/Project/Debug/Obj/get_swsensor.r51 | Bin 0 -> 3277 bytes .../Bæ�¿/Project/Debug/Obj/hal_board.r51 | Bin 0 -> 4588 bytes .../Bæ�¿/Project/Debug/Obj/hal_clock.r51 | Bin 0 -> 4781 bytes .../Bæ�¿/Project/Debug/Obj/hal_digio.r51 | Bin 0 -> 33365 bytes .../Bæ�¿/Project/Debug/Obj/hal_int.r51 | Bin 0 -> 4911 bytes .../Bæ�¿/Project/Debug/Obj/hal_led.r51 | Bin 0 -> 5279 bytes .../Bæ�¿/Project/Debug/Obj/hal_mcu.r51 | Bin 0 -> 9420 bytes .../Bæ�¿/Project/Debug/Obj/hal_rf.r51 | Bin 0 -> 22343 bytes .../Bæ�¿/Project/Debug/Obj/hal_rf_security.r51 | Bin 0 -> 137897 bytes .../Bæ�¿/Project/Debug/Obj/hal_uart.r51 | Bin 0 -> 24393 bytes .../Bæ�¿/Project/Debug/Obj/rf_set.pbd | 19 + .../Bæ�¿/Project/Debug/Obj/rf_set.r51 | Bin 0 -> 22469 bytes .../Bæ�¿/Project/Debug/Obj/sensor.r51 | Bin 0 -> 18548 bytes Zigbee无线通信/Bæ�¿/Project/Debug/Obj/util.r51 | Bin 0 -> 25205 bytes Zigbee无线通信/Bæ�¿/Project/rf_set.c | 154 ++ Zigbee无线通信/Bæ�¿/Project/rf_set.dep | 524 ++++ Zigbee无线通信/Bæ�¿/Project/rf_set.ewd | 1281 ++++++++++ Zigbee无线通信/Bæ�¿/Project/rf_set.ewp | 2157 +++++++++++++++++ Zigbee无线通信/Bæ�¿/Project/rf_set.eww | 10 + .../Bæ�¿/Project/sensor_drv/BMA020.c | 285 +++ .../Bæ�¿/Project/sensor_drv/BMA020.h | 29 + .../Bæ�¿/Project/sensor_drv/dma_itg.c | 292 +++ .../Bæ�¿/Project/sensor_drv/dma_itg.h | 20 + .../Bæ�¿/Project/sensor_drv/get_adc.c | 160 ++ .../Bæ�¿/Project/sensor_drv/get_adc.h | 16 + .../Bæ�¿/Project/sensor_drv/get_swsensor.c | 57 + .../Bæ�¿/Project/sensor_drv/get_swsensor.h | 13 + .../Bæ�¿/Project/sensor_drv/sensor.c | 166 ++ .../Bæ�¿/Project/sensor_drv/sensor.h | 30 + Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.c | 325 +++ Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.h | 14 + .../Bæ�¿/Project/settings/rf_set.cspy.bat | 15 + .../Bæ�¿/Project/settings/rf_set.dbgdt | 205 ++ .../Bæ�¿/Project/settings/rf_set.dni | 34 + .../Bæ�¿/Project/settings/rf_set.wsdt | 49 + Zigbee无线通信/任务è¦�求.png | Bin 0 -> 156920 bytes 222 files changed, 23571 insertions(+) create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_cc8051.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_defs.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_sht.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/Flash_data.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/Flash_data.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/TIMER.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/TIMER.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_PRINT.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_PRINT.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/readme.doc create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/utils/util.c create mode 100644 Zigbee无线通信/Aæ�¿/CC2530_lib/utils/util.h create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Exe/rf_set.d51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/BMA020.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/basic_rf.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/dma_itg.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/get_adc.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/get_swsensor.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_board.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_clock.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_digio.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_int.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_led.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_mcu.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_rf.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_rf_security.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_uart.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/rf_set.pbd create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/rf_set.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/sensor.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/Debug/Obj/util.r51 create mode 100644 Zigbee无线通信/Aæ�¿/Project/rf_set.c create mode 100644 Zigbee无线通信/Aæ�¿/Project/rf_set.dep create mode 100644 Zigbee无线通信/Aæ�¿/Project/rf_set.ewd create mode 100644 Zigbee无线通信/Aæ�¿/Project/rf_set.ewp create mode 100644 Zigbee无线通信/Aæ�¿/Project/rf_set.eww create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.c create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.h create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.c create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.h create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.c create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.h create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.c create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.h create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.c create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.h create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.c create mode 100644 Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.h create mode 100644 Zigbee无线通信/Aæ�¿/Project/settings/rf_set.cspy.bat create mode 100644 Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dbgdt create mode 100644 Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dni create mode 100644 Zigbee无线通信/Aæ�¿/Project/settings/rf_set.wsdt create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_cc8051.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_defs.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_sht.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/Flash_data.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/Flash_data.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/TIMER.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/TIMER.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_PRINT.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_PRINT.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/readme.doc create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/utils/util.c create mode 100644 Zigbee无线通信/Bæ�¿/CC2530_lib/utils/util.h create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Exe/rf_set.d51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/BMA020.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/basic_rf.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/dma_itg.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/get_adc.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/get_swsensor.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_board.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_clock.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_digio.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_int.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_led.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_mcu.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_rf.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_rf_security.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_uart.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/rf_set.pbd create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/rf_set.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/sensor.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/Debug/Obj/util.r51 create mode 100644 Zigbee无线通信/Bæ�¿/Project/rf_set.c create mode 100644 Zigbee无线通信/Bæ�¿/Project/rf_set.dep create mode 100644 Zigbee无线通信/Bæ�¿/Project/rf_set.ewd create mode 100644 Zigbee无线通信/Bæ�¿/Project/rf_set.ewp create mode 100644 Zigbee无线通信/Bæ�¿/Project/rf_set.eww create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.c create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.h create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.c create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.h create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.c create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.h create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.c create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.h create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.c create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.h create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.c create mode 100644 Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.h create mode 100644 Zigbee无线通信/Bæ�¿/Project/settings/rf_set.cspy.bat create mode 100644 Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dbgdt create mode 100644 Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dni create mode 100644 Zigbee无线通信/Bæ�¿/Project/settings/rf_set.wsdt create mode 100644 Zigbee无线通信/任务è¦�求.png diff --git a/README.md b/README.md index 3b28cb2..b944bd3 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ * 08. task008 对SW1进行上é”�/è§£é”�功能:通过判断SW1点击状æ€�进行LEDé—ªçƒ�或者SW1上é”�/è§£é”�。 * 09. homework 点击SW1改å�˜LED状æ€� * 10. task010 一阶段考核:通过SW1对æµ�æ°´ç�¯è¿›è¡Œæ“�作,当按下SW1æ—¶æš‚å�œæµ�æ°´ç�¯å¹¶ä¿�æŒ�当å‰�状æ€�,当å†�次按下时在上次ä¿�存状æ€�开始继续å�‘下执行。 +* 11. Zigbee无线通信 Aã€�B两æ�¿ç›¸äº’控制LED diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.c new file mode 100644 index 0000000..b41d6f7 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.c @@ -0,0 +1,523 @@ +//------------------------------------------------------------------- +// Filename: basic_rf.c +// Description: Basic RF library +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" +#include "hal_mcu.h" // Using halMcuWaitUs() +#include "hal_rf.h" +#include "basic_rf.h" +#ifdef SECURITY_CCM + #include "hal_rf_security.h" + #include "basic_rf_security.h" +#endif +#include + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Packet and packet part lengths +#define PKT_LEN_MIC 8 +#define PKT_LEN_SEC PKT_LEN_UNSEC + PKT_LEN_MIC +#define PKT_LEN_AUTH 8 +#define PKT_LEN_ENCR 24 + +// Packet overhead ((frame control field, sequence number, PAN ID, +// destination and source) + (footer)) +// Note that the length byte itself is not included included in the packet length +#define BASIC_RF_PACKET_OVERHEAD_SIZE ((2 + 1 + 2 + 2 + 2) + (2)) +#define BASIC_RF_MAX_PAYLOAD_SIZE (127 - BASIC_RF_PACKET_OVERHEAD_SIZE - BASIC_RF_AUX_HDR_LENGTH - BASIC_RF_LEN_MIC) +#define BASIC_RF_ACK_PACKET_SIZE 5 +#define BASIC_RF_FOOTER_SIZE 2 +#define BASIC_RF_HDR_SIZE 10 + +// The time it takes for the acknowledgment packet to be received after the +// data packet has been transmitted. +#define BASIC_RF_ACK_DURATION (0.5 * 32 * 2 * ((4 + 1) + (1) + (2 + 1) + (2))) +#define BASIC_RF_SYMBOL_DURATION (32 * 0.5) + +// The length byte +#define BASIC_RF_PLD_LEN_MASK 0x7F + +// Frame control field +#define BASIC_RF_FCF_NOACK 0x8841 +#define BASIC_RF_FCF_ACK 0x8861 +#define BASIC_RF_FCF_ACK_BM 0x0020 +#define BASIC_RF_FCF_BM (~BASIC_RF_FCF_ACK_BM) +#define BASIC_RF_SEC_ENABLED_FCF_BM 0x0008 + +// Frame control field LSB +#define BASIC_RF_FCF_NOACK_L LO_UINT16(BASIC_RF_FCF_NOACK) +#define BASIC_RF_FCF_ACK_L LO_UINT16(BASIC_RF_FCF_ACK) +#define BASIC_RF_FCF_ACK_BM_L LO_UINT16(BASIC_RF_FCF_ACK_BM) +#define BASIC_RF_FCF_BM_L LO_UINT16(BASIC_RF_FCF_BM) +#define BASIC_RF_SEC_ENABLED_FCF_BM_L LO_UINT16(BASIC_RF_SEC_ENABLED_FCF_BM) + +// Auxiliary Security header +#define BASIC_RF_AUX_HDR_LENGTH 5 +#define BASIC_RF_LEN_AUTH BASIC_RF_PACKET_OVERHEAD_SIZE + BASIC_RF_AUX_HDR_LENGTH - BASIC_RF_FOOTER_SIZE +#define BASIC_RF_SECURITY_M 2 +#define BASIC_RF_LEN_MIC 8 +#ifdef SECURITY_CCM + #undef BASIC_RF_HDR_SIZE + #define BASIC_RF_HDR_SIZE 15 +#endif + +// Footer +#define BASIC_RF_CRC_OK_BM 0x80 + + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +// The receive struct +typedef struct +{ + uint8 seqNumber; + uint16 srcAddr; + uint16 srcPanId; + int8 length; + uint8 *pPayload; + uint8 ackRequest; + int8 rssi; + volatile uint8 isReady; + uint8 status; +} basicRfRxInfo_t; + +// Tx state +typedef struct +{ + uint8 txSeqNumber; + volatile uint8 ackReceived; + uint8 receiveOn; + uint32 frameCounter; +} basicRfTxState_t; + + +// Basic RF packet header (IEEE 802.15.4) +typedef struct +{ + uint8 packetLength; + uint8 fcf0; // Frame control field LSB + uint8 fcf1; // Frame control field MSB + uint8 seqNumber; + uint16 panId; + uint16 destAddr; + uint16 srcAddr; + #ifdef SECURITY_CCM + uint8 securityControl; + uint8 frameCounter[4]; + #endif +} basicRfPktHdr_t; + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +static basicRfRxInfo_t rxi = +{ + 0xFF +}; // Make sure sequence numbers are +static basicRfTxState_t txState = +{ + 0x00 +}; // initialised and distinct. + +static basicRfCfg_t *pConfig; +static uint8 txMpdu[BASIC_RF_MAX_PAYLOAD_SIZE + BASIC_RF_PACKET_OVERHEAD_SIZE + 1]; +static uint8 rxMpdu[128]; + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn basicRfBuildHeader +// @brief Builds packet header according to IEEE 802.15.4 frame format +// @param buffer - Pointer to buffer to write the header +// destAddr - destination short address +// payloadLength - length of higher layer payload +// @return uint8 - length of header +//------------------------------------------------------------------- +static uint8 basicRfBuildHeader(uint8 *buffer, uint16 destAddr, uint8 payloadLength) +{ + basicRfPktHdr_t *pHdr; + uint16 fcf; + + pHdr = (basicRfPktHdr_t*)buffer; + + // Populate packet header + pHdr->packetLength = payloadLength + BASIC_RF_PACKET_OVERHEAD_SIZE; + //pHdr->frameControlField = pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK; + fcf = pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK; + pHdr->fcf0 = LO_UINT16(fcf); + pHdr->fcf1 = HI_UINT16(fcf); + pHdr->seqNumber = txState.txSeqNumber; + pHdr->panId = pConfig->panId; + pHdr->destAddr = destAddr; + pHdr->srcAddr = pConfig->myAddr; + + #ifdef SECURITY_CCM + + // Add security to FCF, length and security header + pHdr->fcf0 |= BASIC_RF_SEC_ENABLED_FCF_BM_L; + pHdr->packetLength += PKT_LEN_MIC; + pHdr->packetLength += BASIC_RF_AUX_HDR_LENGTH; + + pHdr->securityControl = SECURITY_CONTROL; + pHdr->frameCounter[0] = LO_UINT16(LO_UINT32(txState.frameCounter)); + pHdr->frameCounter[1] = HI_UINT16(LO_UINT32(txState.frameCounter)); + pHdr->frameCounter[2] = LO_UINT16(HI_UINT32(txState.frameCounter)); + pHdr->frameCounter[3] = HI_UINT16(HI_UINT32(txState.frameCounter)); + + #endif + + return BASIC_RF_HDR_SIZE; +} + +//------------------------------------------------------------------- +// @fn basicRfBuildMpdu +// @brief Builds mpdu (MAC header + payload) according to IEEE 802.15.4 +// frame format +// @param destAddr - Destination short address +// pPayload - pointer to buffer with payload +// payloadLength - length of payload buffer +// @return uint8 - length of mpdu +//------------------------------------------------------------------- +static uint8 basicRfBuildMpdu(uint16 destAddr, uint8 *pPayload, uint8 payloadLength) +{ + uint8 hdrLength, n; + + hdrLength = basicRfBuildHeader(txMpdu, destAddr, payloadLength); + + for (n = 0; n < payloadLength; n++) + { + txMpdu[hdrLength + n] = pPayload[n]; + } + return hdrLength + payloadLength; // total mpdu length +} + +//------------------------------------------------------------------- +// @fn basicRfRxFrmDoneIsr +// @brief Interrupt service routine for received frame from radio +// (either data or acknowlegdement) +// @param rxi - file scope variable info extracted from the last incoming +// frame +// txState - file scope variable that keeps tx state info +// @return none +//------------------------------------------------------------------- +static void basicRfRxFrmDoneIsr(void) +{ + basicRfPktHdr_t *pHdr; + uint8 *pStatusWord; + #ifdef SECURITY_CCM + uint8 authStatus = 0; + #endif + + // Map header to packet buffer + pHdr = (basicRfPktHdr_t*)rxMpdu; + + // Clear interrupt and disable new RX frame done interrupt + halRfDisableRxInterrupt(); + + // Enable all other interrupt sources (enables interrupt nesting) + halIntOn(); + + // Read payload length. + halRfReadRxBuf(&pHdr->packetLength, 1); + pHdr->packetLength &= BASIC_RF_PLD_LEN_MASK; // Ignore MSB + + // Is this an acknowledgment packet? + // Only ack packets may be 5 bytes in total. + if (pHdr->packetLength == BASIC_RF_ACK_PACKET_SIZE) + { + // Read the packet + halRfReadRxBuf(&rxMpdu[1], pHdr->packetLength); + + rxi.ackRequest = !!(pHdr->fcf0 &BASIC_RF_FCF_ACK_BM_L); + + // Read the status word and check for CRC OK + pStatusWord = rxMpdu + 4; + + // Indicate the successful ACK reception if CRC and sequence number OK + if ((pStatusWord[1] &BASIC_RF_CRC_OK_BM) && (pHdr->seqNumber == txState.txSeqNumber)) + { + txState.ackReceived = TRUE; + } + // No, it is data + } + else + { + // It is assumed that the radio rejects packets with invalid length. + // Subtract the number of bytes in the frame overhead to get actual payload. + rxi.length = pHdr->packetLength - BASIC_RF_PACKET_OVERHEAD_SIZE; + + #ifdef SECURITY_CCM + rxi.length -= (BASIC_RF_AUX_HDR_LENGTH + BASIC_RF_LEN_MIC); + authStatus = halRfReadRxBufSecure(&rxMpdu[1], pHdr->packetLength, rxi.length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M); + #else + halRfReadRxBuf(&rxMpdu[1], pHdr->packetLength); + #endif + + rxi.ackRequest = !!(pHdr->fcf0 &BASIC_RF_FCF_ACK_BM_L); + + // Read the source address + rxi.srcAddr = pHdr->srcAddr; + + // Read the packet payload + rxi.pPayload = rxMpdu + BASIC_RF_HDR_SIZE; + + // Read the FCS to get the RSSI and CRC + pStatusWord = rxi.pPayload + rxi.length; + #ifdef SECURITY_CCM + pStatusWord += BASIC_RF_LEN_MIC; + #endif + rxi.rssi = pStatusWord[0]; + + // Notify the application about the received data packet if the CRC is OK + // Throw packet if the previous packet had the same sequence number + if ((pStatusWord[1] &BASIC_RF_CRC_OK_BM) )//&& (rxi.seqNumber != pHdr->seqNumber)) + { + // If security is used check also that authentication passed + #ifdef SECURITY_CCM + if (authStatus == SUCCESS) + { + if ((pHdr->fcf0 &BASIC_RF_FCF_BM_L) == (BASIC_RF_FCF_NOACK_L | BASIC_RF_SEC_ENABLED_FCF_BM_L)) + { + rxi.isReady = TRUE; + } + } + #else + if (((pHdr->fcf0 &(BASIC_RF_FCF_BM_L)) == BASIC_RF_FCF_NOACK_L)) + { + rxi.isReady = TRUE; + } + #endif + } + rxi.seqNumber = pHdr->seqNumber; + } + // Enable RX frame done interrupt again + halIntOff(); + halRfEnableRxInterrupt(); +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn basicRfInit +// @brief Initialise basic RF datastructures. Sets channel, short address and +// PAN id in the chip and configures interrupt on packet reception +// @param pRfConfig - pointer to BASIC_RF_CONFIG struct. +// This struct must be allocated by higher layer +// txState - file scope variable that keeps tx state info +// rxi - file scope variable info extracted from the last incoming frame +// @return none +//------------------------------------------------------------------- +uint8 basicRfInit(basicRfCfg_t *pRfConfig) +{ + if (halRfInit() == FAILED) + { + return FAILED; + } + + halIntOff(); + + // Set the protocol configuration + pConfig = pRfConfig; + rxi.pPayload = NULL; + + txState.receiveOn = TRUE; + txState.frameCounter = 0; + + // Set channel + halRfSetChannel(pConfig->channel); + + // Write the short address and the PAN ID to the CC2520 RAM + halRfSetShortAddr(pConfig->myAddr); + halRfSetPanId(pConfig->panId); + + // if security is enabled, write key and nonce + #ifdef SECURITY_CCM + basicRfSecurityInit(pConfig); + #endif + + // Set up receive interrupt (received data or acknowlegment) + halRfRxInterruptConfig(basicRfRxFrmDoneIsr); + + halIntOn(); + + return SUCCESS; +} + +//------------------------------------------------------------------- +// @fn basicRfSendPacket +// @brief Send packet +// @param destAddr - destination short address +// pPayload - pointer to payload buffer. This buffer must be +// allocated by higher layer. +// length - length of payload +// txState - file scope variable that keeps tx state info +// mpdu - file scope variable. Buffer for the frame to send +// @return basicRFStatus_t - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 basicRfSendPacket(uint16 destAddr, uint8 *pPayload, uint8 length) +{ + uint8 mpduLength; + uint8 status; + + // Turn on receiver if its not on + if (!txState.receiveOn) + { + halRfReceiveOn(); + } + + // Check packet length + length = MIN(length, BASIC_RF_MAX_PAYLOAD_SIZE); + + // Wait until the transceiver is idle + halRfWaitTransceiverReady(); + + // Turn off RX frame done interrupt to avoid interference on the SPI interface + halRfDisableRxInterrupt(); + + mpduLength = basicRfBuildMpdu(destAddr, pPayload, length); + + #ifdef SECURITY_CCM + halRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M); + txState.frameCounter++; // Increment frame counter field + #else + halRfWriteTxBuf(txMpdu, mpduLength); + #endif + + // Turn on RX frame done interrupt for ACK reception + halRfEnableRxInterrupt(); + + // Send frame with CCA. return FAILED if not successful + if (halRfTransmit() != SUCCESS) + { + status = FAILED; + } + + // Wait for the acknowledge to be received, if any + if (pConfig->ackRequest) + { + txState.ackReceived = FALSE; + + // We'll enter RX automatically, so just wait until we can be sure that the ack reception should have finished + // The timeout consists of a 12-symbol turnaround time, the ack packet duration, and a small margin + halMcuWaitUs((12 *BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATION) + (2 *BASIC_RF_SYMBOL_DURATION) + 10); + + // If an acknowledgment has been received (by RxFrmDoneIsr), the ackReceived flag should be set + status = txState.ackReceived ? SUCCESS : FAILED; + } + else + { + status = SUCCESS; + } + + // Turn off the receiver if it should not continue to be enabled + if (!txState.receiveOn) + { + halRfReceiveOff(); + } + + if (status == SUCCESS) + { + txState.txSeqNumber++; + } + + #ifdef SECURITY_CCM + halRfIncNonceTx(); // Increment nonce value + #endif + + return status; +} + +//------------------------------------------------------------------- +// @fn basicRfPacketIsReady +// @brief Check if a new packet is ready to be read by next higher layer +// @param none +// @return uint8 - TRUE if a packet is ready to be read by higher layer +//------------------------------------------------------------------- +uint8 basicRfPacketIsReady(void) +{ + return rxi.isReady; +} + +//------------------------------------------------------------------- +// @fn basicRfReceive +// @brief Copies the payload of the last incoming packet into a buffer +// @param pRxData - pointer to data buffer to fill. This buffer must be +// allocated by higher layer. +// len - Number of bytes to read in to buffer +// rxi - file scope variable holding the information of the last +// incoming packet +// @return uint8 - number of bytes actually copied into buffer +//------------------------------------------------------------------- +uint8 basicRfReceive(uint8 *pRxData, uint16 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) + { + if (rxi.rssi < 128) + { + *pRssi = rxi.rssi - halRfGetRssiOffset(); + } + else + { + *pRssi = (rxi.rssi - 256) - halRfGetRssiOffset(); + } + } + rxi.isReady = FALSE; + halIntOn(); + + // Critical region end + return MIN(rxi.length, len); +} + +//------------------------------------------------------------------- +// @fn basicRfGetRssi +// @brief Copies the payload of the last incoming packet into a buffer +// @param none +// @return int8 - RSSI value +//------------------------------------------------------------------- +int8 basicRfGetRssi(void) +{ + if (rxi.rssi < 128) + { + return rxi.rssi - halRfGetRssiOffset(); + } + else + { + return (rxi.rssi - 256) - halRfGetRssiOffset(); + } +} + +//------------------------------------------------------------------- +// @fn basicRfReceiveOn +// @brief Turns on receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOn(void) +{ + txState.receiveOn = TRUE; + halRfReceiveOn(); +} + +//------------------------------------------------------------------- +// @fn basicRfReceiveOff +// @brief Turns off receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOff(void) +{ + txState.receiveOn = FALSE; + halRfReceiveOff(); +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.h new file mode 100644 index 0000000..655960e --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf.h @@ -0,0 +1,123 @@ +//------------------------------------------------------------------- +// Filename: basic_rf.h +// Description: Basic RF library header file +//------------------------------------------------------------------- +// The "Basic RF" library contains simple functions for packet transmission and +// reception with the IEEE 802.15.4 compliant radio devices. The intention of this +// library is to demonstrate how the radio devices are operated, and not to provide +// a complete and fully-functional packet protocol. The protocol uses 802.15.4 MAC compliant data +// and acknowledgment packets, however it contains only a small subset of the +// 802.15.4 standard: +// - Association, scanning nor beacons are not implemented +// - No defined coordinator/device roles (peer-to-peer, all nodes are equal) +// - Waits for the channel to become ready, but does not check CCA twice +// (802.15.4 CSMA-CA) +// - Does not retransmit packets +// +// INSTRUCTIONS: +// Startup: +// 1. Create a basicRfCfg_t structure, and initialize the members: +// 2. Call basicRfInit() to initialize the packet protocol. +// +// Transmission: +// 1. Create a buffer with the payload to send +// 2. Call basicRfSendPacket() +// +// Reception: +// 1. Check if a packet is ready to be received by highger layer with +// basicRfPacketIsReady() +// 2. Call basicRfReceive() to receive the packet by higher layer +// +// FRAME FORMATS: +// Data packets (without security): +// [Preambles (4)][SFD (1)][Length (1)][Frame control field (2)] +// [Sequence number (1)][PAN ID (2)][Dest. address (2)][Source address (2)] +// [Payload (Length - 2+1+2+2+2)][Frame check sequence (2)] +// +// Acknowledgment packets: +// [Preambles (4)][SFD (1)][Length = 5 (1)][Frame control field (2)] +// [Sequence number (1)][Frame check sequence (2)] +//------------------------------------------------------------------- + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef struct +{ + uint16 myAddr; // ±¾»úµØÖ· + uint16 panId; // ÍøÂçID + uint8 channel; // ͨÐÅÐŵÀ£¬ 11~26 + uint8 ackRequest; //Ó¦´ðÐźŠ+ #ifdef SECURITY_CCM + uint8 *securityKey; + uint8 *securityNonce; + #endif +} basicRfCfg_t; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS + + +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn basicRfInit +// @brief Initialise basic RF datastructures. Sets channel, short address and +// PAN id in the chip and configures interrupt on packet reception +// @param pRfConfig - pointer to BASIC_RF_CONFIG struct. +// This struct must be allocated by higher layer +// txState - file scope variable that keeps tx state info +// rxi - file scope variable info extracted from the last incoming frame +// @return none +//------------------------------------------------------------------- +uint8 basicRfInit(basicRfCfg_t *pRfConfig); + +//------------------------------------------------------------------- +// @fn basicRfSendPacket +// @brief Send packet +// @param destAddr - destination short address +// pPayload - pointer to payload buffer. This buffer must be +// allocated by higher layer. +// length - length of payload +// txState - file scope variable that keeps tx state info +// mpdu - file scope variable. Buffer for the frame to send +// @return basicRFStatus_t - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 basicRfSendPacket(uint16 destAddr, uint8 *pPayload, uint8 length); + +//------------------------------------------------------------------- +// @fn basicRfPacketIsReady +// @brief Check if a new packet is ready to be read by next higher layer +// @param none +// @return uint8 - TRUE if a packet is ready to be read by higher layer +//------------------------------------------------------------------- +uint8 basicRfPacketIsReady(void); + +//------------------------------------------------------------------- +// @fn basicRfReceive +// @brief Copies the payload of the last incoming packet into a buffer +// @param pRxData - pointer to data buffer to fill. This buffer must be +// allocated by higher layer. +// len - Number of bytes to read in to buffer +// rxi - file scope variable holding the information of the last +// incoming packet +// @return uint8 - number of bytes actually copied into buffer +//------------------------------------------------------------------- +uint8 basicRfReceive(uint8 *pRxData, uint16 len, int16 *pRssi); + +//------------------------------------------------------------------- +// @fn basicRfReceiveOn +// @brief Turns on receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOn(void); + +//------------------------------------------------------------------- +// @fn basicRfReceiveOff +// @brief Turns off receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOff(void); + + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.c new file mode 100644 index 0000000..b73faf0 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.c @@ -0,0 +1,60 @@ +//------------------------------------------------------------------- +// Filename: basic_rf_security.c +// Description: Basic RF security library +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#ifdef SECURITY_CCM + #include "hal_defs.h" + #include "hal_rf_security.h" + #include "basic_rf.h" + #include "basic_rf_security.h" + + //------------------------------------------------------------------- + // CONSTANTS AND DEFINES + //------------------------------------------------------------------- + #define FLAG_FIELD 0x09 + #define NONCE_SIZE 16 + + //------------------------------------------------------------------- + // LOCAL VARIABLES + //------------------------------------------------------------------- + static uint8 nonceTx[NONCE_SIZE]; + static uint8 nonceRx[NONCE_SIZE]; + + //------------------------------------------------------------------- + // GLOBAL FUNCTIONS + //------------------------------------------------------------------- + //------------------------------------------------------------------- + // @fn basicRfSecurityInit + // @brief Initialise key and nonces and write to radio + // @param pConfig - file scope variable holding configuration data for basic RF + // @return none + //------------------------------------------------------------------- + void basicRfSecurityInit(basicRfCfg_t *pConfig) + { + uint8 i; + + // Initialise nonce bytes to 0 + for (i = 0; i < NONCE_SIZE; i++) + { + nonceRx[i] = 0; + nonceTx[i] = 0; + } + + // Set nonce flag field (Byte 0) + nonceRx[0] = FLAG_FIELD; + nonceTx[0] = FLAG_FIELD; + + // Set byte 7 and 8 of nonce to myAddr + nonceTx[8] = (uint8)pConfig->myAddr; + nonceTx[7] = (uint8)(pConfig->myAddr >> 8); + + // Set Security mode field of nonces (Byte 13) + nonceRx[13] = SECURITY_CONTROL; + nonceTx[13] = SECURITY_CONTROL; + + halRfSecurityInit(pConfig->securityKey, nonceRx, nonceTx); + } +#endif diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.h new file mode 100644 index 0000000..1af1cdf --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/basicrf/basic_rf_security.h @@ -0,0 +1,8 @@ +//------------------------------------------------------------------- +// Filename: basic_rf_security.h +// Description: Basic RF security library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void basicRfSecurityInit(basicRfCfg_t *pConfig); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.c new file mode 100644 index 0000000..1a1eb90 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.c @@ -0,0 +1,17 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_digio.h" +#include "hal_int.h" +#include "hal_board.h" +#include "hal_uart.h" + +void halBoardInit(void) +{ + halMcuInit(); + halUartInit(115200); + halIntOn(); +} + + + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.h new file mode 100644 index 0000000..51cae44 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_board.h @@ -0,0 +1,307 @@ +//------------------------------------------------------------------- +// Filename: hal_board.h +// Description: MCU-KIT1 board with CC2530 +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS +//------------------------------------------------------------------- + +// Board properties +#define BOARD_NAME "ZIGBEE-DMA2530" +#define NUM_LEDS 4 + +// Clock +#define BSP_CONFIG_CLOCK_MHZ 32 + + +//RFID_FLAG +#define HAL_BOARD_IO_FLAG_PORT 1 +#define HAL_BOARD_IO_FLAG_PIN 1 + +//CD2530_Test_Pin +#define HAL_BOARD_IO_TEST1_PORT 1 +#define HAL_BOARD_IO_TEST1_PIN 3 +#define HAL_BOARD_IO_TEST2_PORT 1 +#define HAL_BOARD_IO_TEST2_PIN 4 +#define HAL_BOARD_IO_TEST3_PORT 1 +#define HAL_BOARD_IO_TEST3_PIN 5 +#define HAL_BOARD_IO_TEST4_PORT 0 +#define HAL_BOARD_IO_TEST4_PIN 0 + + +// LEDs +#define HAL_BOARD_IO_LED_PORT 1 + +//#define HAL_BOARD_IO_LED_1_PORT 1 +//#define HAL_BOARD_IO_LED_1_PIN 2 +#define HAL_BOARD_IO_LED_1_PORT 1 +#define HAL_BOARD_IO_LED_1_PIN 0 +#define HAL_BOARD_IO_LED_2_PORT 1 +#define HAL_BOARD_IO_LED_2_PIN 1 +#define HAL_BOARD_IO_LED_3_PORT 1 +#define HAL_BOARD_IO_LED_3_PIN 3 +#define HAL_BOARD_IO_LED_4_PORT 1 +#define HAL_BOARD_IO_LED_4_PIN 4 + +//DC +#define HAL_BOARD_IO_DC_1_PORT 2 +#define HAL_BOARD_IO_DC_1_PIN 0 +#define HAL_BOARD_IO_DC_2_PORT 1 +#define HAL_BOARD_IO_DC_2_PIN 7 + +//TC72 +#define HAL_BOARD_IO_TC72_SDI_PORT 0 +#define HAL_BOARD_IO_TC72_SDI_PIN 4 +#define HAL_BOARD_IO_TC72_SCL_PORT 0 +#define HAL_BOARD_IO_TC72_SCL_PIN 5 +#define HAL_BOARD_IO_TC72_SDO_PORT 0 +#define HAL_BOARD_IO_TC72_SDO_PIN 6 +#define HAL_BOARD_IO_TC72_SSS_PORT 0 +#define HAL_BOARD_IO_TC72_SSS_PIN 7 + +//AT24C02(E2PROM) +#define HAL_BOARD_IO_E2PROM_SCL_PORT 0 +#define HAL_BOARD_IO_E2PROM_SCL_PIN 6 +#define HAL_BOARD_IO_E2PROM_SDA_PORT 0 +#define HAL_BOARD_IO_E2PROM_SDA_PIN 7 + +//ITG +#define HAL_BOARD_IO_E2PROM_SCK_PORT 0 +#define HAL_BOARD_IO_E2PROM_SCK_PIN 6 +#define HAL_BOARD_IO_E2PROM_SDA_PORT 0 +#define HAL_BOARD_IO_E2PROM_SDA_PIN 7 + + +// SPI +#define HAL_BOARD_IO_SPI_MISO_PORT 0 +#define HAL_BOARD_IO_SPI_MISO_PIN 6 +#define HAL_BOARD_IO_SPI_MOSI_PORT 0 +#define HAL_BOARD_IO_SPI_MOSI_PIN 4 +#define HAL_BOARD_IO_SPI_CLK_PORT 0 +#define HAL_BOARD_IO_SPI_CLK_PIN 5 +#define HAL_BOARD_IO_SPI_CS_PORT 0 +#define HAL_BOARD_IO_SPI_CS_PIN 7 + +//SHT +#define HAL_BOARD_IO_SHT_SCK_PORT 2 +#define HAL_BOARD_IO_SHT_SCK_PIN 4 +#define HAL_BOARD_IO_SHT_SDA_PORT 2 +#define HAL_BOARD_IO_SHT_SDA_PIN 3 + +//SR04£¨³¬Éù²¨£© +#define HAL_BOARD_IO_SR04_TX_PORT 2 +#define HAL_BOARD_IO_SR04_TX_PIN 3 +#define HAL_BOARD_IO_SR04_RX_PORT 2 +#define HAL_BOARD_IO_SR04_RX_PIN 4 + +//TCS (ÑÕÉ«) +#define HAL_BOARD_IO_TCS_S2_PORT 2 +#define HAL_BOARD_IO_TCS_S2_PIN 3 +#define HAL_BOARD_IO_TCS_S3_PORT 2 +#define HAL_BOARD_IO_TCS_S3_PIN 4 + + +// I2C +#define HAL_BOARD_IO_I2C_SCL_PORT 0 +#define HAL_BOARD_IO_I2C_SCL_PIN 5 +#define HAL_BOARD_IO_I2C_SDA_PORT 0 +#define HAL_BOARD_IO_I2C_SDA_PIN 4 + +// LED +#define HAL_BOARD_IO_LED_DATA_PORT 1 + +// A/D +#define HAL_BOARD_IO_ADC_PORT 0 +#define HAL_BOARD_IO_ADC_CH 0 + +// INT +#define HAL_BOARD_IO_INT_PORT 0 +#define HAL_BOARD_IO_INT_PIN 1 + +// DO +#define HAL_BOARD_IO_DO_PORT 0 +#define HAL_BOARD_IO_DO_PIN 0 + +//OUT +#define HAL_BOARD_IO_OUT_PORT 1 +#define HAL_BOARD_IO_OUT_PIN 7 + +// UART +#define HAL_BOARD_IO_UART_TXD_PORT 0 +#define HAL_BOARD_IO_UART_TXD_PIN 3 +#define HAL_BOARD_IO_UART_RXD_PORT 0 +#define HAL_BOARD_IO_UART_RXD_PIN 2 + +// UART1 +#define HAL_BOARD_IO_UART1_TXD_PORT 1 +#define HAL_BOARD_IO_UART1_TXD_PIN 6 +#define HAL_BOARD_IO_UART1_RXD_PORT 1 +#define HAL_BOARD_IO_UART1_RXD_PIN 7 + +// Debounce +#define HAL_DEBOUNCE(expr) { char i; for (i=0; i<50; i++) { if (!(expr)) i = 0; } } + +// Assert +#define HAL_ASSERT(szErrMsg) { halAssertHandler(szErrMsg); } + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- + +//CD2530_Test_Pin + +#define HAL_BOARD_TEST1_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST1_PORT, HAL_BOARD_IO_TEST1_PIN, MCU_IO_PULLUP) +#define HAL_BOARD_TEST2_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST2_PORT, HAL_BOARD_IO_TEST2_PIN, MCU_IO_PULLUP) +#define HAL_BOARD_TEST3_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST3_PORT, HAL_BOARD_IO_TEST3_PIN, MCU_IO_PULLUP) +#define HAL_BOARD_TEST4_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST4_PORT, HAL_BOARD_IO_TEST4_PIN, MCU_IO_PULLUP) + +#define HAL_BOARD_TEST1_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST1_PORT, HAL_BOARD_IO_TEST1_PIN) +#define HAL_BOARD_TEST2_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST2_PORT, HAL_BOARD_IO_TEST2_PIN) +#define HAL_BOARD_TEST3_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST3_PORT, HAL_BOARD_IO_TEST3_PIN) +#define HAL_BOARD_TEST4_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST4_PORT, HAL_BOARD_IO_TEST4_PIN) + +//RFID_FLAG +#define HAL_FLAG_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_FLAG_PORT, HAL_BOARD_IO_FLAG_PIN) +#define HAL_FLAG_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_FLAG_PORT, HAL_BOARD_IO_FLAG_PIN) + +// LED +#define HAL_LED_SET_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN) +#define HAL_LED_SET_2() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN) +#define HAL_LED_SET_3() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN) +#define HAL_LED_SET_4() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN) + +#define HAL_LED_CLR_1() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN) +#define HAL_LED_CLR_2() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN) +#define HAL_LED_CLR_3() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN) +#define HAL_LED_CLR_4() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN) + + +#define HAL_LED_TGL_1() MCU_IO_TGL(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN) +#define HAL_LED_TGL_2() MCU_IO_TGL(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN) +#define HAL_LED_TGL_3() MCU_IO_TGL(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN) +#define HAL_LED_TGL_4() MCU_IO_TGL(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN) + +//DC +#define HAL_DC_START_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_DC_1_PORT, HAL_BOARD_IO_DC_1_PIN) +#define HAL_DC_START_2() MCU_IO_SET_HIGH(HAL_BOARD_IO_DC_2_PORT, HAL_BOARD_IO_DC_2_PIN) + +#define HAL_DC_STOP_1() MCU_IO_SET_LOW(HAL_BOARD_IO_DC_1_PORT, HAL_BOARD_IO_DC_1_PIN) +#define HAL_DC_STOP_2() MCU_IO_SET_LOW(HAL_BOARD_IO_DC_2_PORT, HAL_BOARD_IO_DC_2_PIN) + +//TC72 +#define HAL_TC72_SDI_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SDI_PORT, HAL_BOARD_IO_TC72_SDI_PIN) +#define HAL_TC72_SCL_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SCL_PORT, HAL_BOARD_IO_TC72_SCL_PIN) +#define HAL_TC72_SSS_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SSS_PORT, HAL_BOARD_IO_TC72_SSS_PIN) + +#define HAL_TC72_SDI_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_TC72_SDI_PORT, HAL_BOARD_IO_TC72_SDI_PIN) +#define HAL_TC72_SCL_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_TC72_SCL_PORT, HAL_BOARD_IO_TC72_SCL_PIN) +#define HAL_TC72_SSS_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_TC72_SSS_PORT, HAL_BOARD_IO_TC72_SSS_PIN) + +#define HAL_TC72_SDO_VAL() MCU_IO_GET(HAL_BOARD_IO_TC72_SDO_PORT, HAL_BOARD_IO_TC72_SDO_PIN) + +#define HAL_TC72_SDO_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SDO_PORT, HAL_BOARD_IO_TC72_SDO_PIN) + +//AT24C02(E2PROM) +#define HAL_E2PROM_SCL_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,0) +//#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,1) +//#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,MCU_IO_PULLUP) + +#define HAL_E2PROM_SCL_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN) +#define HAL_E2PROM_SCL_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN) + +//#define HAL_E2PROM_SDA_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) +//#define HAL_E2PROM_SDA_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) + +//#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) + +//ITG +#define HAL_E2PROM_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,1) +#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,1) +#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,MCU_IO_PULLUP) + +#define HAL_E2PROM_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,1) +#define HAL_E2PROM_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,0) + +#define HAL_E2PROM_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,1) +#define HAL_E2PROM_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,0) + +#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) + +// LED_ALL +#define HAL_LED_PORT(val) MCU_PORT_OUTPUT(HAL_BOARD_IO_LED_DATA_PORT, val) + +// SPI +#define HAL_SPI_INIT() {MCU_IO_OUTPUT(HAL_BOARD_IO_SPI_MOSI_PORT, HAL_BOARD_IO_SPI_MOSI_PIN, 1);MCU_IO_OUTPUT(HAL_BOARD_IO_SPI_CLK_PORT, HAL_BOARD_IO_SPI_CLK_PIN, 1);MCU_IO_OUTPUT(HAL_BOARD_IO_SPI_CS_PORT, HAL_BOARD_IO_SPI_CS_PIN, 1);MCU_IO_INPUT(HAL_BOARD_IO_SPI_MISO_PORT, HAL_BOARD_IO_SPI_MISO_PIN,MCU_IO_PULLUP);} + +#define HAL_SPI_MOSI_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_SPI_MOSI_PORT, HAL_BOARD_IO_SPI_MOSI_PIN) +#define HAL_SPI_MOSI_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_SPI_MOSI_PORT, HAL_BOARD_IO_SPI_MOSI_PIN) + +#define HAL_SPI_CLK_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_SPI_CLK_PORT, HAL_BOARD_IO_SPI_CLK_PIN) +#define HAL_SPI_CLK_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_SPI_CLK_PORT, HAL_BOARD_IO_SPI_CLK_PIN) + +#define HAL_SPI_CS_EN() MCU_IO_SET_LOW(HAL_BOARD_IO_SPI_CS_PORT, HAL_BOARD_IO_SPI_CS_PIN) +#define HAL_SPI_CS_DIS() MCU_IO_SET_HIGH(HAL_BOARD_IO_SPI_CS_PORT, HAL_BOARD_IO_SPI_CS_PIN) + +#define HAL_SPI_MISO_VAL() MCU_IO_GET(HAL_BOARD_IO_SPI_MISO_PORT, HAL_BOARD_IO_SPI_MISO_PIN) + +//SHT +#define HAL_SHT_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_SHT_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1)//MCU_IO_SET_HIGH(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN) +#define HAL_SHT_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0)//MCU_IO_SET_LOW(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN) + +#define HAL_SHT_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1)//MCU_IO_SET_HIGH(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define HAL_SHT_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0)//MCU_IO_SET_LOW(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define HAL_SHT_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_SHT_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,MCU_IO_PULLUP) +#define HAL_SHT_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) + +//SR04£¨³¬Éù²¨£© + +#define HAL_SHT_TX_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SR04_TX_PORT, HAL_BOARD_IO_SR04_TX_PIN,0) +#define HAL_SHT_TX_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SR04_TX_PORT, HAL_BOARD_IO_SR04_TX_PIN,1) +#define HAL_SHT_TX_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SR04_TX_PORT, HAL_BOARD_IO_SR04_TX_PIN,0) + +#define HAL_SHT_RX_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SR04_RX_PORT, HAL_BOARD_IO_SR04_RX_PIN,MCU_IO_PULLUP) +#define HAL_SHT_RX_VAL() MCU_IO_GET(HAL_BOARD_IO_SR04_RX_PORT, HAL_BOARD_IO_SR04_RX_PIN) + +//flame(»ðÑæ) +#define HAL_SHT_FLAME_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH,MCU_IO_PULLUP) +#define HAL_SHT_FLAME_VAL() MCU_IO_GET(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH) + +//TCS(ÑÕÉ«) +#define HAL_SHT_S2_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S2_PORT, HAL_BOARD_IO_TCS_S2_PIN,0) +#define HAL_SHT_S2_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S2_PORT, HAL_BOARD_IO_TCS_S2_PIN,1) +#define HAL_SHT_S2_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S2_PORT, HAL_BOARD_IO_TCS_S2_PIN,0) + +#define HAL_SHT_S3_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S3_PORT, HAL_BOARD_IO_TCS_S3_PIN,0) +#define HAL_SHT_S3_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S3_PORT, HAL_BOARD_IO_TCS_S3_PIN,1) +#define HAL_SHT_S3_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S3_PORT, HAL_BOARD_IO_TCS_S3_PIN,0) + +// I2C +#define HAL_I2C_SCL_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_I2C_SCL_PORT, HAL_BOARD_IO_I2C_SCL_PIN,0) +#define HAL_I2C_SCL_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_I2C_SCL_PORT, HAL_BOARD_IO_I2C_SCL_PIN) +#define HAL_I2C_SCL_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_I2C_SCL_PORT, HAL_BOARD_IO_I2C_SCL_PIN) + +#define HAL_I2C_SDA_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN) +#define HAL_I2C_SDA_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN) +#define HAL_I2C_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN,1) +#define HAL_I2C_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN,MCU_IO_PULLUP) +#define HAL_I2C_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN) + +// DO +#define HAL_DO_OFF() MCU_IO_SET_HIGH(HAL_BOARD_IO_DO_PORT, HAL_BOARD_IO_DO_PIN) +#define HAL_DO_ON() MCU_IO_SET_LOW(HAL_BOARD_IO_DO_PORT, HAL_BOARD_IO_DO_PIN) +#define HAL_DO_OUTPUT() MCU_IO_OUTPUT(HAL_BOARD_IO_DO_PORT, HAL_BOARD_IO_DO_PIN, 1) + +//INT +#define HAL_INT_VAL() MCU_IO_GET(HAL_BOARD_IO_INT_PORT, HAL_BOARD_IO_INT_PIN) + +//OUT +#define HAL_OUT_VAL() MCU_IO_GET(HAL_BOARD_IO_OUT_PORT, HAL_BOARD_IO_OUT_PIN) + + +//------------------------------------------------------------------- +// FUNCTION PROTOTYPES +//------------------------------------------------------------------- +void halBoardInit(void); + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.c new file mode 100644 index 0000000..1980f63 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.c @@ -0,0 +1,98 @@ +//------------------------------------------------------------------- +// Filename: hal_led.c +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_led.h" + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halLedSet +// @brief Turn LED on. +// @param uint8 id - led to set +// @return none +//------------------------------------------------------------------- +void halLedSet(uint8 id) +{ + switch (id) + { + case 1: + HAL_LED_SET_1(); + break; + case 2: + HAL_LED_SET_2(); + break; + case 3: + HAL_LED_SET_3(); + break; + case 4: + HAL_LED_SET_4(); + break; + + default: + break; + } +} + +//------------------------------------------------------------------- +// @fn halLedClear +// @brief Turn LED off. +// @param uint8 id - led to clear +// @return none +//------------------------------------------------------------------- +void halLedClear(uint8 id) +{ + switch (id) + { + case 1: + HAL_LED_CLR_1(); + break; + case 2: + HAL_LED_CLR_2(); + break; + case 3: + HAL_LED_CLR_3(); + break; + case 4: + HAL_LED_CLR_4(); + break; + default: + break; + } +} + +//------------------------------------------------------------------- +// @fn halLedToggle +// @brief Change state of LED. If on, turn it off. Else turn on. +// @param uint8 id - led to toggle +// @return none +//------------------------------------------------------------------- +void halLedToggle(uint8 id) +{ + switch (id) + { + case 1: + HAL_LED_TGL_1(); + break; + case 2: + HAL_LED_TGL_2(); + break; + case 3: + HAL_LED_TGL_3(); + break; + case 4: + HAL_LED_TGL_4(); + break; + default: + break; + } +} + +//------------------------------------------------------------------- diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.h new file mode 100644 index 0000000..1591503 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/board/hal_led.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: hal_led.h +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halLedSet(uint8 led_id); +void halLedClear(uint8 led_id); +void halLedToggle(uint8 led_id); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.c new file mode 100644 index 0000000..1ec78ce --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.c @@ -0,0 +1,57 @@ +#include "hal_defs.h" +#include "hal_led.h" +#include "TIMER.h" + + +uint8 SEND_DATA_FLAG = 0; +uint16 NUM = 0; + +void Timer4_Init(void) +{ + // Set prescaler divider value to 128 (32M/128 = 250KHZ) + T4CTL |= 0xE0; + T4CTL &= ~(0x10); // Stop timer + T4CTL &= ~(0x08); // ½ûÖ¹Òç³öÖÐ¶Ï + T4CTL |= 0x04; //¼ÆÊýÆ÷ÇåÁã + T4IE = 0; // Disable interrupt +} + +void Timer4_On(void) +{ + T4CTL |= 0x08; //ʹÄÜÒç³öÖÐ¶Ï + T4CTL &= ~(0x03);//0x00-0xFF + T4CTL |= 0x10; // Start timer + T4IE = 1; // Enable interrupt +} + +void Timer4_Off(void) +{ + T4CTL &= ~(0x08); // ½ûÖ¹Òç³öÖÐ¶Ï + T4CTL &= ~(0x10); // Stop timer + T4IE = 0; // Disable interrupt +} + +uint8 GetSendDataFlag(void) +{ + return SEND_DATA_FLAG; +} + + + +HAL_ISR_FUNCTION(T4_ISR, T4_VECTOR) +{ + T4OVFIF = 0; + T4IF = 0; + + NUM ++; + if(NUM == 500)//1953) //¶¨Ê±2s£¬·­×ªÒ»´Î£¨1/250000*256£©ÕâÊǽøÒ»´ÎÖжÏËùÐèÒªµÄʱ¼ä£¬½ø781´ÎÖжϴóÔ¼ÊÇ0.8s + { + NUM = 0; + SEND_DATA_FLAG = 1; + //halLedToggle(1); + } + else + { + SEND_DATA_FLAG = 0; + } +} \ No newline at end of file diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.h new file mode 100644 index 0000000..16a4653 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/TIMER.h @@ -0,0 +1,4 @@ +void Timer4_Init(void); +void Timer4_On(void); +void Timer4_Off(void); +uint8 GetSendDataFlag(void); \ No newline at end of file diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.c new file mode 100644 index 0000000..04d7258 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.c @@ -0,0 +1,56 @@ +//------------------------------------------------------------------- +// Filename: hal_adc.c +// Description: These functions/macros simplifies usage of the ADC. +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_adc.h" + +//------------------------------------------------------------------- +// @fn adcSampleSingle +// @brief +// This function makes the adc sample the given channel at the given +// resolution with the given reference. +// @param uint8 reference +// The reference to compare the channel to be sampled. +// uint8 resolution +// The resolution to use during the sample (8, 10, 12 or 14 bit) +// uint8 input +// The channel to be sampled. +// @return int16 +// The conversion result +//------------------------------------------------------------------- +unsigned int adcSampleSingle(uint8 reference, uint8 resolution, uint8 channel) +{ + unsigned int value; + + ADC_ENABLE_CHANNEL(channel); + + ADCIF = 0; + ADC_SINGLE_CONVERSION(reference | resolution | channel); + while (!ADCIF) + ; + + value = ((unsigned int) ADCH) << 8; + value |= (unsigned int) ADCL; + + if(value & 0x8000) + { + value = 0; + } + + value = value & 0x7FF8; + + ADC_DISABLE_CHANNEL(channel); + + // The variable 'value' contains 16 bits where + // bit 15 is a sign bit + // bit [14 .. 0] contain the absolute sample value + // Only the r upper bits are significant, where r is the resolution + // Resolution: + // 12 -> [14 .. 3] (bitmask 0x7FF8) + // 10 -> [14 .. 5] (bitmask 0x7FE0) + // 9 -> [14 .. 6] (bitmask 0x7FC0) + // 7 -> [14 .. 8] (bitmask 0x7F00) + + return value; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.h new file mode 100644 index 0000000..309c674 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_adc.h @@ -0,0 +1,86 @@ +//------------------------------------------------------------------- +// Filename: hal_adc.h +// Description: These functions/macros simplifies usage of the ADC. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND MACROS +//------------------------------------------------------------------- +// Macro for setting up a single conversion. If ADCCON1.STSEL = 11, using this +// macro will also start the conversion. +#define ADC_SINGLE_CONVERSION(settings) st( ADCCON3 = (settings); ) + +// Macro for setting up a single conversion +#define ADC_SEQUENCE_SETUP(settings) st( ADCCON2 = (settings); ) + +// Where _settings_ are the following: +// Reference voltage: +#define ADC_REF_1_25_V 0x00 // Internal 1.25V reference +#define ADC_REF_P0_7 0x40 // External reference on AIN7 pin +#define ADC_REF_AVDD 0x80 // AVDD_SOC pin +#define ADC_REF_P0_6_P0_7 0xC0 // External reference on AIN6-AIN7 differential input + +// Resolution (decimation rate): +#define ADC_7_BIT 0x00 // 64 decimation rate +#define ADC_9_BIT 0x10 // 128 decimation rate +#define ADC_10_BIT 0x20 // 256 decimation rate +#define ADC_12_BIT 0x30 // 512 decimation rate + +// Input channel: +#define ADC_AIN0 0x00 // single ended P0_0 +#define ADC_AIN1 0x01 // single ended P0_1 +#define ADC_AIN2 0x02 // single ended P0_2 +#define ADC_AIN3 0x03 // single ended P0_3 +#define ADC_AIN4 0x04 // single ended P0_4 +#define ADC_AIN5 0x05 // single ended P0_5 +#define ADC_AIN6 0x06 // single ended P0_6 +#define ADC_AIN7 0x07 // single ended P0_7 +#define ADC_GND 0x0C // Ground +#define ADC_TEMP_SENS 0x0E // on-chip temperature sensor +#define ADC_VDD_3 0x0F // (vdd/3) + +// Macro for starting the ADC in continuous conversion mode +#define ADC_SAMPLE_CONTINUOUS() \ +st( ADCCON1 &= ~0x30; \ +ADCCON1 |= 0x10; ) + +// Macro for stopping the ADC in continuous mode +#define ADC_STOP() st( ADCCON1 |= 0x30; ) + +// Macro for initiating a single sample in single-conversion mode (ADCCON1.STSEL = 11). +#define ADC_SAMPLE_SINGLE() \ +st( ADC_STOP(); \ +ADCCON1 |= 0x40; ) + +// Macro for configuring the ADC to be started from T1 channel 0. (T1 ch 0 must be in compare mode!!) +#define ADC_TRIGGER_FROM_TIMER1() \ +st( ADC_STOP(); \ +ADCCON1 &= ~0x10; ) + +// Expression indicating whether a conversion is finished or not. +#define ADC_SAMPLE_READY() st( ADCCON1 & 0x80; ) + +// Macro for setting/clearing a channel as input of the ADC +#define ADC_ENABLE_CHANNEL(ch) ADCCFG |= (0x01 << ch) +#define ADC_DISABLE_CHANNEL(ch) ADCCFG &= ~(0x01 << ch) + + +// Macros for configuring the ADC input: +// Example usage: +// IO_ADC_PORT0_PIN(0, IO_ADC_EN); +// IO_ADC_PORT0_PIN(4, IO_ADC_DIS); +// IO_ADC_PORT0_PIN(6, IO_ADC_EN); + +#define IO_ADC_PORT0_PIN(pin, adcEn) \ +st( if (adcEn) \ +ADCCFG |= BM( pin ); \ +else \ +ADCCFG &= ~BM( pin ) ) + +// where adcEn is one of: +#define IO_ADC_EN 1 // ADC input enabled +#define IO_ADC_DIS 0 // ADC input disab + +//------------------------------------------------------------------- +// PUBLIC FUNCTIONS +//------------------------------------------------------------------- +unsigned int adcSampleSingle(uint8 reference, uint8 resolution, uint8 channel); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_cc8051.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_cc8051.h new file mode 100644 index 0000000..d59f7f6 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_cc8051.h @@ -0,0 +1,53 @@ +//------------------------------------------------------------------- +// Filename: hal_cc8051.h +//------------------------------------------------------------------- +//------------------------------------------------------------------- +//CONSTANTS +//------------------------------------------------------------------- +#define BIT0 0x01 +#define BIT1 0x02 +#define BIT2 0x04 +#define BIT3 0x08 +#define BIT4 0x10 +#define BIT5 0x20 +#define BIT6 0x40 +#define BIT7 0x80 + +//------------------------------------------------------------------- +//MACROS +//------------------------------------------------------------------- +#define MCU_IO_TRISTATE 1 // Used as "func" for the macros below +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +//----------------------------------------------------------------------------- +// Macros for simple configuration of IO pins on TI LPW SoCs +//----------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin) +#define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func) +#define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val) +#define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val) +#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin) +#define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin) +#define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin) +#define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin) +#define MCU_PORT_SET_OUTPUT(port, val) MCU_PORT_SET_OUTPUT_PREP(port, val) +#define MCU_PORT_OUTPUT(port, val) MCU_PORT_OUTPUT_PREP(port, val) + +//---------------------------------------------------------------------------------- +// Macros for internal use (the macros above need a new round in the preprocessor) +//---------------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BM(pin); ) +#define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BM(pin); P##port##DIR &= ~BM(pin); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BM(pin); P##port##_##pin## = val; P##port##DIR |= BM(pin); ) +#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; ) +#define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; ) +#define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) +#define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; ) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) +#define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR &= ~BM(pin); ) +#define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BM(pin); ) +#define MCU_PORT_SET_OUTPUT_PREP(port, val) st( P##port##SEL = 0x00; P##port## = val; P##port##DIR = 0xff; ) +#define MCU_PORT_OUTPUT_PREP(port, val) st( P##port## = val; ) diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.c new file mode 100644 index 0000000..fa4351a --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.c @@ -0,0 +1,75 @@ +//------------------------------------------------------------------- +// Filename: hal_clock.c +// Description: This file defines clock related functions for the CC253x family +// of RF system-on-chips from Texas Instruments. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_clock.h" + +//------------------------------------------------------------------- +// PUBLIC FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn clockSetMainSrc +// @brief Function for setting the main system clock source. +// The function turns off the clock source that is not being used. +// TICKSPD is set to the same frequency as the source. +// @param uint8 source (one of CLOCK_SRC_HFRC or CLOCK_SRC_XOSC) +// @return void +//------------------------------------------------------------------- +void clockSetMainSrc(uint8 source) +{ + register uint8 osc32k_bm = CLKCONCMD &CLKCON_OSC32K_BM; + + // Source can have the following values: + // CLOCK_SRC_XOSC 0x00 High speed Crystal Oscillator (XOSC) + // CLOCK_SRC_HFRC 0x01 Low power RC Oscillator (HFRC) + + SLEEPCMD &= ~SLEEP_OSC_PD_BM; // power up both oscillators + while (!CC2530_IS_HFRC_STABLE() || ((SLEEPSTA &SLEEP_OSC_PD_BM) != 0)) + ; + // wait until the oscillator is stable + NOP(); + + if (source == CLOCK_SRC_HFRC) + { + CLKCONCMD = (osc32k_bm | CLKCON_OSC_BM | TICKSPD_DIV_2 | CLKCON_CLKSPD_BM); + } + else if (source == CLOCK_SRC_XOSC) + { + CLKCONCMD = (osc32k_bm | TICKSPD_DIV_1); + } + CC2530_WAIT_CLK_UPDATE(); + SLEEPCMD |= SLEEP_OSC_PD_BM; // power down the unused oscillator +} + +//------------------------------------------------------------------- +// @fn clockSelect32k +// @brief Function for selecting source for the 32kHz oscillator +// @param uint8 source (one of CLOCK_32K_XTAL or CLOCK_32K_RCOSC) +// @return uint8 - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 clockSelect32k(uint8 source) +{ + // System clock source must be high frequency RC oscillator before + // changing 32K source. + if (!(CLKCONSTA &CLKCON_OSC_BM)) + { + return FAILED; + } + + if (source == CLOCK_32K_XTAL) + { + CLKCONCMD &= ~CLKCON_OSC32K_BM; + } + else if (source == CLOCK_32K_RCOSC) + { + CLKCONCMD |= CLKCON_OSC32K_BM; + } + CC2530_WAIT_CLK_UPDATE(); + + return SUCCESS; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.h new file mode 100644 index 0000000..c664467 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_clock.h @@ -0,0 +1,66 @@ +//------------------------------------------------------------------- +// Filename: hal_clock.h +// Description: This file defines interface for clock related functions +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS +//------------------------------------------------------------------- +// SEE DATA SHEET FOR DETAILS ABOUT THE FOLLOWING BIT MASKS + +// Parameters for cc2530ClockSetMainSrc +#define CLOCK_SRC_XOSC 0 // High speed Crystal Oscillator Control +#define CLOCK_SRC_HFRC 1 // Low power RC Oscillator + +// Parameters for cc2530ClockSelect32k +#define CLOCK_32K_XTAL 0 // 32.768 Hz crystal oscillator +#define CLOCK_32K_RCOSC 1 // 32 kHz RC oscillator + +// Bit masks to check CLKCON register +#define CLKCON_OSC32K_BM 0x80 // bit mask, for the slow 32k clock oscillator +#define CLKCON_OSC_BM 0x40 // bit mask, for the system clock oscillator +#define CLKCON_TICKSPD_BM 0x38 // bit mask, for timer ticks output setting +#define CLKCON_CLKSPD_BM 0x01 // bit maks, for the clock speed + +#define TICKSPD_DIV_1 (0x00 << 3) +#define TICKSPD_DIV_2 (0x01 << 3) +#define TICKSPD_DIV_4 (0x02 << 3) +#define TICKSPD_DIV_8 (0x03 << 3) +#define TICKSPD_DIV_16 (0x04 << 3) +#define TICKSPD_DIV_32 (0x05 << 3) +#define TICKSPD_DIV_64 (0x06 << 3) +#define TICKSPD_DIV_128 (0x07 << 3) + +// Bit masks to check SLEEPSTA register +#define SLEEP_XOSC_STB_BM 0x40 // bit mask, check the stability of XOSC +#define SLEEP_HFRC_STB_BM 0x20 // bit maks, check the stability of the High-frequency RC oscillator +#define SLEEP_OSC_PD_BM 0x04 // bit mask, power down system clock oscillator(s) + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +// Macro for checking status of the high frequency RC oscillator. +#define CC2530_IS_HFRC_STABLE(x) (SLEEPSTA & SLEEP_HFRC_STB_BM) + +// Macro for checking status of the crystal oscillator +#define CC2530_IS_XOSC_STABLE(x) (SLEEPSTA & SLEEP_XOSC_STB_BM) + +// Macro for getting the clock division factor +#define CC2530_GET_CLKSPD(x) (CLKCONSTA & CLKCON_CLKSPD_BM) + +// Macro for getting the timer tick division factor. +#define CC2530_GET_TICKSPD(x) ((CLKCONSTA & CLKCON_TICKSPD_BM) >> 3) + +// Macro for setting the clock division factor, x value from 0b000 to 0b111 +#define CC2530_SET_TICKSPD(x) st( CLKCONCMD = ((((x) << 3) & 0x38) | (CLKCONCMD & 0xC7)); ) + +// Macro for setting the timer tick division factor, x value from 0b000 to 0b111 +#define CC2530_SET_CLKSPD(x) st( CLKCONCMD = (((x) & 0x07)| (CLKCONCMD & 0xF8)); ) + +// Macro for waiting for clock updates +#define CC2530_WAIT_CLK_UPDATE() st( uint8 ____clkcon; uint8 ____clkconsta; ____clkcon = CLKCONCMD; do { ____clkconsta = CLKCONSTA; } while (____clkconsta != ____clkcon); ) + +//------------------------------------------------------------------- +// FUNCTIONS +//------------------------------------------------------------------- +void clockSetMainSrc(uint8 source); +uint8 clockSelect32k(uint8 source); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_defs.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_defs.h new file mode 100644 index 0000000..84c14d7 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_defs.h @@ -0,0 +1,105 @@ +//------------------------------------------------------------------- +// Filename: hal_defs.h +// Description: HAL defines +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef signed char int8; +typedef unsigned char uint8; + +typedef signed short int16; +typedef unsigned short uint16; + +typedef signed long int32; +typedef unsigned long uint32; + +typedef void(*ISR_FUNC_PTR)(void); +typedef void(*VFPTR)(void); + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +#define TRUE 1 +#define FALSE 0 +#define NULL (void *)0 + +#define SUCCESS 0 +#define FAILED 1 + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define BV(n) (1 << (n)) + +#define BM(n) (1 << (n)) + +#define BF(x,b,s) (((x) & (b)) >> (s)) + +#define MIN(n,m) (((n) < (m)) ? (n) : (m)) + +#define MAX(n,m) (((n) < (m)) ? (m) : (n)) + +#define ABS(n) (((n) < 0) ? -(n) : (n)) + +// uint32 processing +#define BREAK_UINT32( var, ByteNum ) (uint8)((uint32)(((var) >>((ByteNum) * 8)) & 0x00FF)) +#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) ((uint32)((uint32)((Byte0) & 0x00FF) + ((uint32)((Byte1) & 0x00FF) << 8) + ((uint32)((Byte2) & 0x00FF) << 16) + ((uint32)((Byte3) & 0x00FF) << 24))) + +#define HI_UINT32(a) ((uint16) (((uint32)(a)) >> 16)) +#define LO_UINT32(a) ((uint16) ((uint32)(a))) + +// uint16 processing +#define BUILD_UINT16(loByte, hiByte) ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) + +#define HI_UINT16(a) (((uint16)(a) >> 8) & 0xFF) +#define LO_UINT16(a) ((uint16)(a) & 0xFF) + +// uint16 processing +#define BUILD_UINT8(hiByte, loByte) ((uint8)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4))) + +#define HI_UINT8(a) (((uint8)(a) >> 4) & 0x0F) +#define LO_UINT8(a) ((uint8)(a) & 0x0F) + +//------------------------------------------------------------------- +// This macro is for use by other macros to form a fully valid C statement. +// Without this, the if/else conditionals could show unexpected behavior. +// +// For example, use... +// #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) +// instead of ... +// #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } +// or +// #define SET_REGS() ioreg1 = 0; ioreg2 = 0; +// The last macro would not behave as expected in the if/else construct. +// The second to last macro will cause a compiler error in certain uses +// of if/else construct +// +// It is not necessary, or recommended, to use this macro where there is +// already a valid C statement. For example, the following is redundant... +// #define CALL_FUNC() st( func(); ) +// This should simply be... +// #define CALL_FUNC() func() +// +// (The while condition below evaluates false without generating a +// constant-controlling-loop type of warning on most compilers.) +//------------------------------------------------------------------- +#define st(x) do { x } while (__LINE__ == -1) + +//------------------------------------------------------------------- +// Compiler abstraction +//------------------------------------------------------------------- +#define _PRAGMA(x) _Pragma(#x) + +#define FAR +#define NOP() asm("NOP") + +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.c new file mode 100644 index 0000000..4c5fd79 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.c @@ -0,0 +1,492 @@ +//------------------------------------------------------------------- +// Filename: hal_digio.c +// Description: HAL digital IO functionality +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" +#include "hal_digio.h" + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- + +static ISR_FUNC_PTR port0_isr_tbl[8] = +{ + 0 +}; +static ISR_FUNC_PTR port1_isr_tbl[8] = +{ + 0 +}; +static ISR_FUNC_PTR port2_isr_tbl[5] = +{ + 0 +}; + + +// Find a better place for this! +#define PICTL_PADSC_BM 0x80 +#define PICTL_P2IEN_BM 0x40 +#define PICTL_P0IENH_BM 0x20 +#define PICTL_P0IENL_BM 0x10 +#define PICTL_P2ICON_BM 0x08 +#define PICTL_P1ICONH_BM 0x04 +#define PICTL_P1ICONL_BM 0x02 +#define PICTL_P1ICON_BM 0x06 // Combined - for compatibility +#define PICTL_P0ICON_BM 0x01 + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halDigioConfig +// @brief Configure the pin as specified by p. +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- + +//comment: find better way of doing this. SFR registers can not be accessed by pointers, therefore code is different from MSP430 code +// comment: currently support only P0 and P1 +uint8 halDigioConfig(const digioConfig *p) +{ + // register volatile uint8* dir; + register const uint8 bitmask = p->pin_bm; + + // Sanity check + if ((bitmask == 0) || (bitmask != (uint8)BV(p->pin))) + { + return (HAL_DIGIO_ERROR); + } + + switch (p->port) + { + case 0: + P0SEL &= ~bitmask; + if (p->dir == HAL_DIGIO_OUTPUT) + { + if (p->initval == 1) + { + P0 |= bitmask; + } + else + { + P0 &= ~bitmask; + } + P0DIR |= bitmask; + } + else + // input + { + P0DIR &= ~bitmask; + } + break; + case 1: + P1SEL &= ~bitmask; + if (p->dir == HAL_DIGIO_OUTPUT) + { + if (p->initval == 1) + { + P1 |= bitmask; + } + else + { + P1 &= ~bitmask; + } + P1DIR |= bitmask; + } + else + // input + { + P1DIR &= ~bitmask; + } + break; + case 2: + P2SEL &= ~bitmask; + if (p->dir == HAL_DIGIO_OUTPUT) + { + if (p->initval == 1) + { + P2 |= bitmask; + } + else + { + P2 &= ~bitmask; + } + P2DIR |= bitmask; + } + else + // input + { + P2DIR &= ~bitmask; + } + break; + //case 1: P1SEL &= ~bitmask; out = &P1OUT; dir = &P1DIR; break; + //case 2: P2SEL &= ~bitmask; out = &P2OUT; dir = &P2DIR; break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + + +//------------------------------------------------------------------- +// @fn halDigioSet +// @brief Set output pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioSet(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_OUTPUT) + { + switch (p->port) + { + case 0: + P0 |= p->pin_bm; + break; + case 1: + P1 |= p->pin_bm; + break; + case 2: + P2 |= p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); + } + return (HAL_DIGIO_ERROR); +} + + +//------------------------------------------------------------------- +// @fn halDigioClear +// @brief Clear output pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioClear(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_OUTPUT) + { + switch (p->port) + { + case 0: + P0 &= ~p->pin_bm; + break; + case 1: + P1 &= ~p->pin_bm; + break; + case 2: + P2 &= ~p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); + } + return (HAL_DIGIO_ERROR); +} + +//------------------------------------------------------------------- +// @fn halDigioToggle +// @brief Toggle output pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioToggle(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_OUTPUT) + { + switch (p->port) + { + case 0: + P0 ^= p->pin_bm; + break; + case 1: + P1 ^= p->pin_bm; + break; + case 2: + P2 ^= p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); + } + return (HAL_DIGIO_ERROR); +} + +//------------------------------------------------------------------- +// @fn halDigioGet +// @brief Get value on input pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioGet(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_INPUT) + { + switch (p->port) + { + case 0: + return (P0 &p->pin_bm ? 1 : 0); + case 1: + return (P1 &p->pin_bm ? 1 : 0); + case 2: + return (P2 &p->pin_bm ? 1 : 0); + default: + break; + } + } + return (HAL_DIGIO_ERROR); +} + +//------------------------------------------------------------------- +// @fn halDigioIntConnect +// @brief Connect function to IO interrupt +// @param digioConfig* p - pointer to configuration structure for IO pin +// ISR_FUNC_PTR func - pointer to function +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntConnect(const digioConfig *p, ISR_FUNC_PTR func) +{ + istate_t key; + HAL_INT_LOCK(key); + switch (p->port) + { + case 0: + port0_isr_tbl[p->pin] = func; + break; + case 1: + port1_isr_tbl[p->pin] = func; + break; + case 2: + port2_isr_tbl[p->pin] = func; + break; + default: + HAL_INT_UNLOCK(key); + return (HAL_DIGIO_ERROR); + } + halDigioIntClear(p); + HAL_INT_UNLOCK(key); + return (HAL_DIGIO_OK); +} + + +//------------------------------------------------------------------- +// @fn halDigioIntEnable +// @brief Enable interrupt on IO pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntEnable(const digioConfig *p) +{ + switch (p->port) + { + case 0: + P0IE = 1; // set P0IE bit + P0IEN |= p->pin_bm; + break; + case 1: + IEN2 |= 0x10; // set P1IE bit + P1IEN |= p->pin_bm; + break; + case 2: + IEN2 |= 0x02; // set P2IE bit + P2IEN |= p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn halDigioIntDisable +// @brief Disable interrupt on IO pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntDisable(const digioConfig *p) +{ + switch (p->port) + { + case 0: + P0IEN &= ~p->pin_bm; + break; + case 1: + P1IEN &= ~p->pin_bm; + break; + case 2: + P2IEN &= ~p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn halDigioIntClear +// @brief Clear interrupt flag +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntClear(const digioConfig *p) +{ + switch (p->port) + { + case 0: + P0IFG &= ~p->pin_bm; + break; + case 1: + P1IFG &= ~p->pin_bm; + break; + case 2: + P2IFG &= ~p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn halDigioIntSetEdge +// @brief Set edge for IO interrupt +// @param digioConfig* p - pointer to configuration structure for IO pin +// edge - HAL_DIGIO_INT_FALLING_EDGE or HAL_DIGIO_INT_RISING_EDGE +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +// Comment: all pins on port are configured at same time +uint8 halDigioIntSetEdge(const digioConfig *p, uint8 edge) +{ + switch (edge) + { + case HAL_DIGIO_INT_FALLING_EDGE: + switch (p->port) + { + case 0: + PICTL |= PICTL_P0ICON_BM; // set P0ICON high + break; + case 1: + PICTL |= PICTL_P1ICON_BM; // set P1ICON high + break; + case 2: + PICTL |= PICTL_P2ICON_BM; // set P2ICON high + break; + default: + return (HAL_DIGIO_ERROR); + } + break; + + case HAL_DIGIO_INT_RISING_EDGE: + switch (p->port) + { + case 0: + PICTL &= ~PICTL_P0ICON_BM; // set P0ICON low + break; + case 1: + PICTL &= ~PICTL_P1ICON_BM; // set P0ICON low + break; + case 2: + PICTL &= ~PICTL_P2ICON_BM; // set P0ICON low + break; + default: + return (HAL_DIGIO_ERROR); + } + break; + + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn port0_ISR +// @brief ISR framework for P0 digio interrupt +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(port0_ISR, P0INT_VECTOR) +{ + register uint8 i; + P0IF = 0; + if (P0IFG) + { + for (i = 0; i < 8; i++) + { + register const uint8 pinmask = 1 << i; + if (P0IFG &pinmask) + { + if (port0_isr_tbl[i] != 0) + { + (*port0_isr_tbl[i])(); + } + P0IFG &= ~pinmask; + } + } + //__low_power_mode_off_on_exit(); + } +} + +//------------------------------------------------------------------- +// @fn port1_ISR +// @brief ISR framework for P0 digio interrupt +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(port1_ISR, P1INT_VECTOR) +{ + register uint8 i; + P1IF = 0; + if (P1IFG) + { + for (i = 0; i < 8; i++) + { + register const uint8 pinmask = 1 << i; + if (P1IFG &pinmask) + { + if (port1_isr_tbl[i] != 0) + { + (*port1_isr_tbl[i])(); + } + P1IFG &= ~pinmask; + } + } + //__low_power_mode_off_on_exit(); + } +} + +//------------------------------------------------------------------- +// @fn port2_ISR +// @brief ISR framework for P2 digio interrupt +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(port2_ISR, P2INT_VECTOR) +{ + register uint8 i; + P2IF = 0; + if (P2IFG) + { + for (i = 0; i < 5; i++) + { + register const uint8 pinmask = 1 << i; + if (P2IFG &pinmask) + { + if (port2_isr_tbl[i] != 0) + { + (*port2_isr_tbl[i])(); + } + P2IFG &= ~pinmask; + } + } + //__low_power_mode_off_on_exit(); + } +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.h new file mode 100644 index 0000000..e851f23 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_digio.h @@ -0,0 +1,46 @@ +//------------------------------------------------------------------- +// Filename: hal_digio.h +// Description: HAL digital IO functionality +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +enum +{ + HAL_DIGIO_INPUT, HAL_DIGIO_OUTPUT +}; + +enum +{ + HAL_DIGIO_INT_FALLING_EDGE, HAL_DIGIO_INT_RISING_EDGE +}; + +#define HAL_DIGIO_OK 0 +#define HAL_DIGIO_ERROR (~0) + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef struct +{ + uint8 port; // port number + uint8 pin; // pin number + uint8 pin_bm; // pin bitmask + uint8 dir; // direction (input or output) + uint8 initval; // initial value +} digioConfig; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +uint8 halDigioConfig(const digioConfig *p); +uint8 halDigioClear(const digioConfig *p); +uint8 halDigioToggle(const digioConfig *p); +uint8 halDigioSet(const digioConfig *p); +uint8 halDigioGet(const digioConfig *p); + +uint8 halDigioIntConnect(const digioConfig *p, ISR_FUNC_PTR func); +uint8 halDigioIntEnable(const digioConfig *p); +uint8 halDigioIntDisable(const digioConfig *p); +uint8 halDigioIntClear(const digioConfig *p); +uint8 halDigioIntSetEdge(const digioConfig *p, uint8 edge); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.c new file mode 100644 index 0000000..29e52ce --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.c @@ -0,0 +1,60 @@ +//------------------------------------------------------------------- +// Filename: hal_int.c +// Description: HAL interrupt control +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halIntOn +// @brief Enable global interrupts. +// @param none +// @return none +//------------------------------------------------------------------- +void halIntOn(void) +{ + HAL_INT_ON(); +} + +//------------------------------------------------------------------- +// @fn halIntOff +// @brief Turns global interrupts off. +// @param none +// @return none +//------------------------------------------------------------------- +void halIntOff(void) +{ + HAL_INT_OFF(); +} + +//------------------------------------------------------------------- +// @fn halIntLock +// @brief Turns global interrupts off and returns current interrupt state. +// Should always be used together with halIntUnlock(). +// @param none +// @return uint16 - current interrupt state +//------------------------------------------------------------------- +uint16 halIntLock(void) +{ + istate_t key; + HAL_INT_LOCK(key); + return (key); +} + +//------------------------------------------------------------------- +// @fn halIntUnlock +// @brief Set interrupt state back to the state it had before calling halIntLock(). +// Should always be used together with halIntLock(). +// @param key +// @return none +//------------------------------------------------------------------- +void halIntUnlock(uint16 key) +{ + HAL_INT_UNLOCK(key); +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.h new file mode 100644 index 0000000..648e6d3 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_int.h @@ -0,0 +1,21 @@ +//------------------------------------------------------------------- +// Filename: hal_int.h +// Description: HAL interrupt control header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define HAL_INT_ON(x) st( EA = 1; ) +#define HAL_INT_OFF(x) st( EA = 0; ) +#define HAL_INT_LOCK(x) st( (x) = EA; EA = 0; ) +#define HAL_INT_UNLOCK(x) st( EA = (x); ) + +typedef unsigned short istate_t; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halIntOn(void); +void halIntOff(void); +uint16 halIntLock(void); +void halIntUnlock(uint16 key); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.c new file mode 100644 index 0000000..5054eb1 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.c @@ -0,0 +1,116 @@ +//------------------------------------------------------------------- +// Filename: hal_mcu.c +// Description: +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_clock.h" +#include "hal_mcu.h" +#include "hal_board.h" + +//------------------------------------------------------------------- +// @fn halMcuInit +// @brief Set Main Clock source to XOSC +// @param none +// @return none +//------------------------------------------------------------------- +void halMcuInit(void) +{ + clockSetMainSrc(CLOCK_SRC_XOSC); +} + +//------------------------------------------------------------------- +// @fn halMcuWaitUs +// @brief Busy wait function. Waits the specified number of microseconds. Use +// assumptions about number of clock cycles needed for the various +// instructions. This function assumes a 32 MHz clock. +// NB! This function is highly dependent on architecture and compiler! +// @param uint16 usec - number of microseconds delays +// @return none +//------------------------------------------------------------------- +#pragma optimize=none +void halMcuWaitUs(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} + +//------------------------------------------------------------------- +// @fn halMcuWaitMs +// @brief Busy wait function. Waits the specified number of milliseconds. Use +// assumptions about number of clock cycles needed for the various +// instructions. +// NB! This function is highly dependent on architecture and compiler! +// @param uint16 millisec - number of milliseconds delay +// @return none +//------------------------------------------------------------------- +#pragma optimize=none +void halMcuWaitMs(uint16 msec) +{ + while (msec--) + { + halMcuWaitUs(1000); + } +} + +//------------------------------------------------------------------- +// @fn halMcuSetLowPowerMode +// @brief Sets the MCU in a low power mode. Will turn global interrupts on at +// the same time as entering the LPM mode. The MCU must be waken from +// an interrupt (status register on stack must be modified). +// NB! This function is highly dependent on architecture and compiler! +// @param uint8 mode - power mode +// @return none +//------------------------------------------------------------------- +void halMcuSetLowPowerMode(uint8 mode) +{ + char buf[] = "LowPowerMode( )"; + buf[13] = mode + '0'; + // comment: not yet implemented + HAL_ASSERT(buf); +} + + +//------------------------------------------------------------------- +// @fn halMcuReset +// @brief +// Resets the MCU. This utilize the watchdog timer as there is no other way +// for a software reset. The reset will not occur until ~2 ms. +// NB: The function will not return! (hangs until reset) +// Parameters: +// @param void +// @return void +//------------------------------------------------------------------- +void halMcuReset(void) +{ + const uint8 WDT_INTERVAL_MSEC_2 = 0x03; // after ~2 ms + + WDCTL = ((WDCTL &0xFC) | (WDT_INTERVAL_MSEC_2 &0x03)); + // Start watchdog + WDCTL &= ~0x04; // Select watchdog mode + WDCTL |= 0x08; // Enable timer + while (1) + ; + // Halt here until reset +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.h new file mode 100644 index 0000000..6ecb965 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_mcu.h @@ -0,0 +1,17 @@ +//------------------------------------------------------------------- +// Filename: hal_mcu.h +// Description: hal mcu library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halMcuInit(void); +void halMcuWaitUs(uint16 usec); +void halMcuWaitMs(uint16 msec); +void halMcuSetLowPowerMode(uint8 mode); +void halMcuReset(void); +uint8 halMcuGetResetCause(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.c new file mode 100644 index 0000000..d46019d --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.c @@ -0,0 +1,418 @@ +//------------------------------------------------------------------- +// Filename: hal_rf.c +// Description: CC2530 radio interface. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_int.h" +#include "util.h" +#include "hal_rf.h" + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// CC2530 RSSI Offset +#define RSSI_OFFSET 73 + +// Various radio settings +#define AUTO_ACK 0x20 +#define AUTO_CRC 0x40 + +// TXPOWER values +#define CC2530_TXPOWER_MIN_3_DBM 0xB5 +#define CC2530_TXPOWER_0_DBM 0xD5 +#define CC2530_TXPOWER_4_DBM 0xF5 + +#define HAL_RF_TXPOWER_MIN_3_DBM 0 +#define HAL_RF_TXPOWER_0_DBM 1 +#define HAL_RF_TXPOWER_4_DBM 2 + +// RF interrupt flags +#define IRQ_TXDONE 0x02 +#define IRQ_RXPKTDONE 0x40 + +// Selected strobes +#define ISRXON() st(RFST = 0xE3;) +#define ISTXON() st(RFST = 0xE9;) +#define ISTXONCCA() st(RFST = 0xEA;) +#define ISRFOFF() st(RFST = 0xEF;) +#define ISFLUSHRX() st(RFST = 0xEC;) +#define ISFLUSHTX() st(RFST = 0xEE;) + + + +//------------------------------------------------------------------- +// GLOBAL DATA +//------------------------------------------------------------------- + +static const menuItem_t pPowerSettings[] = +{ + "-3dBm", HAL_RF_TXPOWER_MIN_3_DBM, "0dBm", HAL_RF_TXPOWER_0_DBM, "4dBm", HAL_RF_TXPOWER_4_DBM +}; + +const menu_t powerMenu = +{ + pPowerSettings, N_ITEMS(pPowerSettings) +}; + +//------------------------------------------------------------------- +// LOCAL DATA +//------------------------------------------------------------------- + +static ISR_FUNC_PTR pfISR = NULL; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halRfInit +// @brief Power up, sets default tuning settings, enables autoack, enables random generator. +// @param none +// @return SUCCESS always (for interface compatibility) +//------------------------------------------------------------------- +uint8 halRfInit(void) +{ + // Enable auto ack and auto crc + FRMCTRL0 |= (AUTO_ACK | AUTO_CRC); + + // Write non-default register values + // Tuning settings + TXPOWER = CC2530_TXPOWER_0_DBM; // TX output power ~0 dBm + + // Recommended RX settings + TXFILTCFG = 0x09; + AGCCTRL1 = 0x15; + FSCAL1 = 0x00; + + // Enable random generator -> Not implemented yet + + // Enable CC2591 with High Gain Mode -> Not implemented yet + + // Enable RX interrupt + halRfEnableRxInterrupt(); + + return SUCCESS; +} + +//------------------------------------------------------------------- +// @fn halRfGetChipId +// @brief Get chip id +// @param none +// @return uint8 - result +//------------------------------------------------------------------- +uint8 halRfGetChipId(void) +{ + return CHIPID; +} + +//------------------------------------------------------------------- +// @fn halRfGetChipVer +// @brief Get chip version +// @param none +// @return uint8 - result +//------------------------------------------------------------------- +uint8 halRfGetChipVer(void) +{ + // return major revision (4 upper bits) + return CHVER >> 4; +} + +//------------------------------------------------------------------- +// @fn halRfGetRssiOffset +// @brief Return RSSI Offset +// @param none +// @return uint8 - RSSI offset +//------------------------------------------------------------------- +uint8 halRfGetRssiOffset(void) +{ + return RSSI_OFFSET; +} + +//------------------------------------------------------------------- +// @fn halRfSetChannel +// @brief Set RF channel in the 2.4GHz band. The Channel must be in the range 11-26, +// 11= 2005 MHz, channel spacing 5 MHz. +// @param channel - logical channel number +// @return none +//------------------------------------------------------------------- +void halRfSetChannel(uint8 channel) +{ + FREQCTRL = (MIN_CHANNEL + (channel - MIN_CHANNEL) *CHANNEL_SPACING); +} + +//------------------------------------------------------------------- +// @fn halRfSetShortAddr +// @brief Write short address to chip +// @param none +// @return none +//------------------------------------------------------------------- +void halRfSetShortAddr(uint16 shortAddr) +{ + SHORT_ADDR0 = LO_UINT16(shortAddr); + SHORT_ADDR1 = HI_UINT16(shortAddr); +} + +//------------------------------------------------------------------- +// @fn halRfSetPanId +// @brief Write PAN Id to chip +// @param none +// @return none +//------------------------------------------------------------------- +void halRfSetPanId(uint16 panId) +{ + PAN_ID0 = LO_UINT16(panId); + PAN_ID1 = HI_UINT16(panId); +} + + +//------------------------------------------------------------------- +// @fn halRfSetPower +// @brief Set TX output power +// @param uint8 power - power level: TXPOWER_MIN_4_DBM, TXPOWER_0_DBM, TXPOWER_4_DBM +// @return uint8 - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 halRfSetTxPower(uint8 power) +{ + uint8 n; + + switch (power) + { + case HAL_RF_TXPOWER_MIN_3_DBM: + n = CC2530_TXPOWER_MIN_3_DBM; + break; + case HAL_RF_TXPOWER_0_DBM: + n = CC2530_TXPOWER_0_DBM; + break; + case HAL_RF_TXPOWER_4_DBM: + n = CC2530_TXPOWER_4_DBM; + break; + + default: + return FAILED; + } + + // Set TX power + TXPOWER = n; + + return SUCCESS; +} + +//------------------------------------------------------------------- +// @fn halRfWriteTxBuf +// @brief Write to TX buffer +// @param uint8* pData - buffer to write +// uint8 length - number of bytes +// @return none +//------------------------------------------------------------------- +void halRfWriteTxBuf(uint8 *pData, uint8 length) +{ + uint8 i; + + ISFLUSHTX(); // Making sure that the TX FIFO is empty. + + RFIRQF1 = ~IRQ_TXDONE; // Clear TX done interrupt + + // Insert data + for (i = 0; i < length; i++) + { + RFD = pData[i]; + } +} + + +//------------------------------------------------------------------- +// @fn halRfAppendTxBuf +// @brief Write to TX buffer +// @param uint8* pData - buffer to write +// uint8 length - number of bytes +// @return none +//------------------------------------------------------------------- +void halRfAppendTxBuf(uint8 *pData, uint8 length) +{ + uint8 i; + + // Insert data + for (i = 0; i < length; i++) + { + RFD = pData[i]; + } +} + +//------------------------------------------------------------------- +// @fn halRfReadRxBuf +// @brief Read RX buffer +// @param uint8* pData - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// @return none +//------------------------------------------------------------------- +void halRfReadRxBuf(uint8 *pData, uint8 length) +{ + // Read data + while (length > 0) + { + *pData++ = RFD; + length--; + } +} + + +//------------------------------------------------------------------- +// @fn halRfReadMemory +// @brief Read RF device memory +// @param uint16 addr - memory address +// uint8* pData - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// @return Number of bytes read +//------------------------------------------------------------------- +uint8 halRfReadMemory(uint16 addr, uint8 *pData, uint8 length) +{ + return 0; +} + + +//------------------------------------------------------------------- +// @fn halRfWriteMemory +// @brief Write RF device memory +// @param uint16 addr - memory address +// uint8* pData - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// @return Number of bytes written +//------------------------------------------------------------------- +uint8 halRfWriteMemory(uint16 addr, uint8 *pData, uint8 length) +{ + return 0; +} + +//------------------------------------------------------------------- +// @fn halRfTransmit +// @brief Transmit frame with Clear Channel Assessment. +// @param none +// @return uint8 - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 halRfTransmit(void) +{ + uint8 status; + + ISTXON(); // Sending + + // Waiting for transmission to finish + while (!(RFIRQF1 &IRQ_TXDONE)) + ; + + RFIRQF1 = ~IRQ_TXDONE; + status = SUCCESS; + + return status; +} + +//------------------------------------------------------------------- +// @fn halRfReceiveOn +// @brief Turn receiver on +// @param none +// @return none +//------------------------------------------------------------------- +void halRfReceiveOn(void) +{ + ISFLUSHRX(); // Making sure that the TX FIFO is empty. + ISRXON(); +} + +//------------------------------------------------------------------- +// @fn halRfReceiveOff +// @brief Turn receiver off +// @param none +// @return none +//------------------------------------------------------------------- +void halRfReceiveOff(void) +{ + ISRFOFF(); + ISFLUSHRX(); // Making sure that the TX FIFO is empty. +} + + +//------------------------------------------------------------------- +// @fn halRfDisableRxInterrupt +// @brief Clear and disable RX interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfDisableRxInterrupt(void) +{ + // disable RXPKTDONE interrupt + RFIRQM0 &= ~BV(6); + // disable general RF interrupts + IEN2 &= ~BV(0); +} + + +//------------------------------------------------------------------- +// @fn halRfEnableRxInterrupt +// @brief Enable RX interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfEnableRxInterrupt(void) +{ + // enable RXPKTDONE interrupt + RFIRQM0 |= BV(6); + // enable general RF interrupts + IEN2 |= BV(0); +} + +//------------------------------------------------------------------- +// @fn halRfRxInterruptConfig +// @brief Configure RX interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfRxInterruptConfig(ISR_FUNC_PTR pf) +{ + uint8 x; + HAL_INT_LOCK(x); + pfISR = pf; + HAL_INT_UNLOCK(x); +} + + +//------------------------------------------------------------------- +// @fn halRfWaitTransceiverReady +// @brief Wait until the transciever is ready (SFD inactive). +// @param none +// @return none +//------------------------------------------------------------------- +void halRfWaitTransceiverReady(void) +{ + // Wait for SFD not active and TX_Active not active + while (FSMSTAT1 &(BV(1) | BV(5))) + ; +} + + +//------------------------------------------------------------------- +// @fn rfIsr +// @brief Interrupt service routine that handles RFPKTDONE interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(rfIsr, RF_VECTOR) +{ + uint8 x; + + HAL_INT_LOCK(x); + + if (RFIRQF0 &IRQ_RXPKTDONE) + { + if (pfISR) + { + (*pfISR)(); // Execute the custom ISR + } + S1CON = 0; // Clear general RF interrupt flag + RFIRQF0 &= ~IRQ_RXPKTDONE; // Clear RXPKTDONE interrupt + } + HAL_INT_UNLOCK(x); +} + +//------------------------------------------------------------------- diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.h new file mode 100644 index 0000000..845b908 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf.h @@ -0,0 +1,56 @@ +//------------------------------------------------------------------- +// Filename: hal_rf.h +// Description: HAL radio interface header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Chip ID's +#define HAL_RF_CHIP_ID_CC1100 0x00 +#define HAL_RF_CHIP_ID_CC1110 0x01 +#define HAL_RF_CHIP_ID_CC1111 0x11 +#define HAL_RF_CHIP_ID_CC2420 0x02 +#define HAL_RF_CHIP_ID_CC2500 0x80 +#define HAL_RF_CHIP_ID_CC2510 0x81 +#define HAL_RF_CHIP_ID_CC2511 0x91 +#define HAL_RF_CHIP_ID_CC2550 0x82 +#define HAL_RF_CHIP_ID_CC2520 0x84 +#define HAL_RF_CHIP_ID_CC2430 0x85 +#define HAL_RF_CHIP_ID_CC2431 0x89 +#define HAL_RF_CHIP_ID_CC2530 0xA5 +#define HAL_RF_CHIP_ID_CC2531 0xB5 +#define HAL_RF_CHIP_ID_CC2540 0x8D + +// IEEE 802.15.4 defined constants (2.4 GHz logical channels) +#define MIN_CHANNEL 11 // 2405 MHz +#define MAX_CHANNEL 26 // 2480 MHz +#define CHANNEL_SPACING 5 // MHz + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +// Generic RF interface +uint8 halRfInit(void); +uint8 halRfSetTxPower(uint8 power); +uint8 halRfTransmit(void); + +uint8 halRfGetChipId(void); +uint8 halRfGetChipVer(void); +uint8 halRfGetRssiOffset(void); + +void halRfWriteTxBuf(uint8 *pData, uint8 length); +void halRfReadRxBuf(uint8 *pData, uint8 length); +void halRfWaitTransceiverReady(void); +uint8 halRfReadMemory(uint16 addr, uint8 *pData, uint8 length); +uint8 halRfWriteMemory(uint16 addr, uint8 *pData, uint8 length); + +void halRfReceiveOn(void); +void halRfReceiveOff(void); +void halRfDisableRxInterrupt(void); +void halRfEnableRxInterrupt(void); +void halRfRxInterruptConfig(ISR_FUNC_PTR pfISR); + +// IEEE 802.15.4 specific interface +void halRfSetChannel(uint8 channel); +void halRfSetShortAddr(uint16 shortAddr); +void halRfSetPanId(uint16 PanId); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.c new file mode 100644 index 0000000..480368e --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.c @@ -0,0 +1,393 @@ +//------------------------------------------------------------------- +// Filename: hal_rf_security.c +// Description: CC2530 CCM security +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_rf.h" +#include "hal_rf_security.h" +#include "util.h" +#include + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Staring AES operation +#define AES_START() st (ENCCS |= 0x01;) + +// Setting the mode of the AES operation +#define AES_SET_MODE(mode) st( ENCCS &= ~0x70; ENCCS |= mode; ) + +// Starting or stopping encryption or decryption +#define AES_SET_OPERATION(op) st( ENCCS = (ENCCS & ~0x07) | op; ) + +// Poll the AES ready bit +#define AES_RDY() ( ENCCS & 8) + +// Encryption mode +#define AES_MODE_CBC 0x00 +#define AES_MODE_CFB 0x10 +#define AES_MODE_OFB 0x20 +#define AES_MODE_CTR 0x30 +#define AES_MODE_ECB 0x40 +#define AES_MODE_CBCMAC 0x50 + +// Operations +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Convert MIC to MIC length +#define MIC_2_MICLEN(m) ( BV((m&3)+1) & ~3 ) + +//------------------------------------------------------------------- +// LOCAL DATA +//------------------------------------------------------------------- +static uint8 nonceTx[16]; +static uint8 nonceRx[16]; +static uint8 IV[16]; +static uint8 cipherText[128]; +static uint8 buf[128]; + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void halAesEncrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector); +static void halAesDecrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector); +static uint8 generateAuthData(uint8 c, uint8 *pIv, uint8 *pData, uint8 f, uint8 lm); + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +extern void halRfAppendTxBuf(uint8 *pData, uint8 length); + +//------------------------------------------------------------------- +// @fn halRfSecurityInit +// @brief Security init. Write nonces and key to chip. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfSecurityInit(uint8 *pKey, uint8 *pNonceRx, uint8 *pNonceTx) +{ + uint8 i; + + AES_SET_OPERATION(AES_LOAD_KEY); + + // Starting loading of key or vector. + AES_START(); + + // Store key and nonces + for (i = 0; i < NONCE_LENGTH; i++) + { + nonceRx[i] = *pNonceRx; + nonceTx[i] = *pNonceTx; + pNonceTx++; + pNonceRx++; + ENCDI = *pKey++; + } +} + +//------------------------------------------------------------------- +// @fn halRfWriteTxBufSecure +// @brief Encrypt and authenticate plaintext then fill TX buffer +// @param uint8* data - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// uint8 c - number of bytes to encrypt +// uint8 f - number of bytes to authenticate +// uint8 m - integrity code (m=1,2,3 gives lenght of integrity +// field l(m)= 4,8,16) +// @return none +//------------------------------------------------------------------- +void halRfWriteTxBufSecure(uint8 *pPkt, uint8 length, uint8 c, uint8 f, uint8 m) +{ + uint8 i, lm; + + // Generate B(i) vector + memset(buf, 0, sizeof(buf)); + lm = MIC_2_MICLEN(m); + i = generateAuthData(c, nonceTx, pPkt + 1, f, lm); + + // Calculate CBC-MAC value + memset(IV, 0, sizeof(IV)); + halAesEncrypt(AES_MODE_CBCMAC, buf, i, cipherText, IV); + + // Encrypt authentication tag + memcpy(IV, nonceTx, 16); // Use nonce as IV + IV[0] = 0x01; // Flag for CTR + IV[15] = 0; // Counter= 0 + + memcpy(buf, cipherText, 16); + halAesEncrypt(AES_MODE_CTR, buf, 16, cipherText, IV); + + // Encrypt plaintext + memset(buf + i, 0, 16-(i &0xf)); // Zero padding + IV[15] = 1; // Counter= 1 + halAesEncrypt(AES_MODE_CTR, &buf[i - c], c, &cipherText[i - c], IV); + + // Fill TX buffer + halRfWriteTxBuf(pPkt, 1); // Length byte + halRfAppendTxBuf(pPkt + 1, f); // MPDU + halRfAppendTxBuf(&cipherText[i - c], c); // Payload + halRfAppendTxBuf(cipherText, lm); // MIC +} + +//------------------------------------------------------------------- +// @fn halRfReadRxBufSecure +// @brief Decrypts and reverse authenticates with CCM then reads out received frame +// @param uint8* pPkt - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// uint8 encrLength - number of bytes to decrypt +// uint8 authLength - number of bytes to reverse authenticate +// uuint8 m - ets length of integrity code (m=1,2,3 gives lenght of integrity field 4,8,16) +// @return SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 halRfReadRxBufSecure(uint8 *data, uint8 length, uint8 c, uint8 f, uint8 m) +{ + uint8 lm, l, i; + + // Get received packet + halRfReadRxBuf(data, length); + + // Update RX nonce; frame counter + nonceRx[12] = data[10]; + nonceRx[11] = data[11]; + nonceRx[10] = data[12]; + nonceRx[9] = data[13]; + // Update RX nonce; source address + nonceRx[7] = data[8]; + nonceRx[8] = data[7]; + + // Decrypt authentication tag + memcpy(IV, nonceRx, 16); + IV[15] = 0; // Counter= 0 + IV[0] = 0x01; // Flag field for decryption + lm = MIC_2_MICLEN(m); // Length of authentication tag + + halAesDecrypt(AES_MODE_CTR, data + c + f, lm, buf, IV); + memcpy(data + c + f, buf, lm); + + // Prepare payload for decryption + memcpy(cipherText, data + f, c); + + // Zero padding + l = (c &0x0f) == 0 ? c : (c &0xf0) + 0x10; + for (i = c; i < l; i++) + { + cipherText[i] = 0x00; + } + + // Decrypt payload + IV[15] = 1; // Counter= 1 + halAesDecrypt(AES_MODE_CTR, cipherText, c, buf, IV); + memcpy(data + f, buf, c); + + // Generate B(i) vector + memset(buf, 0, sizeof(buf)); + i = generateAuthData(c, nonceRx, data, f, lm); + + // Calculate CBC-MAC value + memset(IV, 0, sizeof(IV)); + halAesEncrypt(AES_MODE_CBCMAC, buf, i, cipherText, IV); + + // Check authentication data + return memcmp(cipherText, data + c + f, lm) == 0 ? SUCCESS : FAILED; +} + +//------------------------------------------------------------------- +// @fn halRfIncNonceTx +// @brief Increments frame counter field of stored nonce TX +// @param none +// @return none +//------------------------------------------------------------------- +void halRfIncNonceTx(void) +{ + uint32 *pCount; + + pCount = (uint32*) &nonceTx[9]; + utilReverseBuf((uint8*)pCount, 4); + (*pCount)++; + utilReverseBuf((uint8*)pCount, 4); +} + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS + +//------------------------------------------------------------------- +static void halAesLoadBlock(uint8 *pData, uint8 op) +{ + uint8 i; + + // Set operation + AES_SET_OPERATION(op); + // Starting loading of key or vector. + AES_START(); + + // loading the data (key or vector) + for (i = 0; i < 16; i++) + { + ENCDI = pData[i]; + } + + return ; +} + +//------------------------------------------------------------------- +static void halAesOperation(uint8 oper, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector) +{ + uint16 i; + uint8 j, k; + uint8 mode; + uint16 nbrOfBlocks; + uint16 convertedBlock; + + nbrOfBlocks = length / 0x10; + + if ((length % 0x10) != 0) + { + // length not multiplum of 16, convert one block extra with zeropadding + nbrOfBlocks++; + } + + // Loading the IV. + halAesLoadBlock(pInitVector, AES_LOAD_IV); + + // Start the operation + AES_SET_OPERATION(oper); + + // Getting the operation mode. + mode = ENCCS &0x70; + + for (convertedBlock = 0; convertedBlock < nbrOfBlocks; convertedBlock++) + { + // Starting the conversion. + AES_START(); + + i = convertedBlock * 16; + // Counter, Output Feedback and Cipher Feedback operates on 4 bytes and not 16 bytes. + if ((mode == AES_MODE_CFB) || (mode == AES_MODE_OFB) || (mode == AES_MODE_CTR)) + { + + for (j = 0; j < 4; j++) + { + // Writing the input data with zero-padding + for (k = 0; k < 4; k++) + { + ENCDI = ((i + 4 * j + k < length) ? pDataIn[i + 4 * j + k]: 0x00); + } + + // Read out data for every 4th byte + for (k = 0; k < 4; k++) + { + pDataOut[i + 4 * j + k] = ENCDO; + } + + } + } + else if (mode == AES_MODE_CBCMAC) + { + // Writing the input data with zero-padding + for (j = 0; j < 16; j++) + { + ENCDI = ((i + j < length) ? pDataIn[i + j]: 0x00); + } + // The last block of the CBC-MAC is computed by using CBC mode. + if (convertedBlock == nbrOfBlocks - 2) + { + AES_SET_MODE(AES_MODE_CBC); + // wait for data ready + halMcuWaitUs(1); + } + // The CBC-MAC does not produce an output on the n-1 first blocks + // only the last block is read out + else if (convertedBlock == nbrOfBlocks - 1) + { + + // wait for data ready + halMcuWaitUs(1); + for (j = 0; j < 16; j++) + { + pDataOut[j] = ENCDO; + } + } + } // ECB or CBC + else + { + // Writing the input data with zero-padding + for (j = 0; j < 16; j++) + { + ENCDI = ((i + j < length) ? pDataIn[i + j]: 0x00); + } + + // wait for data ready + halMcuWaitUs(1); + + // Read out data + for (j = 0; j < 16; j++) + { + pDataOut[i + j] = ENCDO; + } + } + } +} + +//------------------------------------------------------------------- +static void halAesEncrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector) +{ + AES_SET_MODE(mode); + halAesOperation(AES_ENCRYPT, pDataIn, length, pDataOut, pInitVector); +} + +//------------------------------------------------------------------- +static void halAesDecrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector) +{ + AES_SET_MODE(mode); + halAesOperation(AES_DECRYPT, pDataIn, length, pDataOut, pInitVector); +} + +//------------------------------------------------------------------- +static uint8 generateAuthData(uint8 c, uint8 *pIv, uint8 *pData, uint8 f, uint8 lm) +{ + uint8 i, j, l; + + // Prepare input for CBC-MAC, B0, Bi.... Bn + memcpy(buf, pIv, 16); // B0 + + // Create flag + buf[0] = 0x01; // L'= L - 1 (L=2) + if (f > 0) + { + buf[0] |= 0x40; + } + // Adata= f > 0 + buf[0] |= ((lm - 2) / 2) << 3; // M'= (lm-2) / 2; + + buf[14] = 0x00; + buf[15] = c; + + // Add authentication data + buf[16] = 0; + buf[17] = f; + memcpy(&buf[18], pData, f); + + // .... zero padding + i = 18+f; + l = (i &0x0f) == 0 ? i : (i &0xf0) + 0x10; + while (i < l) + { + buf[i++] = 0x00; + } + + // Add command payload + j = 0; + while (i < l + c) + { + buf[i++] = pData[f + j]; + j++; + } + + return i; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.h new file mode 100644 index 0000000..e05c6ca --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_security.h @@ -0,0 +1,21 @@ +//------------------------------------------------------------------- +// Filename: hal_rf_security.h +// Description: HAL radio interface header file for security operations. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// IEEE 802.15.4 security (AES-128) +#define KEY_LENGTH 16 +#define NONCE_LENGTH 16 + +#define SECURITY_CONTROL 0x06 // MIC-64 + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +// CCM security interface, IEEE 802.15.4 +void halRfSecurityInit(uint8 *key, uint8 *nonceRx, uint8 *nonceTx); +uint8 halRfReadRxBufSecure(uint8 *pData, uint8 length, uint8 encrLength, uint8 authLength, uint8 m); +void halRfWriteTxBufSecure(uint8 *pData, uint8 length, uint8 encrLength, uint8 authLength, uint8 m); +void halRfIncNonceTx(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.c new file mode 100644 index 0000000..0487a75 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.c @@ -0,0 +1,60 @@ +//------------------------------------------------------------------- +// Filename: hal_rf_util.c +// Description: Support for anergy detection applications. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_rf_util.h" +#include "hal_rf.h" + +//------------------------------------------------------------------- +// FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halSampleED +// @brief Sample Energy Detect +// @param uint8 channel - channel between 11 and 26 +// uint16 sampleTime - sample time in us +// @return int8 - sampled RSSI value +//------------------------------------------------------------------- +int8 halSampleED(uint8 channel, uint16 sampleTime) +{ + int8 rssi = 0; + + // Set channel + halRfSetChannel(channel); + + // Set RX on + halRfReceiveOn(); + while (!RSSISTAT) + ; + + // Enable energy scan mode, using peak signal strength + FRMCTRL0 |= 0x10; + + // Spend sampleTime us accumulating the peak RSSI value + halMcuWaitUs(sampleTime); + rssi = RSSI; + + // Exit the current channel + halRfReceiveOff(); + // Disable ED scan mode + FRMCTRL0 &= ~0x10; + + return rssi; +} + +//------------------------------------------------------------------- +// @fn halSetRxScanMode +// @brief Set chip in RX scanning mode +// @param none +// @return none +//------------------------------------------------------------------- +void halSetRxScanMode(void) +{ + // Infinite RX mode (disables symbol search) + FRMCTRL0 = 0x0C; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.h new file mode 100644 index 0000000..1a496cd --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_rf_util.h @@ -0,0 +1,10 @@ +//------------------------------------------------------------------- +// Filename: hal_util_rf.h +// Description: +//------------------------------------------------------------------- + +//------------------------------------------------------------------- +// PUBLIC FUNCTIONS +//------------------------------------------------------------------- +int8 halSampleED(uint8 channel, uint16 sampleTime); +void halSetRxScanMode(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.c new file mode 100644 index 0000000..840aefc --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.c @@ -0,0 +1,41 @@ +#include + +void SET_POWER_MODE(unsigned char mode) +{ + if(mode == 0) + SLEEPCMD &= ~0x03; + else + if(mode == 3) + SLEEPCMD |= 0x03; + else + { + SLEEPCMD &= ~0x03; + SLEEPCMD |= mode; + } + + PCON |= 0x01; + asm("NOP"); +} + +void Set_ST_Period(unsigned char sec) +{ + unsigned long sleepTimer = 0; + + sleepTimer |= ST0; + sleepTimer |= (unsigned long)ST1 << 8; + sleepTimer |= (unsigned long)ST2 << 16; + + sleepTimer += ((unsigned long)sec * (unsigned long)32768); + + ST2 = (unsigned char)(sleepTimer >> 16); + ST1 = (unsigned char)(sleepTimer >> 8); + ST0 = (unsigned char) sleepTimer; +} + +void Init_SLEEP_TIMER(void) +{ + EA = 1; + STIE = 1; + STIF = 0; +} + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.h new file mode 100644 index 0000000..83b2601 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_sleep.h @@ -0,0 +1,10 @@ +#include + +#define CRYSTAL 0 +#define RC 1 + +void SET_MAIN_CLOCK_SOURCE(unsigned char source); +void SET_LOW_CLOCK(unsigned char source); +void SET_POWER_MODE(unsigned char mode); +void Set_ST_Period(unsigned char sec); +void Init_SLEEP_TIMER(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.c new file mode 100644 index 0000000..8b8ab4f --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.c @@ -0,0 +1,130 @@ +//------------------------------------------------------------------- +// Filename: hal_timer_32k.c +// Description: hal 32KHz timer +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" +#include "hal_timer_32k.h" + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +static ISR_FUNC_PTR fptr; + +//------------------------------------------------------------------- +// @fn halTimer32kInit +// @brief Set up timer 1 to generate an interrupt every "cycles" 32768 Hz +// clock cycles. +// Use halTimerIntConnect() to connect an ISR to the interrupt. +// @param uint16 cycles - Number of cycles between interrupt +// (does not support larger cycles value than 0xFFFF/8) +// @return none +//------------------------------------------------------------------- +void halTimer32kInit(uint16 cycles) +{ + uint16 compareValue; + + //uint16 clock_divider = ID_0; // Default - don't divide input clock + + // Set prescaler divider value to 128 + T1CTL |= 0x0C; + + // Multiply cycles by 8 to get 32KHz cycles + // 32MHz/128/8 gives approximately 32KHz + if (cycles > 0xFFFF / 8) + { + compareValue = 0xFFFF; + } + else + { + compareValue = cycles * 8; + } + + // Set compare value + T1CC0H = HI_UINT16(compareValue); + T1CC0L = LO_UINT16(compareValue); + #ifndef CC2530_PG1 + // Set conmpare mode with interrupt enabled + T1CCTL0 = 0x44; + #endif + + // clear interrupt pending flag, disable interrupt + #ifdef CC2530_PG1 + T1CTL &= ~0x10; // T1CTL.OVFIF = 0 + #else + T1STAT &= ~0x01; // T1STAT.CH1IF = 0 + #endif + IEN1 &= ~0x02; // IEN1.T1EN = 0 +} + +//------------------------------------------------------------------- +// @fn halTimer32kRestart +// @brief Restart timer 1. The timer is first stopped, then restarted, +// counting up from 0 +// @param none +// @return none +//------------------------------------------------------------------- +void halTimer32kRestart(void) +{ + T1CTL &= ~0x02; // Stop timer + IEN1 &= ~0x02; // Disable interrupt + + T1CNTL = 0x00; // Reset counter value + + T1CTL |= 0x02; // Start timer + IEN1 |= 0x02; // Enable interrupt +} + +//------------------------------------------------------------------- +// @fn halTimer32kIntConnect +// @brief Connect function to timer interrupt +// @param ISR_FUNC_PTR isr - pointer to function +// @return none +//------------------------------------------------------------------- +void halTimer32kIntConnect(ISR_FUNC_PTR isr) +{ + istate_t key; + HAL_INT_LOCK(key); + fptr = isr; + HAL_INT_UNLOCK(key); +} + +//------------------------------------------------------------------- +// @fn halTimer32kIntEnable +// @brief Enable 32KHz timer interrupt +// @param none +// @return none +//------------------------------------------------------------------- +void halTimer32kIntEnable(void) +{ + IEN1 |= 0x02; // IEN1.T1EN = 1 + + // Start timer in modulo mode + T1CTL |= 0x02; // T1CTL.MODE = 10 + +} + +//------------------------------------------------------------------- +// @fn halTimer32kIntDisable +// @brief Disable 32KHz timer interrupt +// @param none +// @return none +//------------------------------------------------------------------- +void halTimer32kIntDisable(void) +{ + IEN1 &= ~0x02; // IEN1.T1EN = 0 +} + +//------------------------------------------------------------------- +// @fn timer32k0_ISR +// @brief ISR framework for the 32KHz timer component +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR) +{ + if (fptr != NULL) + { + (*fptr)(); + } +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.h new file mode 100644 index 0000000..e9d639e --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_timer_32k.h @@ -0,0 +1,17 @@ +//------------------------------------------------------------------- +// Filename: hal_timer_32k.h +// Description: hal 32KHz timer library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +#define TIMER_32K_CLK_FREQ 32768 + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halTimer32kInit(uint16 cycles); +void halTimer32kRestart(void); +void halTimer32kIntConnect(ISR_FUNC_PTR isr); +void halTimer32kIntEnable(void); +void halTimer32kIntDisable(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.c new file mode 100644 index 0000000..88d9d68 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.c @@ -0,0 +1,286 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.c +// Description: This file contains the interface to the H/W UART driver. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_board.h" +#include "hal_uart.h" + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define HAL_UART_ISR_RX_AVAIL() \ +(uartCfg.rxTail >= uartCfg.rxHead) ? \ +(uartCfg.rxTail - uartCfg.rxHead) : \ +(HAL_UART_ISR_RX_MAX - uartCfg.rxHead + uartCfg.rxTail) + +#define HAL_UART_ISR_TX_AVAIL() \ +(uartCfg.txHead > uartCfg.txTail) ? \ +(uartCfg.txHead - uartCfg.txTail - 1) : \ +(HAL_UART_ISR_TX_MAX - uartCfg.txTail + uartCfg.txHead - 1) + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +// U0CSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// U0UCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define U0RX_TX 0x0C + +#define HAL_UART_PERCFG_BIT 0x01 + +#define HAL_UART_ISR_RX_MAX 128 +#define HAL_UART_ISR_TX_MAX HAL_UART_ISR_RX_MAX + +typedef struct +{ + uint8 rxBuf[HAL_UART_ISR_RX_MAX]; + uint8 rxHead; + volatile uint8 rxTail; + uint8 rxShdw; + + uint8 txBuf[HAL_UART_ISR_TX_MAX]; + volatile uint8 txHead; + uint8 txTail; + uint8 txMT; +} uartCfg_t; + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +uartCfg_t uartCfg; + +//------------------------------------------------------------------- +// @fn halUartInit +// @brief Initialize the UART +// @param none +// @return none +//------------------------------------------------------------------- +void halUartInit(uint32 baud) +{ + // UART Configuration + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O location to P0. + + P0SEL |= U0RX_TX; // Enable Tx and Rx peripheral functions on pins. + ADCCFG &= ~U0RX_TX; // Make sure ADC doesnt use this. + U0CSR = CSR_MODE; // Mode is UART Mode. + U0UCR = UCR_FLUSH; // Flush it. + + // Only supporting subset of baudrate for code size - other is possible. + // 38400 + //U0BAUD = 59; + //U0GCR = 10; + // 9600 + //U0BAUD = 59; + //U0GCR = 8; + //U0BAUD = value_u0baud; + //U0GCR = value_u0gcr; + + switch(baud) + { + case 1200 : + U0BAUD = 59; U0GCR = 5; break; + case 2400 : + U0BAUD = 59; U0GCR = 6; break; + case 4800 : + U0BAUD = 59; U0GCR = 7; break; + case 9600 : + U0BAUD = 59; U0GCR = 8; break; + case 14400 : + U0BAUD = 216; U0GCR = 8; break; + case 19200 : + U0BAUD = 59; U0GCR = 9; break; + case 28800 : + U0BAUD = 216; U0GCR = 9; break; + case 38400 : + U0BAUD = 59; U0GCR = 10; break; + case 57600 : + U0BAUD = 216; U0GCR = 10; break; + case 76800 : + U0BAUD = 59; U0GCR = 11; break; + case 115200 : + U0BAUD = 216; U0GCR = 11; break; + case 230400 : + U0BAUD = 216; U0GCR = 12; break; + default : + U0BAUD = 59; U0GCR = 10; break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + U0UCR = UCR_STOP; + U0CSR |= CSR_RE; + URX0IE = 1; + U0DBUF = 0; // Prime the ISR pump. + + uartCfg.rxHead = 0; + uartCfg.rxTail = 0; + uartCfg.txHead = 0; + uartCfg.txTail = 0; + uartCfg.rxShdw = 0; + uartCfg.txMT = 0; + +} + +//------------------------------------------------------------------- +// @fn halUartRead +// @brief Read a buffer from the UART +// @param buf - valid data buffer at least 'len' bytes in size +// len - max length number of bytes to copy to 'buf' +// @return length of buffer that was read +//------------------------------------------------------------------- +uint16 halUartRead(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + while ((uartCfg.rxHead != uartCfg.rxTail) && (cnt < len)) + { + *buf++ = uartCfg.rxBuf[uartCfg.rxHead++]; + if (uartCfg.rxHead >= HAL_UART_ISR_RX_MAX) + { + uartCfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartWrite +// @brief Write a buffer to the UART. +// @param buf - pointer to the buffer that will be written, not freed +// len - length of +// @return length of the buffer that was sent +//------------------------------------------------------------------- +uint16 halUartWrite(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Accept "all-or-none" on write request. + if (HAL_UART_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + uartCfg.txBuf[uartCfg.txTail] = *buf++; + uartCfg.txMT = 0; + + if (uartCfg.txTail >= HAL_UART_ISR_TX_MAX - 1) + { + uartCfg.txTail = 0; + } + else + { + uartCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTX0IE; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartRxLen() +// @brief Calculate Rx Buffer length - the number of bytes in the buffer. +// @param none +// @return length of current Rx Buffer +//------------------------------------------------------------------- +uint16 halUartRxLen(void) +{ + return HAL_UART_ISR_RX_AVAIL(); +} + +//------------------------------------------------------------------- +// @fn halUartSuspend +// @brief Suspend UART hardware before entering PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUartSuspend(void) +{ + U0CSR &= ~CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartResume +// @brief Resume UART hardware after exiting PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUartResume(void) +{ + U0UCR |= UCR_FLUSH; + U0CSR |= CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartRxIsr +// @brief UART Receive Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart0RxIsr, URX0_VECTOR) +{ + uint8 tmp = U0DBUF; + uartCfg.rxBuf[uartCfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (uartCfg.rxHead == uartCfg.rxTail) + { + uartCfg.rxShdw = ST0; + } + + if (++uartCfg.rxTail >= HAL_UART_ISR_RX_MAX) + { + uartCfg.rxTail = 0; + } +} + +//------------------------------------------------------------------- +// @fn halUartTxIsr +// @brief UART Transmit Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart0TxIsr, UTX0_VECTOR) +{ + if (uartCfg.txHead == uartCfg.txTail) + { + IEN2 &= ~UTX0IE; + uartCfg.txMT = 1; + } + else + { + UTX0IF = 0; + U0DBUF = uartCfg.txBuf[uartCfg.txHead++]; + + if (uartCfg.txHead >= HAL_UART_ISR_TX_MAX) + { + uartCfg.txHead = 0; + } + } +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.h new file mode 100644 index 0000000..1dfea8c --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart.h @@ -0,0 +1,35 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.h +// Description: hal UART library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------ + +//------------------------------------------------------------------- +// Initialize UART at the startup +//------------------------------------------------------------------- +void halUartInit(uint32 baud); + +//------------------------------------------------------------------- +// Read a buffer from the UART +//------------------------------------------------------------------- +extern uint16 halUartRead(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Write a buff to the uart +//------------------------------------------------------------------- +extern uint16 halUartWrite(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Return the number of bytes in the Rx buffer +//------------------------------------------------------------------- +extern uint16 halUartRxLen(void); + +//------------------------------------------------------------------- +// Abort UART when entering sleep mode +//------------------------------------------------------------------- +extern void halUartSuspend(void); + +//------------------------------------------------------------------- +// Resume UART after wakeup from sleep +//------------------------------------------------------------------- +extern void halUartResume(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.c new file mode 100644 index 0000000..b281d45 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.c @@ -0,0 +1,282 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.c +// Description: This file contains the interface to the H/W UART driver. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_board.h" +#include "hal_uart1.h" + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define HAL_UART1_ISR_RX_AVAIL() \ +(uart1Cfg.rxTail >= uart1Cfg.rxHead) ? \ +(uart1Cfg.rxTail - uart1Cfg.rxHead) : \ +(HAL_UART1_ISR_RX_MAX - uart1Cfg.rxHead + uart1Cfg.rxTail) + +#define HAL_UART1_ISR_TX_AVAIL() \ +(uart1Cfg.txHead > uart1Cfg.txTail) ? \ +(uart1Cfg.txHead - uart1Cfg.txTail - 1) : \ +(HAL_UART1_ISR_TX_MAX - uart1Cfg.txTail + uart1Cfg.txHead - 1) + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +// U0CSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// U0UCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX1IE 0x08 +#define U1RX_TX 0xC0 + +#define HAL_UART1_PERCFG_BIT 0x02 + +#define HAL_UART1_ISR_RX_MAX 128 +#define HAL_UART1_ISR_TX_MAX HAL_UART1_ISR_RX_MAX + +typedef struct +{ + uint8 rxBuf[HAL_UART1_ISR_RX_MAX]; + uint8 rxHead; + volatile uint8 rxTail; + uint8 rxShdw; + + uint8 txBuf[HAL_UART1_ISR_TX_MAX]; + volatile uint8 txHead; + uint8 txTail; + uint8 txMT; +} uartCfg_t; + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +uartCfg_t uart1Cfg; + +//------------------------------------------------------------------- +// @fn halUartInit +// @brief Initialize the UART +// @param none +// @return none +//------------------------------------------------------------------- +void halUart1Init(uint32 baud) +{ + // UART Configuration + PERCFG |= HAL_UART1_PERCFG_BIT; // ÉèÖà UART1 I/O λÖÃÔÚP1¿ÚÉÏ. + + P1SEL |= U1RX_TX; // ʹÄÜ UART1 µÄTx£¨P1.6£©ºÍRx £¨P1.7£©ÍⲿÉ豸¹¦ÄÜÒý½Å. + // ADCCFG &= ~U0RX_TX; // Make sure ADC doesnt use this. + U1CSR = CSR_MODE; // UART ģʽ. + U1UCR = UCR_FLUSH; // Çå³ýµ¥Ôª. + + // Only supporting subset of baudrate for code size - other is possible. + // 38400 + //U1BAUD = 59; + //U1GCR = 10; + //9600 + //U1BAUD = 59; + //U1GCR = 8; + switch(baud) + { + case 2400 : + U1BAUD = 59; U1GCR = 6; break; + case 4800 : + U1BAUD = 59; U1GCR = 7; break; + case 9600 : + U1BAUD = 59; U1GCR = 8; break; + case 14400 : + U1BAUD = 216; U1GCR = 8; break; + case 19200 : + U1BAUD = 59; U1GCR = 9; break; + case 28800 : + U1BAUD = 216; U1GCR = 9; break; + case 38400 : + U1BAUD = 59; U1GCR = 10; break; + case 57600 : + U1BAUD = 216; U1GCR = 10; break; + case 76800 : + U1BAUD = 59; U1GCR = 11; break; + case 115200 : + U1BAUD = 216; U1GCR = 11; break; + case 230400 : + U1BAUD = 216; U1GCR = 12; break; + default : + U1BAUD = 59; U1GCR = 10; break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + U1UCR = UCR_STOP; //ֹͣλΪ¸ßµçƽ£¨1£© + U1CSR |= CSR_RE; //UART1 ½ÓÊÕÆ÷ʹÄÜ + URX1IE = 1; //UART1 ½ÓÊÕÖжÏʹÄÜ + U1DBUF = 0; //Êý¾Ý»º³åÆ÷Çå0 + + uart1Cfg.rxHead = 0; + uart1Cfg.rxTail = 0; + uart1Cfg.txHead = 0; + uart1Cfg.txTail = 0; + uart1Cfg.rxShdw = 0; + uart1Cfg.txMT = 0; + +} + +//------------------------------------------------------------------- +// @fn halUartRead +// @brief Read a buffer from the UART +// @param buf - valid data buffer at least 'len' bytes in size +// len - max length number of bytes to copy to 'buf' +// @return length of buffer that was read +//------------------------------------------------------------------- +uint16 halUart1Read(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + + while ((uart1Cfg.rxHead != uart1Cfg.rxTail) && (cnt < len)) + { + *buf++ = uart1Cfg.rxBuf[uart1Cfg.rxHead++]; + if (uart1Cfg.rxHead >= HAL_UART1_ISR_RX_MAX) + { + uart1Cfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartWrite +// @brief Write a buffer to the UART. +// @param buf - pointer to the buffer that will be written, not freed +// len - length of +// @return length of the buffer that was sent +//------------------------------------------------------------------- +uint16 halUart1Write(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Accept "all-or-none" on write request. + if (HAL_UART1_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + uart1Cfg.txBuf[uart1Cfg.txTail] = *buf++; + uart1Cfg.txMT = 0; + + if (uart1Cfg.txTail >= HAL_UART1_ISR_TX_MAX - 1) + { + uart1Cfg.txTail = 0; + } + else + { + uart1Cfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTX1IE; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartRxLen() +// @brief Calculate Rx Buffer length - the number of bytes in the buffer. +// @param none +// @return length of current Rx Buffer +//------------------------------------------------------------------- +uint16 halUart1RxLen(void) +{ + return HAL_UART1_ISR_RX_AVAIL(); +} + +//------------------------------------------------------------------- +// @fn halUartSuspend +// @brief Suspend UART hardware before entering PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUart1Suspend(void) +{ + U1CSR &= ~CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartResume +// @brief Resume UART hardware after exiting PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUart1Resume(void) +{ + U1UCR |= UCR_FLUSH; + U1CSR |= CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartRxIsr +// @brief UART Receive Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart1RxIsr, URX1_VECTOR) +{ + uint8 tmp = U1DBUF; + uart1Cfg.rxBuf[uart1Cfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (uart1Cfg.rxHead == uart1Cfg.rxTail) + { + uart1Cfg.rxShdw = ST0; + } + + if (++uart1Cfg.rxTail >= HAL_UART1_ISR_RX_MAX) + { + uart1Cfg.rxTail = 0; + } +} + +//------------------------------------------------------------------- +// @fn halUartTxIsr +// @brief UART Transmit Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart1TxIsr, UTX1_VECTOR) +{ + if (uart1Cfg.txHead == uart1Cfg.txTail) + { + IEN2 &= ~UTX1IE; + uart1Cfg.txMT = 1; + } + else + { + UTX1IF = 0; + U1DBUF = uart1Cfg.txBuf[uart1Cfg.txHead++]; + + if (uart1Cfg.txHead >= HAL_UART1_ISR_TX_MAX) + { + uart1Cfg.txHead = 0; + } + } +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.h new file mode 100644 index 0000000..a528757 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/common/hal_uart1.h @@ -0,0 +1,35 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.h +// Description: hal UART library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// FUNCTIONS - API +//------------------------------------------------------------------- +// Initialize UART at the startup +//------------------------------------------------------------------- +extern void halUart1Init(uint32 baud); + +//------------------------------------------------------------------- +// Read a buffer from the UART +//------------------------------------------------------------------- +extern uint16 halUart1Read(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Write a buff to the uart +//------------------------------------------------------------------- +extern uint16 halUart1Write(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Return the number of bytes in the Rx buffer +//------------------------------------------------------------------- +extern uint16 halUart1RxLen(void); + +//------------------------------------------------------------------- +// Abort UART when entering sleep mode +//------------------------------------------------------------------- +extern void halUart1Suspend(void); + +//------------------------------------------------------------------- +// Resume UART after wakeup from sleep +//------------------------------------------------------------------- +extern void halUart1Resume(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.c new file mode 100644 index 0000000..de7bc79 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.c @@ -0,0 +1,38 @@ +//------------------------------------------------------------------- +// Filename: dma_ad590.c +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_ad590.h" + +//------------------------------------------------------------------- +// @fn dma_ad590_Init +// @brief Set up port ad590 ad +// @return none +//------------------------------------------------------------------- +void dma_ad590_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_ad590_GetValue +// @brief Get this ad590 module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_ad590_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.h new file mode 100644 index 0000000..e27099c --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_ad590.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: dma_ad590.h +// Description: ad590 module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_ad590_Init(void); +uint16 dma_ad590_GetValue(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.c new file mode 100644 index 0000000..00a11df --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.c @@ -0,0 +1,193 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.c +// Description: dma_bma module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "dma_bma.h" + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cAck(void)//µ±SDA=0ʱ²úÉúÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cNack(void)//µ±SDA=1ʱ²úÉú·ÇÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCL_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } +} + +//------------------------------------------------------------------- +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + HAL_E2PROM_SCL_SET(); + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); + } + HAL_E2PROM_SDA_DIR_OUT();//cpu»ñÈ¡ÍêÒ»¸ö×Ö½Úºó£¬ÔÙ½«SDA¶Ë¿ÚÉèÖóÉÊä³ö£¬ÇÒÖÃ¸ß´Ë¶Ë¿Ú + return res; +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); +} + + +//------------------------------------------------------------------- +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0x70);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); + halMcuWaitMs(5); +} + +//------------------------------------------------------------------- +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + + M3_I2cWrite(0x70); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + + M3_I2cStart(); + + M3_I2cWrite(0x71); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + + M3_I2cNack(); + M3_I2cStop(); + + return res; +} + +uint16 BMA_X_Value,BMA_Y_Value,BMA_Z_Value; + +void BMA_Pooling(void) +{ + uint16 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + uint16 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + + BMA_XL_Value = M3_ReadEEPROM(0x02); + BMA_XM_Value = M3_ReadEEPROM(0x03); + BMA_YL_Value = M3_ReadEEPROM(0x04); + BMA_YM_Value = M3_ReadEEPROM(0x05); + BMA_ZL_Value = M3_ReadEEPROM(0x06); + BMA_ZM_Value = M3_ReadEEPROM(0x07); + + BMA_X_Value = (BMA_XM_Value << 2) + ((BMA_XL_Value&0xc0)>>6); + BMA_Y_Value = (BMA_YM_Value << 2) + ((BMA_YL_Value&0xc0)>>6); + BMA_Z_Value = (BMA_ZM_Value << 2) + ((BMA_ZL_Value&0xc0)>>6); +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.h new file mode 100644 index 0000000..f5096dc --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_bma.h @@ -0,0 +1,16 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.h +// Description: dma_bma module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +extern uint16 BMA_X_Value; +extern uint16 BMA_Y_Value; +extern uint16 BMA_Z_Value; + +void M3_Init(void); +//void M3_WriteEEPROM(uint8 addr, uint8 ch); +uint8 M3_ReadEEPROM(uint8 addr); + +void BMA_Pooling(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.c new file mode 100644 index 0000000..446351d --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.c @@ -0,0 +1,59 @@ +//------------------------------------------------------------------- +// Filename: hal_dc.c +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "dma_dc.h" + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halDcStart +// @brief Turn DC on. +// @param uint8 id - led to set +// @return none +//------------------------------------------------------------------- +void halDcStart(uint8 dc_num) +{ + switch (dc_num) + { + case 1: + HAL_DC_START_1(); + break; + case 2: + HAL_DC_START_2(); + break; + default: + break; + } +} + +//------------------------------------------------------------------- +// @fn halDcStop +// @brief Turn LED off. +// @param uint8 id - led to clear +// @return none +//------------------------------------------------------------------- +void halDcStop(uint8 dc_num) +{ + switch (dc_num) + { + case 1: + HAL_DC_STOP_1(); + break; + case 2: + HAL_DC_STOP_2(); + break; + default: + break; + } +} + + +//------------------------------------------------------------------- diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.h new file mode 100644 index 0000000..063d3de --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_dc.h @@ -0,0 +1,8 @@ +//------------------------------------------------------------------- +// Filename: hal_led.h +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halDcStart(uint8 dc_num); +void halDcStop(uint8 dc_num); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.c new file mode 100644 index 0000000..0e581dd --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.c @@ -0,0 +1,175 @@ +//------------------------------------------------------------------- +// Filename: dma_eeprom.c +// Description: dma_eeprom module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "dma_eeprom.h" + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cAck(void)//µ±SDA=0ʱ²úÉúÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cNack(void)//µ±SDA=1ʱ²úÉú·ÇÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCL_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } +} + +//------------------------------------------------------------------- +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + HAL_E2PROM_SCL_SET(); + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); + } + HAL_E2PROM_SDA_DIR_OUT();//cpu»ñÈ¡ÍêÒ»¸ö×Ö½Úºó£¬ÔÙ½«SDA¶Ë¿ÚÉèÖóÉÊä³ö£¬ÇÒÖÃ¸ß´Ë¶Ë¿Ú + return res; +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); +} + + +//------------------------------------------------------------------- +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0xa0);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); + halMcuWaitMs(5); +} + +//------------------------------------------------------------------- +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + + M3_I2cWrite(0xa0); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + + M3_I2cStart(); + + M3_I2cWrite(0xa1); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + + M3_I2cNack(); + M3_I2cStop(); + + return res; +} + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.h new file mode 100644 index 0000000..6875a54 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_eeprom.h @@ -0,0 +1,11 @@ +//------------------------------------------------------------------- +// Filename: dma_eeprom.h +// Description: dma_eeprom module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- + +void M3_Init(void); +void M3_WriteEEPROM(uint8 addr, uint8 ch); +uint8 M3_ReadEEPROM(uint8 addr); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.c new file mode 100644 index 0000000..fd2b78c --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.c @@ -0,0 +1,64 @@ +//------------------------------------------------------------------- +// Filename: dma_imc.c +// Description: dma_imc library +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "dma_imc.h" + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +uint16 M1_ImcValue; + +static const digioConfig pinM1_Imc = +{ + HAL_BOARD_IO_INT_PORT, HAL_BOARD_IO_INT_PIN, BV(HAL_BOARD_IO_INT_PIN), HAL_DIGIO_INPUT, 0 +}; + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +/*static void M1_ImcISR(void) +{ + M1_ImcValue++; +}*/ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M1_Init(void) +{ + M1_ImcValue = 0; + halDigioConfig(&pinM1_Imc); + MCU_IO_INPUT(HAL_BOARD_IO_INT_PORT, HAL_BOARD_IO_INT_PIN, MCU_IO_TRISTATE); //MCU_IO_TRISTATE MCU_IO_PULLUP + halDigioIntSetEdge(&pinM1_Imc, HAL_DIGIO_INT_RISING_EDGE); + // halDigioIntConnect(&pinM1_Imc, &M1_ImcISR); +} + +//------------------------------------------------------------------- +uint16 M1_GetValue(void) +{ + M1_ImcValue = HAL_INT_VAL(); + return M1_ImcValue; +} + +//------------------------------------------------------------------- +void M1_Enable(void) +{ + M1_ImcValue = 0; + halDigioIntEnable(&pinM1_Imc); +} + +//------------------------------------------------------------------- +void M1_Disable(void) +{ + halDigioIntDisable(&pinM1_Imc); +} + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.h new file mode 100644 index 0000000..78c234c --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_imc.h @@ -0,0 +1,11 @@ +//------------------------------------------------------------------- +// Filename: dma_imc.h +// Description: dma_imc library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M1_Init(void); +uint16 M1_GetValue(void); +void M1_Enable(void); +void M1_Disable(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.c new file mode 100644 index 0000000..80accd1 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.c @@ -0,0 +1,204 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_int.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_uart.h" +#include "hal_led.h" +#include "dma_itg.h" + + + +//--------- write a byte and checks the ack signal----------------- +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCK_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } + +} + +//--------- read a byte and checks the ack signal----------------- +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + HAL_E2PROM_SCK_SET(); + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR(); + halMcuWaitUs(2); + } + // MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,!ack); /*µ±ack£½1ʱÀ­µÍÊý¾ÝÏß*/ + // HAL_E2PROM_SDA_SET(); + + HAL_E2PROM_SCK_SET(); /*clk #9 for ack*/ + halMcuWaitUs(1); /*pulswith approx 1 us */ + HAL_E2PROM_SCK_CLR(); + HAL_E2PROM_SDA_SET(); + + return res; +} + +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCK_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + + HAL_E2PROM_SCK_SET(); //SCL=1 + + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +void M3_I2cAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_SET(); + HAL_E2PROM_SCK_CLR(); +} + +//------------------------------------------------------------------- +void M3_I2cNAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_CLR(); + HAL_E2PROM_SCK_CLR(); +} + +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,1); +} + +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0xD2);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); +} + +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + M3_I2cWrite(0xD2); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cStart(); + M3_I2cWrite(0xD3); //Æ÷¼þÉèÖÃΪ¶Á״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + M3_I2cNAck(); + M3_I2cStop(); + + return res; +} + +uint16 BMA_X_Value,BMA_Y_Value,BMA_Z_Value; +uint8 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; +uint8 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + +void BMA_Pooling(void) +{ + // uint16 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + // uint16 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + uint16 num_x1=0,num_y1=0,num_z1=0; + uint16 num_x=0,num_y=0,num_z=0; + uint8 i = 0; + + for(i=0;i<10;i++) + { + while (!(M3_ReadEEPROM(0x1A) & 0x01)); + + BMA_XM_Value = M3_ReadEEPROM(0x1D); //1d 1b + halMcuWaitUs(5); + BMA_XL_Value = M3_ReadEEPROM(0x1E); //1e 1c + halMcuWaitUs(5); + BMA_YM_Value = M3_ReadEEPROM(0x1F); + halMcuWaitUs(5); + BMA_YL_Value = M3_ReadEEPROM(0x20); + halMcuWaitUs(5); + BMA_ZM_Value = M3_ReadEEPROM(0x21); + halMcuWaitUs(5); + BMA_ZL_Value = M3_ReadEEPROM(0x22); + halMcuWaitUs(5); + + + num_x1 = (BMA_XM_Value << 8) + BMA_XL_Value; + num_y1 = (BMA_YM_Value << 8) + BMA_YL_Value; + num_z1 = (BMA_ZM_Value << 8) + BMA_ZL_Value; + + num_x = num_x + num_x1; + num_y = num_y + num_y1; + num_z = num_z + num_z1; + } + BMA_X_Value = num_x/10; + BMA_Y_Value = num_y/10; + BMA_Z_Value = num_z/10; + + halMcuWaitMs(1); +} + + + + + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.h new file mode 100644 index 0000000..937107c --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_itg.h @@ -0,0 +1,25 @@ +#define ACK 1 +#define noACK 0 +#define measure_temp_H 0x1B +#define measure_temp_L 0x1C +#define measure_X_H 0x1D +#define measure_X_L 0x1E +#define measure_Y_H 0x1F +#define measure_Y_L 0x20 +#define measure_Z_H 0x21 +#define measure_Z_L 0x22 + + +#define uchar unsigned char +#define uint unsigned int +#define ulong unsigned long + +extern uint16 BMA_X_Value,BMA_Y_Value,BMA_Z_Value; +extern uint8 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; +extern uint8 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + + + +void M3_Init(void); +void BMA_Pooling(void); +void M3_WriteEEPROM(uint8 addr, uint8 ch); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.c new file mode 100644 index 0000000..14d09aa --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: dma_tgs.c +// Description: dma_tgs library (A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_kr.h" + +//------------------------------------------------------------------- +// @fn dma_tgs_Init +// @brief Set up port dma_tgs ad +// @return none +//------------------------------------------------------------------- +void dma_tgs_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_tgs_GetValue +// @brief Get this dma_tgs module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_tgs_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.h new file mode 100644 index 0000000..4adb40d --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_kr.h @@ -0,0 +1,6 @@ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_tgs_Init(void); +uint16 dma_tgs_GetValue(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.c new file mode 100644 index 0000000..2cf60c1 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: dma_m4.c +// Description: dma_m4 library (A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_m4.h" + +//------------------------------------------------------------------- +// @fn dma_m4_Init +// @brief Set up port dma_m4 ad +// @return none +//------------------------------------------------------------------- +void dma_m4_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_m4_GetValue +// @brief Get this dma_m4 module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_m4_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.h new file mode 100644 index 0000000..915079b --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_m4.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: dma_m4.h +// Description: dma_m4 module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_m4_Init(void); +uint16 dma_m4_GetValue(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_sht.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_sht.h new file mode 100644 index 0000000..c817fb3 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_sht.h @@ -0,0 +1,219 @@ + + +#define ACK 1 +#define noACK 0 +#define measure_temp 0x03 //²âÁ¿Î¶ÈÃüÁî +#define measure_humi 0x05 //²âÁ¿Êª¶ÈÃüÁî +#define RESET 0x1e //ÈíÆô¶¯ + +#define uchar unsigned char +#define uint unsigned int +#define ulong unsigned long + +//------------------------Êý¾Ý½á¹¹Ì嶨Òå--------------------------- +typedef union //±£´æËù²âµÃµÄζȣ¦Êª¶ÈÖµ +{ uint i; + float f; +} value; + +typedef struct __WENSHIDU__ +{ + uchar gewei; + uchar shiwei; + uchar DateString1[4]; + // uchar DateString2[8]; +}WENSHIDU; + +WENSHIDU S; + + +/***************************º¯ÊýÉùÃ÷*******************************/ +char write_byte(unsigned char value); +char read_byte(unsigned char ack); +void transstart(void); +void connectionreset(void); +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode); +void calc_sth11(float *p_humidity ,float *p_temperature); +void DateToStr(WENSHIDU *Time,float datax,float datax1); +void call_sht11(void); + + + + +//--------- write a byte and checks the ack signal----------------- +char write_byte(uchar value) +{ + uchar i,error=0; + + for (i=0x80;i>0;i/=2) /*Á¬ÐøÏòÓÒÒÆ¶¯8λ*/ + { + if (i & value) + HAL_SHT_SDA_SET(); /*°ÑÏàÓ¦µÄλËÍÊý¾ÝÏß*/ + else + HAL_SHT_SDA_CLR(); + + HAL_SHT_SCK_SET(); /*ʱÐòÂö³å£¬Ó¦Ñϸñ°´×Ŵ˱ê×¼*/ + halMcuWaitUs(1); /*´óÔ¼ 1 us*/ + HAL_SHT_SCK_CLR(); + } + HAL_SHT_SDA_SET(); /*ÊÍ·ÅÊý¾ÝÏß*/ + HAL_SHT_SDA_DIR_IN(); + HAL_SHT_SCK_SET(); /*µÚ9λ×÷ΪÏìӦλ*/ + error=HAL_SHT_SDA_VAL(); /*¼ì²âÏìÓ¦Çé¿ö£¬Èç¹ûÓÐÏìÓ¦Êý¾ÝÏ߾ͻᱻSHT10À­µÍ*/ + HAL_SHT_SCK_CLR(); + + return error; /*·µ»Ø1±íʾûÏìÓ¦*/ +} + +//--------- read a byte and checks the ack signal----------------- +char read_byte(uchar ack) +{ + uchar i,val=0; + + HAL_SHT_SDA_SET(); /*ÊÍ·ÅÊý¾ÝÏß*/ + HAL_SHT_SDA_DIR_IN(); + for (i=0x80;i>0;i/=2) /*Á¬ÐøÏòÓÒÒÆ¶¯8λ*/ + { + HAL_SHT_SCK_SET(); /*clk for SENSI-BUS*/ + if (HAL_SHT_SDA_VAL()) + val=(val | i); /*read bit */ + HAL_SHT_SCK_CLR(); + } + MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,!ack); /*µ±ack£½1ʱÀ­µÍÊý¾ÝÏß*/ + HAL_SHT_SCK_SET(); /*clk #9 for ack*/ + halMcuWaitUs(1); /*pulswith approx 1 us */ + HAL_SHT_SCK_CLR(); + HAL_SHT_SDA_SET(); /*ÊÍ·ÅÊý¾ÝÏß*/ + + return val; +} + + +void transstart(void) +{ + HAL_SHT_SCK_SET(); + halMcuWaitUs(1); + HAL_SHT_SDA_CLR(); + halMcuWaitUs(1); + HAL_SHT_SCK_CLR(); + halMcuWaitUs(2); + HAL_SHT_SCK_SET(); + halMcuWaitUs(1); + + HAL_SHT_SDA_SET(); + halMcuWaitUs(1); + HAL_SHT_SCK_CLR(); + halMcuWaitUs(2); + HAL_SHT_SDA_CLR(); +} + +void connectionreset(void) +{ + unsigned char i; + + HAL_SHT_SDA_SET(); + HAL_SHT_SCK_CLR(); //Initial state + + for(i=0;i<9;i++) //9 SCK cycles + { + HAL_SHT_SCK_SET(); + HAL_SHT_SCK_CLR(); + } + + transstart(); //transmission start +} + + + +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) +{ + unsigned error=0; + uint i; + + connectionreset(); + switch(mode) + { //·¢ËͼĴæÆ÷µØÖ·¸ø´«¸ÐÆ÷ + case 0 : error+=write_byte(measure_temp); break; + case 1 : error+=write_byte(measure_humi); break; + default : break; + } + HAL_SHT_SDA_DIR_IN(); + for (i=0;i<35000;i++) + { + halMcuWaitUs(1); + if(HAL_SHT_SDA_VAL()== 0) break; + } //µÈ´ýÀ­µÍÊý¾ÝÏß + if(HAL_SHT_SDA_VAL()) error+=1; + *(p_value+1) =read_byte(ACK); //¶Á¸ß×Ö½Ú + *(p_value)=read_byte(ACK); //¶ÁµÍ×Ö½Ú + *p_checksum =read_byte(noACK); + + return error; +} + + +void calc_sth11(float *p_humidity ,float *p_temperature) +{ + const float C1=-4.0; //for 12 Bit + const float C2=+0.0405; //for 12 Bit + const float C3=-0.0000028; //for 12 Bit + const float T1=+0.01; //for 14 Bit @ 5V + const float T2=+0.00008; //for 14 Bit @ 5V + + float rh=*p_humidity; //rh: Humidity [Ticks] 12 Bit + float t=*p_temperature; //*t: Temperature [Ticks] 14 Bit + float rh_lin; //rh_lin: Humidity linear + float rh_true; //rh_true: Temperature compensated humidity + float t_C; //t_C : Temperature [°C] + + t_C=t*0.01 - 40; //calc. temperature from ticks to [°C] + rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH] + rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH] + if(rh_true>100)rh_true=100; //cut if the value is outside of + if(rh_true<0.1)rh_true=0.1; //the physical possible range + + *p_temperature=t_C; //return temperature [°C] + *p_humidity=rh_true; //return humidity[%RH] +} + + +void DateToStr(WENSHIDU *Time,float datax,float datax1) +{ + uint i; + + i=(int)datax; + Time->DateString1[0] = i; + i=(int)((datax-i)*10); + Time->DateString1[1] = i; + + i=(int)datax1; + Time->DateString1[2] = i; + i=(int)((datax1-i)*10); + Time->DateString1[3] = i; + +} + + + +void call_sht11(void) +{ + + value humi_val,temp_val; + unsigned char error = 0,checksum; + + + error+=s_measure((unsigned char*) &humi_val.i,&checksum,1); //measure humidity + error+=s_measure((unsigned char*) &temp_val.i,&checksum,0); //measure temperature + if(error!=0) + connectionreset(); //Èç¹û·¢Éú´íÎó£¬ÏµÍ³¸´Î» + else + { + humi_val.f=(float)humi_val.i; //converts integer to float + temp_val.f=(float)temp_val.i; //converts integer to float + calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity,temperature + DateToStr(&S,temp_val.f,humi_val.f); + } +} + + + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.c new file mode 100644 index 0000000..731a8dd --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.c @@ -0,0 +1,101 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_tc72.h" + +uint16 TC72_Value = 0; + +void Write_Tc72(uint8 ch) +{ + uint8 i, cmd; + + cmd = ch; + for (i = 0; i < 8; i++) + { + HAL_TC72_SCL_CLR(); + if (cmd &0x80) + { + HAL_TC72_SDI_SET(); + } + else + { + HAL_TC72_SDI_CLR(); + } + cmd <<= 1; + HAL_TC72_SCL_SET(); + } + HAL_TC72_SDI_SET(); +} + +uint16 Read_Tc72(void) +{ + uint8 i, ret; + + HAL_TC72_SDI_CLR(); + for (i = 0; i < 8; i++) + { + HAL_TC72_SCL_CLR(); + ret <<= 1; + HAL_TC72_SCL_SET(); + if (HAL_TC72_SDO_VAL()) + ret |= 0x01; + } + HAL_TC72_SDI_SET(); + return ret; +} + + + +//------------------------------------------------------------------- +void TC72_Start(void) +{ + HAL_TC72_SSS_SET(); + Write_Tc72(0x80); + Write_Tc72(0x15); + HAL_TC72_SSS_CLR(); +} + +//------------------------------------------------------------------- +void TC72_Read(void) +{ + uint16 m,n; + HAL_TC72_SSS_SET(); + + Write_Tc72(0x02); + halMcuWaitUs(200); + m = Read_Tc72(); + halMcuWaitUs(200); + + Write_Tc72(0x01); + halMcuWaitUs(200); + n = Read_Tc72(); + halMcuWaitUs(200); + + TC72_Value = (m<<8)+n; + HAL_TC72_SSS_CLR(); +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void TC72_Init(void) +{ + MCU_IO_INPUT(HAL_BOARD_IO_TC72_SDO_PORT, HAL_BOARD_IO_TC72_SDO_PIN, MCU_IO_PULLUP); + MCU_IO_OUTPUT(HAL_BOARD_IO_TC72_SDI_PORT, HAL_BOARD_IO_TC72_SDI_PIN,1); + MCU_IO_OUTPUT(HAL_BOARD_IO_TC72_SCL_PORT, HAL_BOARD_IO_TC72_SCL_PIN,1); + MCU_IO_OUTPUT(HAL_BOARD_IO_TC72_SSS_PORT, HAL_BOARD_IO_TC72_SSS_PIN,1); +} + +//------------------------------------------------------------------- +uint16 TC72_ReadTemp(void) +{ + TC72_Start(); + halMcuWaitMs(2); + TC72_Read(); + return TC72_Value; +} + + diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.h new file mode 100644 index 0000000..672b851 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tc72.h @@ -0,0 +1,8 @@ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- + +void TC72_Init(void); +uint16 TC72_ReadTemp(void); +void TC72_Enable(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.c new file mode 100644 index 0000000..034a3a8 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: dma_tgs.c +// Description: dma_tgs library (A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_tgs.h" + +//------------------------------------------------------------------- +// @fn dma_tgs_Init +// @brief Set up port dma_tgs ad +// @return none +//------------------------------------------------------------------- +void dma_tgs_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_tgs_GetValue +// @brief Get this dma_tgs module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_tgs_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.h new file mode 100644 index 0000000..4adb40d --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs.h @@ -0,0 +1,6 @@ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_tgs_Init(void); +uint16 dma_tgs_GetValue(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.c new file mode 100644 index 0000000..9e743a2 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: M190.c +// Description: hal M190 library å�¯è®Šé›»é˜»(A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_tgs2602.h" + +//------------------------------------------------------------------- +// @fn M190_Init +// @brief Set up port M190 ad +// @return none +//------------------------------------------------------------------- +void dma_tgs2602_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn M190_GetValue +// @brief Get this M190 module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_tgs2602_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.h new file mode 100644 index 0000000..fb8f887 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/moudle/dma_tgs2602.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: M190.h +// Description: M190 module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_tgs2602_Init(void); +uint16 dma_tgs2602_GetValue(void); diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/Flash_data.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/Flash_data.c new file mode 100644 index 0000000..c0c5f3a --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/Flash_data.c @@ -0,0 +1,73 @@ +#include "hal_defs.h" +#include "hal_flash.h" +#include "Flash_data.h" + +#define OSAL_NV_WORD_SIZE 4 + + +void writeWordM( uint8 pg, uint16 offset, uint8 *buf, uint16 cnt ) +{ + offset = (offset >> 2) + ((uint16)pg << 9); + HalFlashWrite(offset, buf, cnt); + +} + + +void writeWord( uint8 pg, uint16 offset, uint8 *buf ) +{ + offset = (offset / HAL_FLASH_WORD_SIZE) + ((uint16)pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE)); + HalFlashWrite(offset, buf, 1); +} + + +extern void writeBuf( uint8 dstPg, uint16 dstOff, uint16 len, uint8 *buf ) +{ + uint8 rem = dstOff % OSAL_NV_WORD_SIZE; + uint8 tmp[OSAL_NV_WORD_SIZE]; + + if ( rem ) + { + dstOff = (dstOff / OSAL_NV_WORD_SIZE) * OSAL_NV_WORD_SIZE; + HalFlashRead(dstPg, dstOff, tmp, OSAL_NV_WORD_SIZE); + + while ( (rem < OSAL_NV_WORD_SIZE) && len ) + { + tmp[rem++] = *buf++; + len--; + } + + writeWord( dstPg, dstOff, tmp ); + dstOff += OSAL_NV_WORD_SIZE; + } + + rem = len % OSAL_NV_WORD_SIZE; + len /= OSAL_NV_WORD_SIZE; + + if ( len ) + { + writeWordM( dstPg, dstOff, buf, len ); + dstOff += OSAL_NV_WORD_SIZE * len; + buf += OSAL_NV_WORD_SIZE * len; + } + + if ( rem ) + { + uint8 idx = 0; + HalFlashRead(dstPg, dstOff, tmp, OSAL_NV_WORD_SIZE); + while ( rem-- ) + { + tmp[idx++] = *buf++; + } + writeWord( dstPg, dstOff, tmp ); + } + } + + +void delay(int time ) +{ + uint16 cntr1,cntr2; + for (cntr1=0;cntr1 +#include +#include + + +void WaitUs(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} +/********************************************************** +func: ½ÓÊÕ´®¿ÚÊý¾Ý°ü +²ÎÊý£º + 1. *buf -- ´®¿Ú½ÓÊÕÊý¾ÝËù´æ·ÅµÄµØ·½ + 2. maxlen -- ´®¿Ú½ÓÊÕÊý¾ÝµÄ×î´ó³¤¶È +retuen: uint16 ½ÓÊÕµ½µÄÊý¾Ý³¤¶È +***********************************************************/ +uint16 uart_read(uint8 *buf, uint16 maxlen) +{ + uint16 slen=0; + uint8 dtime=0; + while(dtime<20) + { + while(HalUARTRead(buf+slen, 1)) + { + slen++; + if(slen>=maxlen) + return slen; + dtime=0; + } + WaitUs(30); // Wait 30us; + dtime++; + } + return slen; +} +/***** +°´printf¸ñʽ´òÓ¡Êä³ö×Ö·û´® + +***/ +void printf_str( char *buf, char *fmt,... ) +{ + va_list ap; + va_start(ap,fmt); + vsprintf(buf,fmt,ap); + va_end(ap); +} +/********/ +void uart_printf(char *fmt,...) +{ + va_list ap; + char str[256]; + + va_start(ap,fmt); + vsprintf(str,fmt,ap); + UartWrite(str,strlen(str)); + va_end(ap); +} + +void uart_enter(void) +{ + + uart_printf("\r\n"); + +} + +void uart_datas(void * fmt,uint16 len) +{ + char * ptr; + ptr=fmt; + while(len--) + { + uart_printf("%02x ",*ptr ); + ptr++; + } + uart_enter(); +} + +uint8 lrc_checksum(uint8* buf, uint8 len) +{ + uint8 lrc=0; + while(len--) + { + lrc+=*buf; + buf++; + } + lrc =~lrc; + lrc++; + return lrc; +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_PRINT.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_PRINT.h new file mode 100644 index 0000000..771f60a --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_PRINT.h @@ -0,0 +1,17 @@ + + +#ifndef uart_PRINT_H +#define uart_PRINT_H +//#define UartWrite(buf,len) (HalUARTWrite(HAL_UART_PORT_0,(buf),(len))) +#define UartWrite(buf,len) (halUartWrite((buf),(len))) +#define HalUARTRead(buf,len) (halUartRead((buf),(len))) + +uint16 RecvUartData(uint8 *uRxData, uint16 uRxlen); +uint16 RecvUart1Data(uint8 *uRxData, uint16 uRxlen); +extern void uart_datas(void *fmt,uint16 len); +extern void uart_enter(void); +extern void uart_printf(char *fmt,...); +extern void printf_str(char *buf, char *fmt,...); +extern uint16 uart_read(uint8 *buf, uint16 maxlen); +extern uint8 lrc_checksum(uint8* buf, uint8 len); +#endif \ No newline at end of file diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c new file mode 100644 index 0000000..93fd870 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c @@ -0,0 +1,74 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_int.h" +#include "hal_mcu.h" +#include "hal_uart.h" +#include "hal_uart1.h" + + +/************************************************************************************** +²ÎÊý£º + 1. *dst -- Ä¿µÄÊý×éµÄÊ×µØÖ·£¬Ò²¾ÍÊÇ×îºó´æ·ÅÊý¾ÝµÄµØ·½ + 2. dststart -- ´ÓÄ¿µÄÊý×éµÄµÚ dststart λ¿ªÊ¼´æ·ÅÊý¾Ý + 3. *src -- Ô´Êý¾ÝµÄÊ×µØÖ·£¬Ò²¾ÍÊÇÊý¾ÝµÄÀ´Ô´ + 4. srcstart -- ´ÓÔ´Êý×éµÄµÚ srcstart λ¿ªÊ¼È¡Êý¾Ý + 5. len -- ÐèÒª´ÓÔ´Êý×éÈ¡ len ×Ö½ÚµÄÊý¾Ý´æ·Åµ½Ä¿µÄÊý×éÖÐ +Àý×Ó£º + MyByteCopy(buf1, 5, buf2, 3, 4)£» + ´ÓÊý×é buf2 µÄµÚ3¸ö×Ö½Ú¿ªÊ¼ÍùºóµÄ4¸ö×Ö½Ú£¨buf2[3]¡¢buf2[4]¡¢buf2[5]¡¢buf2[6]£© + ¸´ÖƵ½ buf1[5]¡¢buf1[6]¡¢buf1[7]¡¢buf1[8]ÖС£ +***************************************************************************************/ +void MyByteCopy(uint8 *dst, int dststart, uint8 *src, int srcstart, int len) +{ + int i; + for(i=0; i 0) + { + r_UartLen = halUartRead(r_UartBuf, sizeof(r_UartBuf)); + MyByteCopy(uRxData, uRxlen, r_UartBuf, 0, r_UartLen); + uRxlen += r_UartLen; + halMcuWaitMs(5); //ÕâÀïµÄÑӳٷdz£ÖØÒª£¬ÒòΪÕâÊÇ´®¿ÚÁ¬Ðø¶ÁÈ¡Êý¾ÝʱºòÐèÒªÓÐÒ»¶¨µÄʱ¼ä¼ä¸ô + r_UartLen = halUartRxLen(); + } + return uRxlen; +} + +/********************************************************** +²ÎÊý£º + 1. *uRxData -- ´®¿Ú1½ÓÊÕÊý¾ÝËù´æ·ÅµÄµØ·½ + 2. uRxlen -- ´®¿Ú1½ÓÊÕÊý¾ÝµÄ³õʼ³¤¶È£¨Ò»°ãΪ0£© +***********************************************************/ +uint16 RecvUart1Data(uint8 *uRxData, uint16 uRxlen) +{ + uint16 r_Uart1Len = 0; + uint8 r_Uart1Buf[128]; + + r_Uart1Len = halUart1RxLen(); + halMcuWaitMs(5); + while(r_Uart1Len > 0) + { + r_Uart1Len = halUart1Read(r_Uart1Buf, sizeof(r_Uart1Buf)); + MyByteCopy(uRxData, uRxlen, r_Uart1Buf, 0, r_Uart1Len); + uRxlen += r_Uart1Len; + halMcuWaitMs(5); //ÕâÀïµÄÑӳٷdz£ÖØÒª£¬ÒòΪÕâÊÇ´®¿ÚÁ¬Ðø¶ÁÈ¡Êý¾ÝʱºòÐèÒªÓÐÒ»¶¨µÄʱ¼ä¼ä¸ô + r_Uart1Len = halUart1RxLen(); + } + return uRxlen; +} \ No newline at end of file diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h new file mode 100644 index 0000000..d08350f --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h @@ -0,0 +1,4 @@ + +void MyByteCopy(uint8 *dst, int dststart, uint8 *src, int srcstart, int len); +uint16 RecvUartData(uint8 *uRxData, uint16 uRxlen); +uint16 RecvUart1Data(uint8 *uRxData, uint16 uRxlen); \ No newline at end of file diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/readme.doc b/Zigbee无线通信/Aæ�¿/CC2530_lib/readme.doc new file mode 100644 index 0000000000000000000000000000000000000000..f808f56fd9c46b4fba4d3e8601a773029368acff GIT binary patch literal 32768 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 pFirst) + { + last = *pLast; + *(pLast--) = *pFirst; + *(pFirst++) = last; + } + + return pValueToTextBuffer; +} + +//------------------------------------------------------------------- +// @fn utilReverseBuf +// @brief reverse buffer +// @param uint8 pBuf - pointer to buffer +// uint8 length - length of buffer +// @return void +//------------------------------------------------------------------- +void utilReverseBuf(uint8 *pBuf, uint8 length) +{ + uint8 temp; + uint8 *pBufLast = (pBuf + length - 1); + + while (pBufLast > pBuf) + { + temp = *pBuf; + *pBuf++ = *pBufLast; + *pBufLast-- = temp; + } +} diff --git a/Zigbee无线通信/Aæ�¿/CC2530_lib/utils/util.h b/Zigbee无线通信/Aæ�¿/CC2530_lib/utils/util.h new file mode 100644 index 0000000..dcf47d1 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/CC2530_lib/utils/util.h @@ -0,0 +1,31 @@ +//------------------------------------------------------------------- +// Filename: util.h +// Description: Utility library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef struct +{ + const char *szDescr; // Textual description + const uint8 value; // Value +} menuItem_t; + +typedef struct +{ + const menuItem_t *pMenuItems; + const uint8 nItems; +} menu_t; + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Number of elements in an array +#define N_ITEMS(arr) sizeof(arr)/sizeof(arr[0]) + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +char *convInt32ToText(int32 value); +const char *utilChipIdToStr(uint8 chipID); +void utilReverseBuf(uint8 *pBuf, uint8 length); diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Exe/rf_set.d51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Exe/rf_set.d51 new file mode 100644 index 0000000000000000000000000000000000000000..d20d7720635ccde1136c635624193757e1905599 GIT binary patch literal 73318 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 GzW)Q7XA4FE literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/BMA020.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/BMA020.r51 new file mode 100644 index 0000000000000000000000000000000000000000..411f625c4fa15e2ab2a856ca737bfa7990b1eae9 GIT binary patch literal 30878 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/get_adc.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/get_adc.r51 new file mode 100644 index 0000000000000000000000000000000000000000..16765ddd081869f55e52aad9e2ca0a5c41578277 GIT binary patch literal 27521 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_board.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_board.r51 new file mode 100644 index 0000000000000000000000000000000000000000..f75c7a88f9cba3871cf1925720afbb6ec272d422 GIT binary patch literal 4732 zcmd57&-6`q;h<&qRdiINz}vVm+O2eB=iAt{Mgg%$!ysTC#K%Tg+>7?c+jxfB302cZfb9sq_}W8(qG)fuuy1B|SF9r+ znjml%-1+(5yuX?E-Yl_S>KFanzFMiStv5XKTVZNc8Eu&#lzI&BYtE5>vAXdq2(eKR?zozN;TDn=$D_XNvD&GanTQQoY^*UF25r7d*t2fFeYPnWzSkw_% zYqpv|6RBD%jT#@)G_$?Au3K88$~4jyIOdoEMp`ZH4c%(;J;1R%`t*H4NT+9tIjgZ@ zl{S@c8g;#?T)H=%xLnL6^9tYGW^o?GR=`T-R>QixuAAkWl88i$)6uC|(J;%!#rc_H zJQ|O|(L`d$`|tgG|AUi%9PghTee_8&I;qXg-%uZXeEhHX{&l|kusTi z`Gp~|73v0SHu!*`09{%xQ%55;fv=rHeu`G~YSYCG&R;P$jD`zF5Q|{LY`IXFL!0Hc z3x&A2cF8(jHii+#Sj1jL2qpr-f=sX|5iEHK_5db(2{}N$5KVB#NYb=*qXl#9&YM;1 z00n`W(jjhXpd6q+fdjIp88#xi$hwV4F0y4K9^#>5fQ#kL0UDG!0-aM0y3b&zlK41I>Diy97do?bX3R!nTJ(HA(^!2jU19>l?qVNSID;ClK-xN~p} z;9MM*4W8o&_`ndpQ$wR1g@orQb@(9)VH~vUlG=K?|P!0vxHET9Cms!pwSJDfP%plby z&8G76D-INq|S*%icM6;u(|e-B{X@U-H`H zxuu``xDG8p4@}FCj){aY@=EAc5nU0`H37R4u`4c)(3_pkUq2Kg(HNLlYvWgi$ZOFU zdh~UIutcx(IDRt%#XazTghG$glkN|C(pF`P==qC-_gG9yXm?=ma6MgAmz4i0mLF zb`bu55la<-w_mOT2!bz9LE^*2_u+kuYCy;E_Rs@|olXp_i4@!YgN83#rudcRM%yaGB%4lVvx=h3&caIj z+kju&%}!?rEbVl5(Uu7V@9o=(AKqb6xclqpXnnlP`WtEiY*&=I+)DoH*wgp+Sso0m zv5eXM=~u)9cmKP-YtFWt)w$hYe%0)zapQa^K09y*)>zrz{n>Lgf1)dJ+-;}kv#;4_ z+kTvQD{&0@OxD=NvHPRv=)+{U4~sW)H2B$P$r&+|Ib@gqA-k*(+5R80;&aGC>5!%J zlK|_*JIuFt*4P#I&LNvU2~4AXj1CzFm5b+o>>2KVrlPnX^=H`jM7qQB@ZH(WR_DJa CII^(- literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_clock.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_clock.r51 new file mode 100644 index 0000000000000000000000000000000000000000..bfe7cb9d5728aad51581d6a2e8354b9425be814a GIT binary patch literal 4835 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_digio.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_digio.r51 new file mode 100644 index 0000000000000000000000000000000000000000..bad3a299b4e5cb9368af0a856f005a023523a155 GIT binary patch literal 34769 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

_9^l56+nsgs)*RSNrH(sG@rvJd8C z(={fh^VRG!LqnmVVLxb?aSDbrnZS-9AA8QHfp$93QglBn#Tkad4;lt8Oat|jprP2n z@IJIIv<+SxI(%Uos8a+DvkeW;LQR5wxIn{?FH8fN5&g_P%1Ut;?2(q70{fB43D5wA zbZ85-4{(UIE!?<)ik~kZV;X+zDUjx|X3|)U6fl%O!IYGADPPW zY#u-J4dp*z%F{vl-(8sU08KARcRa|De=L-9H!Y3QwQO8Dt;~>S(L#x+eRM@1SAOns zNg4L2+vtinuKb;n#fGsgk!pgjdE?59o+9ar80IUzqtYjd(a{Gee3BR)5P-rbiMb6) ze3BUTz7U5`5~Iq2!Y7GQ4+a!INsJDxK;e_bsNVt#pCm>-HBk5@F*+&&g-;TrqXkg- zBr)o(fx;(=Wx_Y2#wUqU?+X+@NsNw@K;e_b=+FfeK1qy@CP3kn#PZ-9wcwM)=#U8% zK1qy@VnE@O#HfV)0}N zVUF*toU?2GL&UYP0E7Ezun>c{(cl~m?xexF7`%lBufX6a4F)i{n+C7O;H@+m#Nb{U z3}J8&2H%3~JTOKmqdEO0P;0R3gChogzV#@qBmkK#J?%k`-|?$MuF@GT zuJ#=dOcC16g#7BR`gbbaQ=)I?(SxX_TU-AQ(MGi2YPlP*2BnE7)j$)y@fsN1F%lTu z9DuvLeZ4BZ#(GWQk9a2)E*G(j$YqRE)4aLdrPDe%x8$k5(wS-Fp>PI5nKs=Fqpw&F*qf6g50Pn%W|jO zKQ*~5cgj62a{r3ASPEzdwA;0V+8x@H@ZVYOL+zK^pJ;{Jjt$f$bc1qf)5Q36Ht7mW zlV0E40SyXG+7S#a2?Uoe2#$t^5hHw{EpOC_6*);+}%)Epb*GwblRQsaF53 zQ1wO|Kv!aY39CPM107c;j;9J>;REP>Pls-=owL>Sqp1R%TYB|UUeC5qgdORzxbn6I=?R7ud*_6S^nti?)`D~rkv?p6;)lBE9C^HpTF7`8od=J1 z(W&xy7xl8^U35A;-bH83<6UgZ+eK%^>=E*#ImTM5mxYBJpqxoa|&T_i0^(t?`klMlv~-+Gm7MF^r3^ilVhOTUYunimN1hvLfb zy#92*5N8epyE=B$F>Usg7_`d&n!-g3_-CW_vDj2=nk*mnahp2qOSGw9T=nQ`)28~srXF2g z{v6m8vd?Q%D(;Or+Z4hoVRnMSWz2doSY>ionA}=nQ%8M^rNy?kG{=Ay!bpzCl?Q#! zHkC(hYBn_fA|d{8TsiKWYEyKGFsy2>Ezh%b*h0JdPX|6))-O`ovR3>NEbA(0EQxxn zITp*Zd8;|H>seu0Pff9`OZQf@;|eHt^i~MV@KzW!ycGrwZ-qg_TVc@jR?qriac65y z)3Qu&^$5%$l313Lw|X?LeA~gYHiCsXd#jC_legNarMkBYhl7sOl8f?ICD0($rt~a} zO?7Z@RV_<;mh67rN3z)n7(<&c@M-jW`_ zI;!j~{K#SC%Zw|aFo%wO#mwUX2pstc!s!s6=XIacXtrHjE!@asapeu4lI}E;6;ZFV z7@FO5Qjfz1q|fh99LdUdu!J_v-C8g^p$d1tk?U?-;3Ohc-`X1^$P!Xo7{q*8IT z3s+SB;r2t1AkN(ElHMSBd{5BN_5|7H-g))}*`{IQp5O&;1V&}dQdZ7^S7MueKL^v) z9~qeu{F3Td)6|Uo1s?LjR?n?+;Dh5XZ{eS3WasblrGM_p`8TN}>%)F^xL}uS$L?$V z>TV|EacR%MjvgZ_)~nl4sK0RMJLGjZQi07Lv^s^JD?#8jyhV;r<2=PUu91!78rdpL z3}JQ(;&8SDyMzBNb_b_(sS~c$tTu7c+k-Bg+2+QvRSIeU24_I4iS=(6noBe5-x$MdRnBFPIu}qWP6a4UNVo zBC1KJX(`4VOpOd9<-R5~{);bD$`)SePvgqFa6za*dqR5-rXl6p$FO#lw3oH#oc0;6 zqmF48>@(1E8~Y5Wrg4EAuC(qTiUqFNXo$dDv+NyMz5IeU8&1TPfAuLDrd!5w{dd$C zzN_tk8Jw)0gcawV+JD-%mL8kVI?%!v%jbJbd>6IGwh@UXke~!trYQRAx;nZC?7TDf zL5iYItn=zAbuPmm#pPP-A8I3A^!yF_y9E1+Ur#w(uU@*q_C^`)>61l;m<4fRYrJ4nSsUFL(eN)4p%nbVz-_w*0c5 zSX1$n z6qfomv$PlC*A9qD=@W6~17C)8g?&)K4^ zA@_0Rtr{7kWzT*;$z%J3V}9JiR()#P7r*-R+sfA;BzV~7g9F^1_b*)egkQb&APIj7 z1Giw*u(r-&54$j~fW~~M(_2I}m+cf`@G7>)g~4)@TWNBu#jetR|59nGaP8)y>`c02 zv=9m(6czMjT)Eq?WGUKDZKDBhwA5%%(+PYk9j%rJt%IQ0V!~gvb6TC$YL98zq9*ux z^I@ogUuqa9Plm zY)CL4cvr2aK=z*SlWb-_<7htg^#6-rJ-6tQ2poK{)BmHp;H37ENX4^oB7*Flj)s#T zS3nm#{75+VM?7WraUMmdegdes{MU|L_!_GkFL6s~KhI2BmJn6R{ znXuZ$lh+h9oAQe};}SJs770z}JqJFT%Rd_C@(*ARfa&FlZPE1`PwjpkW{wG!5iM{}O45sD|?!$XDaa_mUXMy{YF{Dlf{f znA-v9DADE*Br%YKHUpt=6pVM#D=On%Zm3%cJxDnQ&_Ft8ng*gLc#u6ZM9cm&ep13b z$Z0f?G&O(gSr~@As(;rn&-GQUb$Rl(z*&?l7Y3q@iu=J47>KIY;tirbRcqlIk+zO` z9T!>kkLSKu1=ovqViMP=$F2PU;;SS)z8b=at(fX27m55IbL0ZY`8)Ih^a6KLTmd+x zPA4>2q}j}|U{GW327~p&-JC&pgXbyi^cJh*&mV`=Ta?PMNNLgvI15$i=(PmubB%C9 zUyCbozjCE{Kwz3=4i(P>@j@Z~^|ZrMv5x%l1%dx<08d@+Nb z=&~0x=vyB2#f*hBP~c|zx<(NOhiGsn28U^|7=t4;I17X9^mjG}*-0^dPlTQRCY}lJ zpvmZaBJ@R)w{DOnz%8rrmQ_BXSMzRH3ra_!TLnA)s=sj(-ug&u%~UC-x%mJ70#AW+`&_#eS3^`C4NTyx9;!0p*`t4pc9^qp9{XQ#9!qO$;;YlR z&s!0)Sr*^tb@+K-hglR_3%zPMH?Gi%!Y<1WWU*vVL6>!*9e7!n#b6HY?g|DEijI7b znlI(UY33{1IqhEP(EEfLJ{?yMs!FD!?W6YqM?{X##FfKv3hy^_#If}+;LQ!1V~&~Q zJes2ibKEa-yic7ESI+EjSWHZ3GlZ?%?R;Iw*VCW)ibbkIcYMd|6^`}( zNv~EsoHCYjvF}z)=K;8LT{|BkKW95ap3Zk~oKd${IldEu?n?&;)+HR+vvK8!n&HWS zZHB4W6P|*@K7Q0+s(oZ!T)-pfQW$A1hoIAZoLdpL4ielueMXOSlNR>kj&pI>9G3te zYVT?hFo`l@63@kzV=BJPa(SDC^+wNU-XxL~_R>rOPy6qITMoG!+%PGTCZ^XZTZ<-! z6PyR)zxv=X>5FLpLD#kS!uu7OV8cJs9)wprzM$O|G2W-5n;g?SsV#Rr&^ITw;$Nh2 zC|_45Hp+MxTaia%^rsPwh0MImbRjcOPJ>@`Fcvaj`D`v^?3ax%aUm0c*Eq4F%w>gG z$eK~t1BrEL2T?i;KhSZ33z;mKDZ)aA zohe3QRY)2OnFW{WLS})S4!<5}EM)%bv$>F|Dz~2XUE)G!eq5my<*<-JJ1`b97&I0# z7&I3$FBuD&cVQuO(6*3yKCb-8aUt^p{4hw8g$&JR24n!QX~Unfkinq2ka;!L7Bb7N z7en||;qo|4Y3$`E{BDT4LP^*ls}PiM4faYb1-2c^PRZz<4a!1 z1i)vd!ad-M<<>#MY&p7+F>l76XCWg>av3aSk`KFiRW`equO7-3of~s?f#jrT;#)qh9*Y zFMwX$xxaY5^q;YI)QdmvEyd{1gv9ViLZle|MfVu}J@?prw|9fkgKrF1g3@KaH~0JWZsE&5cHU&)j&{#2CX&rSjI(oaP>{RyR$v8A7ia{P%9 wKwkE#D93kFKzZ;}QI78|fO7h-{2$%U@pd~XufWG2T{&K3mQJoL{lVn_2L|Ys761SM literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_int.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_int.r51 new file mode 100644 index 0000000000000000000000000000000000000000..56da32dd8524e0ad72fd16d42e330867e57bb2ad GIT binary patch literal 5001 zcmd5A4o5#HVROG=`CNLoL3VJ0>ZTe2CFlAawSfT16{7R8tXrO-cR@<5S~(u=4^ znWP-4i4miR_TFA=AP9Wu%_@=}QXoL%wqhH&sZrS_e5hL>X%8)0z|Aceb!L~3Qq;%? z!v`IcS|L}&)%U8z;f zs{MTwWl;lHLh$c0O>3=YIR&d=R%^NZ5@344uIA=TV$-7l^qFRrI=HV$eFU}flHxw15GIr+tq5sqX}M@FMr+sS9A<7cw5 zNGuAECLFzY=cBLgeA4*Oy*rK1KK)}hGGb1~UrT*>_uhX$`ufhlvJu0)VlRwa*2lL# zyqlevh>Z?M%#uBy&6k&#%T87%Ub`&d@FLX*d|gWUmkRM>C={$>HN42qym%lW*KFcx zhDSKxgkIf&T&^G`jOvu?gfZ%o7~3Qr@DRW?L@~{Iy9P9{H0f%wvPpc5avB~t`gfCb zN&?VK({3Vi3z=^sN()(OA}Ui+ElBZj+a!KXAP^DF04y(Wk}h4KI%sb)c6cN%3KkY~ zU{SYM&>l{k6%_NeNjjEp1Xp)QOLD<-tcslnNuSt|hjRfXI|UO+ z!gf3bz}POK4vaVU?BJrbHi{H9rk2rK2*cdz>WEg8oG{Y{y` z|H49?Lj7Mte~`*ik+!@*;K!^MEj-!Bk214o3X z0s{htJP{~Xf-TZbsjr#d&7*CR9?GEd@KA8iyF~(2f(#U3tFRy}1I$BWr`{l}0KBIR zZIM2z26<5s^Imrkq-`oL_SB zPGnWjRxEf#Fk>j*gBYd~@TQ8zeOP5=?M7C;$?ELGsUjz&9n?j^`MLuIY(Eop zz=bdmc2r=>(@#}s!NdYQWtv#@Q%V!IpE8m+85m!j2-qa!uQrLq7yGGw{_uV>9+1=cLrk*UbiG+xm$aI z;vPj9nimP)(6%DZ5`{s^FG_S5NnDMhBLj(*z*R~T<)PpTkh+YEiE03RmZ%H`@v3WL ztANp~iP}(bbq9Q#E9p&K8&uy0lnB*pgX+~5m3o<`A}qydiqe$KQW8t)a!Qj^VL5eD zPN^)Vu#`bl9y#TeQ*H8Z={U&#Or1TKHpebZ-_TxY8;3DIX-=dj2l_vU@bW1bpRFb!H)Z(9A=chx;rHJLQF)pZ2IOyWg?EAz6A&9$yg`)xIo;}@ zA^QfA_viE>2Q;iJz^U!aDZ8d~E4V>@F61wOa6|b8g`)OrQKER33bWf#H8fU+uAzLP z>ZE%EUfUSH=ey^mpK%F7cb%8p1Tu1k3pP}h_%Hm;nPLcU8D3bV;Vt@6_O6|6jb0@Oz0VY7{JQ}ehY^4CqhZvvCf2I!y#{Iw!B)&1CdO;HWPxzleD_MeFF^M-o8mz z9GK`=uDr>u{pnPl2LyMN!o8s|+Gu%W3%oH9bG;GRM!WRj1*lW-f%Jt6udF;a{tDhW_@i2{_g##Rcl<|%KPUzR!z6?^3=Ght zx*MT=*9hY(djWdfbYwe}gwwcJPPZ>z8AYYwC4haF;)ItQ3%x=+FKgf36XVN)_Qx zUQPzcp_UT|8p>DT#9rf{;KsihKYl(!(TF^a^Y{l}o!?+}8O}`V{En*g*sAl}$mn?k z7s$=%K1HWh4JO8tNnQ=ykEL%Z36GRFdDXmC=hx9QSI#TVtvbJ(pSg0LWw+{3-wAo< O%6S~$I{W4O+y4VcaJUoz literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_led.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_led.r51 new file mode 100644 index 0000000000000000000000000000000000000000..5ddfc26b04f81a0f8fd34cab200091abd6e5c068 GIT binary patch literal 5369 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_uart.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/hal_uart.r51 new file mode 100644 index 0000000000000000000000000000000000000000..1d89472cb304d811940e9092899f257bb5756bde GIT binary patch literal 25779 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 C8WVv4 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/rf_set.pbd b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/rf_set.pbd new file mode 100644 index 0000000..c239902 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/rf_set.pbd @@ -0,0 +1,19 @@ +This is an internal working file generated by the Source Browser. +22:13 07s +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\BMA020.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\basic_rf.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\dma_itg.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\get_adc.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\get_swsensor.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_board.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_clock.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_digio.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_int.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_led.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_mcu.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_rf.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_rf_security.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\hal_uart.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\rf_set.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\sensor.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\A°å\Project\Debug\Obj\util.pbi diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/rf_set.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/rf_set.r51 new file mode 100644 index 0000000000000000000000000000000000000000..ad90e511fa09f4278fd8ab58ddb52a3d0b09585f GIT binary patch literal 21741 zcmeG^YjBg-mG^!RJwDr#pI{6DVG{y2IFf9CJer31MUZSPuWU@h7=J4y*%sImkz~M- z1UIiHP1>eu+U*0kdC))o(S=EOvguBy32E_!CR<8KH9NbLVP^BEo1L9(nr&tu6ZV{Y z^?j0z1TFzNndvvyckempKF&G!+FNCt>F=pfSOW|#9# zLdbIX*)?roI*|-d_D1%_1Mz7%{jVo}U@Bos&n zw0IaW@jx_*>FeNE3h85^ur>*=34l%e0?`BE5R$79L~=X~G5O#`AQDCVGWbC@R-T?s zo(ROp!bq)wUkOkTCgWNnaul-)E)^*b_?2r~_((Dw4TVEmA{huC0GuThNd)#y@JiPJ zqE^!;V!;4%u8qdxCC>&34 z9Z;8_{QeV@xwCWYaDO~D77t81wnrwy3CFr4o7MHho_4>3D>pIR4aJ6lOULe5{J_3& zG&t^1o1Md(oo%k+NHjRS;|7!woQUij?(N<>>~^|c(8kTK^Jjkk$1|^{{^R_a)VbGx zJM3)Ly1IAzUV7{NM?e3cGan2)Rc%jXtRozL<>X6m4R?0B+gh9&7P2pphy>%K!`>TG zSS%0^4fouLqJpu>$yju_{kqG7X4)SPCO?Cg^b!)`Xaa006hAavPArLJ2n@D)TyRr+ zi4glwO3Z+Y!~oN}%vLVPS};uu$w1IZvzsW97;lBhDt3XEP+CD~xhO#TQh4=A zgZ^FJ&^`O4zFob&#JcWKED~}wu6OpCwzqqFyStDELx-nt(C_IR@N^QA3jz(~g+>8m z?&hV9eG;(XB2vFgbF#Rb#erSGx3G8%i?_0PYo9Q%o5kE`Nf``sF!T^v z)AmJ@08;}_jKkHFFr4D}b(Yvgjxd8rX^doG_N6hhfjOAQm;@6R1G(66ewI|3 zIR;dd9^hk>XGyt*V=Yj6I$@brWLbg3(ExB%p>WvBU@eZ>Y$c*4&E@#iSokcdEaeDA z(-6T^Rg@Vy$HLKYJQ9SQHeMl{E<%{o&J#gSsE$oBz-&1$4wz-d;lu;j3Z@#IG?J0% zv^F{wg%X!nipUD7(zF$ugH@{t*PO8%Ak$d9GA{jw}j`a z%)#R{1r1xdloQi(@OtdETsUY35Y7$Bs+MsK$iOgMQ`L1G3-b`iqQLKv3QBG1=`$_b zJEW2dFtamL(B*xHR8tXVIF2+XZbVCfW+suD&k-#Hdfqhu4ymQ48aCIg8I;tGAnuFtkXf!;bBdZXpz)bHC z-!~ObBz1fZ;!D|3=^yPJ9n%a-HBw5_6i+l_5SAgKJWcS2gW<@burHchAPjdqgHyW$ zk>svKANJ^?JPCg|5SrF2<@(7{<5J9I z%jI8B&egsx9tKN?ROU=m7`U=LIC~zPB@eDN53VE+PRWC_B91rXwvH~(K!5vS=MJ53 zF6OolfA^q{;?1A6dhE^Zrg z>IkkioEAKT+C5$EgYDWLowfuMmvzRXqmeQHsFvM;^Ax%gh2S<90h5ZrtT=Ws64MKs zm)e1;E3k0Of$+2ziXAr0Y+lNGOv#ln5g8jd3}jxiHJA)$1#n;|!Hq6Z?OII5HQgIS z4}KyNJfNp7!Q4W>ONV)-{jM&Le?H37*FPUM(A_%^<<3gQIm4MxPh?<>`V5TwiZm@( zU|O%hv|WKQh8LscO?nzGo7S#n#N}$a13FYV9t}*~sVC(oknU965c0yOa^n`)*qxT7x2X7f%rnvOyw&D0V5wD&L;5QZc^}X@P@s53VH4uB-bjs>`yisc z_czi9AWX~rIIS)P_T5f> zPQfQoAEiD?@QH%YBKgdcuUYbKlzb+^CksB6`mB;qk$ff6uPNI8)24y#eyzRl*8)Nx z>yU`hpL9q<=o1~15&AR@^~{tsnA3Ab&rE4nyeunj%Zl5x;^kTKimZ6$>XMH3zMk$b zt<%@l-7`}?4_-14uAK+h&4W#AOdd8l_RN?YO#SJorNP9f%$^zR8jHs_)a~zWzqe;b zske0Lz;ji+D9zsuw1J-IYUaU9=fTV7!OL^ti{}LyOvECS+a%H`l8quYDyBxQZbFV< zzWh(GiOo(IaJ##?^Ij@h2PzLXQPU7++?)=#P&0#FPCeq% zBW^v?qDNZwNE;P~I%o%N7l9e6tH0L?uN_Xo4}UJf?-u+mg1=Spw+Vh#@NW`^oWhVx z7;+0kEy7T%Fw`atslw1EVW3~?AL!qKuU;8mF11{`2NCeA~+ zMOfS6xqF9&#d>|ag~oO3g^f)c#OB+bE^_e>flwKDl-%@qGc4pvZxdJ0MzTWKNLGof zBy**?%DmKEYhGrqGcPx?8#m6B6XTHR?*Q#7g^DD6RT5ZqR1yZN8*v zF?lUSpQ6fVUR^;$pMAC%RshckVR(60R?T0WF|lsnI#7bG#Zkb09j;~94OEVx~wb-K)BbP z7N5xl5NkmoH;PfNsFp%J3%WnOF0a zrot(iaFD8jr!*H%$%KMbxAK&h!YP?xkm@#`(posBuAP;<&;7)1B9*5gmyN6^0`BFY zOk$xC3W+p5oN+}8y1lGR04*hd&u%8=%nl`eAX^Uvp14-;qm9Q{;_nEQ)Um|1`pDA6 zDNkl7`UtjxQ=Z6BBrF)7jhymShN4%k-VfxI{7rBa=^M;xrYsX@P&b~<<1E#S_8PJp zDRx1(4#!uqq?G(KP*cSzn0jr*4ebxeYpRJ!Y!{fNLmBl?@RD8z{n$>yY+xf_0);Q6 zqqAiDT5c`xLxI*);4s?A zI1%d7)?&j#N-TaOxxyoL!+esyt zP#++^{1hiWXSb0GR+Bzn69TR;wAh>SQnEakLUCD?lHZbR$t}4QwhBtgrxj3DF2#mR zk(B%!c?qeT!#c@(3Jd8RvrB+5q;t%E0m6{ZF(U&ALpsN-9v}?q9P2OuVMzC~apS}s zYg9mDXds!20EwZ2v;lxjU}zwjUfwI2!%)!6WO{^@7#b;=%>xoclb(_d3KwC2b?d4Q zoAe#2!zO=MzRxE8zQZQI`!4JgLI07DR7|XgN@010y@`eIZV@1hKz?GU7HSbCDn4(o zX*5;-)rUXo4B!954G@Acdq{ttJB1Zg-OLKq*VKpL_b`e;&cknIN@l81pB_Q|3bQ{@9DVHI(-E6W zI%1;^IMN*pE9^9LtK&1Dw&|xq8yvlnXn3omwZ)-024Yk3AOJgkLk@hp`Um|R8ge#X z98C^4Y_QA#kC!jcl7mr*SoZ8ulj>#lL-j=n34~k-spvwqE?9`x{6Z`j%$ml4@ z!27{0*`prIux+^yc&FGgXaH8zm&X~50@2V-)sNN6y=>|%x;bsmGN&t; zH;%UoOK@I&SUnFjg|HVV1v2}1k&R|cHvit8{WvMG4U#WsS6<6(l`rQU4_c2`P%&2F=a z>QS{?Jq8YDyp}ieYn1t4m-MGr=e}t*(Zcz+wcvxJC8kHs^GTYdI*o6T)@{(Fqy2HOmR{ z>Q2aE0SJQlJ3Fm_EgbP}`?9s(=Ub$Vf6*dYB;D7zF>$LhVtW%k6mT+crUUVp3a)u{ z_7@c`zKX8!bJwI~)*aOg>bGDb{um}=3hvUPOvIb>FWnb55nq7i++y>8EqCu~j>H9+ z;1-$xE!iI4pX&%+P`|zC{O8PBdED)*>Ho~)+y9nq$LP=1|Cz(-T(@Uy|1!(}UZtorRTNA+Q=V#1v-iy~IIA62A%e?NA6 z*&3ce9ItxCBrdmR)D_$)ttA0$G zKx+H;GP}9Hnk5_$wpx`@W$gIt=$cA+M+Mh2{A>~;3qPBLGlFzt<7j;TMINjGo|{_% ztN?Cq1?dX_H%~>d$$E1ofXg^v@CsmgcXK6xTS$c~fCegjMnAtFC9|XRwJ90K z1PA)L?ApU@(Z}iRErXni-uULI@QzdE2wXIPU9#^NdwkA6yXSmpb2YBn?UUlGI_IFp z@CmcO_bJTujB0216P_Mn_giMaQDl|7vmKJ$Lje5jB;S_nhlZ7RrR0CJi_1jV7h4?e zTe2tgg>iog4qrt>g6@<&Q(h*>YUK#Ko;drhBI~~;|AK;j)K$=GJisoycRBlPk=b?S zcmMQ{oeFXc8>>%`uv=k8A5?N!&b1Mp?esTVd5wMX_%3YQ3*Z~i=$614UA1BA+f(wt z+gHkXxWlKUA|E%pT-j^S+=ehde9PAaNp%(5#HQ-~ob&W;m10k+uIwpQ=ilGDp~2uj z-yM|)GCVKr63&l{-KF!2)dsh4GIABXfpZiNM)~O{@7%MC$$ZAmNngboFg~EZ%E07V zydIwIIOqn&?>8>6hnM8^@Vis;M~m9S-PyB4u0Vz@sNN!wSyT$v|#y@4q z=f)k&@cj9733ZyGj|k7Ha*-U6QHH;hThlal|>zEZ#oQH!(ja~<1O zmq3DtV6TnB4X7CpJagb8MUJh8NCmb)B4BjxNIuFPt6Vo!s`g Hbou`Q-#b;@ literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/sensor.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/sensor.r51 new file mode 100644 index 0000000000000000000000000000000000000000..64366ac8afd304adff2cb2312920d6aee3cf81ca GIT binary patch literal 19466 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/util.r51 b/Zigbee无线通信/Aæ�¿/Project/Debug/Obj/util.r51 new file mode 100644 index 0000000000000000000000000000000000000000..2de530d2263e1f41f3832f67a45b7e9c12ccefa1 GIT binary patch literal 27059 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 XGiY>=3D7VU$9?c5I<5Ws{hR*>9*8T) literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Aæ�¿/Project/rf_set.c b/Zigbee无线通信/Aæ�¿/Project/rf_set.c new file mode 100644 index 0000000..09846cc --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/rf_set.c @@ -0,0 +1,144 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_int.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_led.h" +#include "hal_rf.h" +#include "basic_rf.h" +#include "hal_uart.h" +#include "sensor_drv/sensor.h" +#include +#include +#include +/*****µã¶ÔµãͨѶµØÖ·ÉèÖÃ****A**/ +#define RF_CHANNEL 25 // ƵµÀ 11~26 +#define PAN_ID 0xFF //ÍøÂçid +#define MY_ADDR 0xA1 //±¾»úÄ£¿éµØÖ· +#define SEND_ADDR 0xA2 //·¢Ë͵ØÖ· + +/** +* ÎÞÏßͨÐÅʵÑé-A°å +* +*/ +//LED & SW +#define LED1 P1_0 +#define LED2 P1_1 +#define LED3 P1_3 +#define LED4 P1_4 +#define SW P1_2 + +//³¤°´±êÖ¾ +uint8 Long_click = 0; +//·µ»Ø°´¼ü״̬ + uint8 key_down_status = 0; +//·¢ËÍÊý¾Ý + uint8 send_data = 0x00; +//½ÓÊÕÊý¾Ý + uint8 recv_data = 0x00; +//³¤°´¼ÆÊý +unsigned int time = 0; +//ÅÜÂí±ê־λ +unsigned char sign = 0; + + +static basicRfCfg_t basicRfConfig; +// ÎÞÏßRF³õʼ»¯ +void ConfigRf_Init(void) +{ + basicRfConfig.panId = PAN_ID; + basicRfConfig.channel = RF_CHANNEL; + basicRfConfig.myAddr = MY_ADDR; + basicRfConfig.ackRequest = TRUE; + while(basicRfInit(&basicRfConfig) == FAILED); + basicRfReceiveOn(); +} +void initial_gpio(){ + + P1SEL &=~0X1F; + P1DIR |=0X1B; + P1DIR &=~0X04; + P1INP &=~0X04; + P2INP &=~0X40; + P1 &=~0X1B; +} + +uint8 key_down(){ + //ÅжÏÊÇÊÇ·ñ³¤°´ + if(Long_click == 1){ + //ËÉ¿ª·µ»Ø + if(SW){ + Long_click = 0; + return 11; + } + } + if(SW == 0){ + halMcuWaitUs(20); + if(SW == 0){ + time = 0; + while(!SW){ + halMcuWaitMs(1); + time++; + if(time>1000){ + Long_click = 1; + return 22; + } + } + return 33; + } + } + return 0; +} +//ÅÜÂíµÆ +void light(){ + LED2 = 1; + halMcuWaitMs(500); + LED1 = 1; + halMcuWaitMs(500); + LED4 = 1; + halMcuWaitMs(500); + LED3 = 1; + halMcuWaitMs(500); + LED2 = 0; + halMcuWaitMs(500); + LED1 = 0; + halMcuWaitMs(500); + LED4 = 0; + halMcuWaitMs(500); + LED3 = 0; + halMcuWaitMs(500); +} +/********************MAIN************************/ +void main(void) +{ + halBoardInit();//Ñ¡ÊÖ²»µÃÔڴ˺¯ÊýÄÚÌí¼Ó´úÂë + ConfigRf_Init();//Ñ¡ÊÖ²»µÃÔڴ˺¯ÊýÄÚÌí¼Ó´úÂë + initial_gpio(); + while(1) + { + key_down_status = key_down(); + if(key_down_status == 22){ + + //·¢ËͺôÎü¿ªÊ¼Êý¾Ý + send_data = 0x1F; + basicRfSendPacket(SEND_ADDR,&send_data,1); + } + if(key_down_status == 11){ + + //·¢ËͺôÎü½áÊøÊý¾Ý + send_data = 0x2F; + basicRfSendPacket(SEND_ADDR,&send_data,1); + } + //½ÓÊÕÅÐ¶Ï + if(basicRfPacketIsReady()){ + basicRfReceive(&recv_data,1,NULL); + //½ÓÊÕÅÜÂíÊý¾Ý + if(recv_data == 0x1D){ + sign = !sign; + } + } + if(sign){ + light(); + } + } +} \ No newline at end of file diff --git a/Zigbee无线通信/Aæ�¿/Project/rf_set.dep b/Zigbee无线通信/Aæ�¿/Project/rf_set.dep new file mode 100644 index 0000000..be4bd15 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/rf_set.dep @@ -0,0 +1,524 @@ + + + + 2 + 37149274 + + Debug + + $PROJ_DIR$\Debug\Obj\sensor.pbi + $PROJ_DIR$\Debug\Obj\rf_set.pbi + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.h + $PROJ_DIR$\Debug\Obj\hal_board.r51 + $PROJ_DIR$\..\CC2530_lib\common\hal_cc8051.h + $PROJ_DIR$\Debug\Obj\hal_rf_security.pbi + $PROJ_DIR$\Debug\Obj\hal_led.pbi + $PROJ_DIR$\Debug\Obj\get_adc.pbi + $PROJ_DIR$\Debug\Obj\basic_rf.pbi + $PROJ_DIR$\Debug\Obj\hal_rf_security.r51 + $TOOLKIT_DIR$\inc\clib\stdio.h + $PROJ_DIR$\Debug\Obj\hal_clock.r51 + $PROJ_DIR$\Debug\Obj\hal_mcu.r51 + $PROJ_DIR$\..\CC2530_lib\utils\util.h + $TOOLKIT_DIR$\inc\clib\sysmac.h + $PROJ_DIR$\Debug\Obj\basic_rf.r51 + $PROJ_DIR$\Debug\Obj\get_adc.r51 + $PROJ_DIR$\Debug\Obj\hal_digio.pbi + $TOOLKIT_DIR$\inc\ioCC2530.h + $PROJ_DIR$\Debug\Obj\get_swsensor.r51 + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.h + $PROJ_DIR$\..\CC2530_lib\common\hal_int.h + $PROJ_DIR$\Debug\Obj\hal_led.r51 + $PROJ_DIR$\Debug\Obj\hal_mcu.pbi + $PROJ_DIR$\Debug\Obj\dma_itg.r51 + $PROJ_DIR$\Debug\Obj\BMA020.r51 + $PROJ_DIR$\..\CC2530_lib\board\hal_led.h + $PROJ_DIR$\Debug\Obj\get_swsensor.pbi + $PROJ_DIR$\Debug\Obj\rf_set.r51 + $PROJ_DIR$\Debug\Obj\util.pbi + $PROJ_DIR$\..\CC2530_lib\board\hal_board.h + $PROJ_DIR$\Debug\Obj\util.r51 + $PROJ_DIR$\Debug\Obj\hal_clock.pbi + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.h + $TOOLKIT_DIR$\config\devices\Texas Instruments\lnk51ew_CC2530F256_banked.xcl + $PROJ_DIR$\Debug\Obj\hal_digio.r51 + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.h + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.h + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.h + $TOOLKIT_DIR$\inc\clib\stdarg.h + $PROJ_DIR$\Debug\Obj\sensor.r51 + $PROJ_DIR$\Debug\Obj\hal_board.pbi + $PROJ_DIR$\Debug\Obj\hal_rf.r51 + $PROJ_DIR$\Debug\Obj\hal_int.r51 + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.h + $PROJ_DIR$\Debug\Obj\dma_itg.pbi + $PROJ_DIR$\Debug\Obj\hal_uart.r51 + $TOOLKIT_DIR$\inc\clib\string.h + $PROJ_DIR$\Debug\Obj\hal_rf.pbi + $PROJ_DIR$\Debug\Exe\send.hex + $PROJ_DIR$\Debug\Obj\hal_uart.pbi + $PROJ_DIR$\Debug\Exe\rf_set.d51 + $TOOLKIT_DIR$\lib\clib\cl-pli-blxd-1e16x01.r51 + $PROJ_DIR$\..\CC2530_lib\utils\util.c + $PROJ_DIR$\Debug\Obj\BMA020.pbi + $PROJ_DIR$\Debug\Obj\rf_set.pbd + $PROJ_DIR$\Debug\Obj\hal_int.pbi + $PROJ_DIR$\..\CC2530_lib\common\hal_defs.h + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.c + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.c + $PROJ_DIR$\rf_set.c + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.c + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.c + $PROJ_DIR$\..\CC2530_lib\common\hal_int.c + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.c + $PROJ_DIR$\..\CC2530_lib\board\hal_led.c + $PROJ_DIR$\..\CC2530_LIB\board\hal_board.c + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.c + $PROJ_DIR$\SENSOR_DRV\sensor.c + $PROJ_DIR$\SENSOR_DRV\BMA020.c + $PROJ_DIR$\SENSOR_DRV\get_adc.h + $PROJ_DIR$\SENSOR_DRV\get_swsensor.h + $PROJ_DIR$\SENSOR_DRV\BMA020.h + $PROJ_DIR$\SENSOR_DRV\dma_itg.h + $PROJ_DIR$\SENSOR_DRV\sensor.h + $PROJ_DIR$\SENSOR_DRV\dma_itg.c + $PROJ_DIR$\SENSOR_DRV\get_adc.c + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.c + $PROJ_DIR$\SENSOR_DRV\get_swsensor.c + + + [ROOT_NODE] + + + XLINK + 49 51 + + + + + $PROJ_DIR$\Debug\Exe\rf_set.d51 + + + XLINK + 49 + + + + + XLINK + 34 25 15 24 16 19 3 11 35 43 22 12 42 9 46 28 40 31 52 + + + + + $PROJ_DIR$\..\CC2530_lib\utils\util.c + + + BICOMP + 29 + + + ICC8051 + 31 + + + + + BICOMP + 57 18 13 38 + + + ICC8051 + 57 18 13 38 + + + + + $PROJ_DIR$\Debug\Obj\rf_set.pbd + + + BILINK + 54 8 45 7 27 41 32 17 56 6 23 48 5 50 1 0 29 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.c + + + BICOMP + 17 + + + ICC8051 + 35 + + + + + BICOMP + 57 18 21 2 + + + ICC8051 + 57 18 21 2 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.c + + + BICOMP + 48 + + + ICC8051 + 42 + + + + + BICOMP + 57 18 33 21 13 38 + + + ICC8051 + 57 18 33 21 13 38 + + + + + $PROJ_DIR$\rf_set.c + + + BICOMP + 1 + + + ICC8051 + 28 + + + + + BICOMP + 57 18 4 21 33 30 26 38 20 36 74 10 39 14 47 + + + ICC8051 + 57 18 4 21 33 30 26 38 20 36 74 10 39 14 47 + + + + + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.c + + + BICOMP + 8 + + + ICC8051 + 15 + + + + + BICOMP + 57 18 21 33 38 20 47 14 + + + ICC8051 + 57 18 21 33 38 20 47 14 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.c + + + BICOMP + 5 + + + ICC8051 + 9 + + + + + BICOMP + 57 18 33 38 37 13 47 14 + + + ICC8051 + 57 18 33 38 37 13 47 14 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_int.c + + + BICOMP + 56 + + + ICC8051 + 43 + + + + + BICOMP + 57 18 21 + + + ICC8051 + 57 18 21 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.c + + + BICOMP + 23 + + + ICC8051 + 12 + + + + + BICOMP + 57 18 44 33 30 + + + ICC8051 + 57 18 44 33 30 + + + + + $PROJ_DIR$\..\CC2530_lib\board\hal_led.c + + + BICOMP + 6 + + + ICC8051 + 22 + + + + + BICOMP + 57 18 4 33 30 26 + + + ICC8051 + 57 18 4 33 30 26 + + + + + $PROJ_DIR$\..\CC2530_LIB\board\hal_board.c + + + BICOMP + 41 + + + ICC8051 + 3 + + + + + BICOMP + 57 18 4 33 2 21 30 36 + + + ICC8051 + 57 18 4 33 2 21 30 36 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.c + + + BICOMP + 32 + + + ICC8051 + 11 + + + + + BICOMP + 57 18 44 + + + ICC8051 + 57 18 44 + + + + + $PROJ_DIR$\SENSOR_DRV\sensor.c + + + BICOMP + 0 + + + ICC8051 + 40 + + + + + BICOMP + 57 18 33 70 74 73 72 + + + ICC8051 + 57 18 33 70 74 73 72 + + + + + $PROJ_DIR$\SENSOR_DRV\BMA020.c + + + BICOMP + 54 + + + ICC8051 + 25 + + + + + BICOMP + 18 57 72 + + + ICC8051 + 18 57 72 + + + + + $PROJ_DIR$\SENSOR_DRV\dma_itg.c + + + BICOMP + 45 + + + ICC8051 + 24 + + + + + BICOMP + 18 57 73 + + + ICC8051 + 18 57 73 + + + + + $PROJ_DIR$\SENSOR_DRV\get_adc.c + + + BICOMP + 7 + + + ICC8051 + 16 + + + + + BICOMP + 18 57 70 + + + ICC8051 + 18 57 70 + + + + + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.c + + + BICOMP + 50 + + + ICC8051 + 46 + + + + + BICOMP + 57 18 30 36 + + + ICC8051 + 57 18 30 36 + + + + + $PROJ_DIR$\SENSOR_DRV\get_swsensor.c + + + BICOMP + 27 + + + ICC8051 + 19 + + + + + BICOMP + 18 57 71 + + + ICC8051 + 18 57 71 + + + + + + Release + + + [MULTI_TOOL] + XLINK + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/rf_set.ewd b/Zigbee无线通信/Aæ�¿/Project/rf_set.ewd new file mode 100644 index 0000000..99972a8 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/rf_set.ewd @@ -0,0 +1,1281 @@ + + + + 2 + + Debug + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + Release + + 8051 + + 0 + + C-SPY + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 0 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 0 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 0 + + + + + + + ROM_ID + 1 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 0 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/rf_set.ewp b/Zigbee无线通信/Aæ�¿/Project/rf_set.ewp new file mode 100644 index 0000000..856ed0b --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/rf_set.ewp @@ -0,0 +1,2157 @@ + + + + 2 + + Debug + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + Release + + 8051 + + 0 + + General + 1 + + 5 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 17 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 0 + + + + + + + + BILINK + 0 + + + + + app + + $PROJ_DIR$\rf_set.c + + + + basicrf + + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.c + + + + board + + $PROJ_DIR$\..\CC2530_LIB\board\hal_board.c + + + $PROJ_DIR$\..\CC2530_lib\board\hal_led.c + + + + common + + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_int.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.c + + + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.c + + + + sensor_drv + + $PROJ_DIR$\SENSOR_DRV\BMA020.c + + + $PROJ_DIR$\SENSOR_DRV\BMA020.h + + + $PROJ_DIR$\SENSOR_DRV\dma_itg.c + + + $PROJ_DIR$\SENSOR_DRV\dma_itg.h + + + $PROJ_DIR$\SENSOR_DRV\get_adc.c + + + $PROJ_DIR$\SENSOR_DRV\get_adc.h + + + $PROJ_DIR$\SENSOR_DRV\get_swsensor.c + + + $PROJ_DIR$\SENSOR_DRV\get_swsensor.h + + + $PROJ_DIR$\SENSOR_DRV\sensor.c + + + $PROJ_DIR$\sensor_drv\sensor.h + + + + utils + + $PROJ_DIR$\..\CC2530_lib\utils\util.c + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/rf_set.eww b/Zigbee无线通信/Aæ�¿/Project/rf_set.eww new file mode 100644 index 0000000..5706dae --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/rf_set.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\rf_set.ewp + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.c b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.c new file mode 100644 index 0000000..6f60b91 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.c @@ -0,0 +1,285 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.c +// Description: dma_bma module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +//#include "hal_types.h" +#include "hal_defs.h" +#include "BMA020.h" + + + +#define BM(n) (1 << (n)) + +#define MCU_IO_TRISTATE 1 +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +#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); ) +#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); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) + + + +#define HAL_BOARD_IO_SHT_SCK_PORT 1 +#define HAL_BOARD_IO_SHT_SCK_PIN 6 +#define HAL_BOARD_IO_SHT_SDA_PORT 1 +#define HAL_BOARD_IO_SHT_SDA_PIN 5 + +#define HAL_BOARD_IO_E2PROM_SCL_PORT HAL_BOARD_IO_SHT_SCK_PORT +#define HAL_BOARD_IO_E2PROM_SCL_PIN HAL_BOARD_IO_SHT_SCK_PIN + + +#define HAL_E2PROM_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1) +#define HAL_E2PROM_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCL_DIR_OUT HAL_E2PROM_SCK_DIR_OUT +#define HAL_E2PROM_SCL_SET HAL_E2PROM_SCK_SET +#define HAL_E2PROM_SCL_CLR HAL_E2PROM_SCK_CLR + +#define HAL_E2PROM_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0) +#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,2) +#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define halMcuWaitUs McuWaitUs +#define NOP() asm("NOP") +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void McuWaitUs2(uint16 usec); +void McuWaitUs2(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void M2_I2cStart(void); +void M2_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + McuWaitUs2(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cStop(void); +void M2_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + McuWaitUs2(2); + + HAL_E2PROM_SDA_CLR(); //SDA=0 + McuWaitUs2(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cAck(void); +void M2_I2cAck(void)//µ±SDA=0ʱ²úÉúÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + McuWaitUs2(2); + + HAL_E2PROM_SDA_CLR(); + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cNack(void); +void M2_I2cNack(void)//µ±SDA=1ʱ²úÉú·ÇÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + McuWaitUs2(2); + + HAL_E2PROM_SDA_SET(); + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cWrite(uint8 dat); +void M2_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCL_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + McuWaitUs2(2); + HAL_E2PROM_SCL_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + McuWaitUs2(2); + } +} + +//------------------------------------------------------------------- +static uint8 M2_I2cRead(void); +uint8 M2_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + McuWaitUs2(2); + + for (cnt = 0; cnt < 8; cnt++) + { + HAL_E2PROM_SCL_SET(); + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + McuWaitUs2(2); + HAL_E2PROM_SCL_CLR(); + McuWaitUs2(2); + } + HAL_E2PROM_SDA_DIR_OUT();//cpu»ñÈ¡ÍêÒ»¸ö×Ö½Úºó£¬ÔÙ½«SDA¶Ë¿ÚÉèÖóÉÊä³ö£¬ÇÒÖÃ¸ß´Ë¶Ë¿Ú + return res; +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +static void M2_Init(void); +void M2_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); +} + + +//------------------------------------------------------------------- +static void M2_WriteEEPROM(uint8 addr, uint8 ch); +void M2_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M2_I2cStart(); + + M2_I2cWrite(0x70);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M2_I2cAck(); + + M2_I2cWrite(addr); + M2_I2cAck(); + + M2_I2cWrite(ch); //data + M2_I2cAck(); + + M2_I2cStop(); + // halMcuWaitMs(5); +} + +//------------------------------------------------------------------- +static uint8 M3_ReadEEPROM(uint8 addr); +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M2_I2cStart(); + + M2_I2cWrite(0x70); //Æ÷¼þÉèÖÃΪд״̬ + M2_I2cAck(); + + M2_I2cWrite(addr); + M2_I2cAck(); + + + M2_I2cStart(); + + M2_I2cWrite(0x71); //Æ÷¼þÉèÖÃΪд״̬ + M2_I2cAck(); + + res = M2_I2cRead(); + + M2_I2cNack(); + M2_I2cStop(); + + return res; +} + + +/****************************************************************************** + * Ãû³Æ BMA_Pooling + * ¹¦ÄÜ ¶ÁÈ¡bma020µÄX,Y ZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ + * Èë¿Ú²ÎÊý (int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value) + *BMA_X_Value£ºXµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Y_Value£ºYµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Z_Value£ºZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + ¼ÓËÙ¶ÈֵΪ16λÓзûºÅÊý£¬·Ö±æÂÊΪ 2/512 (g), g=9.8m/s + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +void BMA_Pooling(int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value) +{ + uint16 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + uint16 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + int16 value; + M2_Init(); + BMA_XL_Value = M3_ReadEEPROM(0x02); + BMA_XM_Value = M3_ReadEEPROM(0x03); + BMA_YL_Value = M3_ReadEEPROM(0x04); + BMA_YM_Value = M3_ReadEEPROM(0x05); + BMA_ZL_Value = M3_ReadEEPROM(0x06); + BMA_ZM_Value = M3_ReadEEPROM(0x07); + value = (BMA_XM_Value << 8) | ((BMA_XL_Value&0xc0)); + *BMA_X_Value= value/64; + value = (BMA_YM_Value << 8) | ((BMA_YL_Value&0xc0)); + *BMA_Y_Value= value/64; + value = (BMA_ZM_Value << 8) | ((BMA_ZL_Value&0xc0)); + *BMA_Z_Value= value/64; +} + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.h b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.h new file mode 100644 index 0000000..2ac8afc --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/BMA020.h @@ -0,0 +1,29 @@ +#define ACK 1 +#define noACK 0 +#define measure_temp_H 0x1B +#define measure_temp_L 0x1C +#define measure_X_H 0x1D +#define measure_X_L 0x1E +#define measure_Y_H 0x1F +#define measure_Y_L 0x20 +#define measure_Z_H 0x21 +#define measure_Z_L 0x22 + + +#define uchar unsigned char +#define uint unsigned short +#define ulong unsigned long + + +/****************************************************************************** + * Ãû³Æ BMA_Pooling + * ¹¦ÄÜ ¶ÁÈ¡bma020µÄX,Y ZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ + * Èë¿Ú²ÎÊý (int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value) + *BMA_X_Value£ºXµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Y_Value£ºYµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Z_Value£ºZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + ¼ÓËÙ¶ÈֵΪ16λÓзûºÅÊý£¬·Ö±æÂÊΪ 2/512 (g), g=9.8m/s + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +extern void BMA_Pooling(int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value); + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.c b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.c new file mode 100644 index 0000000..2c40357 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.c @@ -0,0 +1,292 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.c +// Description: dma_bma module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +//#include "hal_types.h" +#include "dma_itg.h" + + + +#define BM(n) (1 << (n)) + +#define MCU_IO_TRISTATE 1 +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +#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); ) +#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); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) + + + +/***********аå°åIOÉèÖÃ********************/ +#define HAL_BOARD_IO_SHT_SCK_PORT 1 +#define HAL_BOARD_IO_SHT_SCK_PIN 6 +#define HAL_BOARD_IO_SHT_SDA_PORT 1 +#define HAL_BOARD_IO_SHT_SDA_PIN 5 + +#define HAL_BOARD_IO_E2PROM_SCL_PORT HAL_BOARD_IO_SHT_SCK_PORT +#define HAL_BOARD_IO_E2PROM_SCL_PIN HAL_BOARD_IO_SHT_SCK_PIN + + +#define HAL_E2PROM_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1) +#define HAL_E2PROM_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCL_DIR_OUT HAL_E2PROM_SCK_DIR_OUT +#define HAL_E2PROM_SCL_SET HAL_E2PROM_SCK_SET +#define HAL_E2PROM_SCL_CLR HAL_E2PROM_SCK_CLR + +#define HAL_E2PROM_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0) +#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,2) +#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define halMcuWaitUs ITGMcuWaitUs +#define NOP() asm("NOP") +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void ITGMcuWaitUs(uint16 usec); +void ITGMcuWaitUs(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +//--------- write a byte and checks the ack signal----------------- +static void M3_I2cWrite(uint8 dat); +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCK_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } + +} + +//--------- read a byte and checks the ack signal----------------- +static uint8 M3_I2cRead(void); +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + HAL_E2PROM_SCK_SET(); + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR(); + halMcuWaitUs(2); + } + // MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,!ack); /*µ±ack£½1ʱÀ­µÍÊý¾ÝÏß*/ + // HAL_E2PROM_SDA_SET(); + + HAL_E2PROM_SCK_SET(); /*clk #9 for ack*/ + halMcuWaitUs(1); /*pulswith approx 1 us */ + HAL_E2PROM_SCK_CLR(); + HAL_E2PROM_SDA_SET(); + + return res; +} +static void M3_I2cStart(void); +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCK_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +static void M3_I2cStop(void); +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + + HAL_E2PROM_SCK_SET(); //SCL=1 + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +static void M3_I2cAck(void); +void M3_I2cAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_SET(); + HAL_E2PROM_SCK_CLR(); +} + +//------------------------------------------------------------------- +static void M3_I2cNAck(void); +void M3_I2cNAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_CLR(); + HAL_E2PROM_SCK_CLR(); +} + + +static void M3_WriteEEPROM(uint8 addr, uint8 ch); +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0xD2);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); +} +static uint8 M3_ReadEEPROM(uint8 addr); +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + M3_I2cWrite(0xD2); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cStart(); + M3_I2cWrite(0xD3); //Æ÷¼þÉèÖÃΪ¶Á״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + M3_I2cNAck(); + M3_I2cStop(); + + return res; +} +static void M3_Init(void); +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + static char initflg=0; + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); + if(initflg==0) + { + M3_WriteEEPROM(0x16,0x18); + initflg=1 ; + } +} + +/******************************************************************* + * Ãû³Æ ITG_Pooling + * ¹¦ÄÜ ¶ÁÈ¡itg_3200µÄX,Y ZµÄ½ÇËÙ¶È + * Èë¿Ú²ÎÊý (int16* X_Value, int16* Y_Value, int16* Z_Value ) + *X_Value£ºXÖáµÄ16λ½ÇËÙ¶È´æ·ÅµØÖ· + *Y_Value£ºYÖáµÄ16λ½ÇËÙ¶È´æ·ÅµØÖ· + *Z_Value£ºZÖáµÄ16λ½ÇËÙ¶È´æ·ÅµØÖ· + ½ÇËÙ¶ÈֵΪ16λÓзûºÅÊý£¬µ¥Î»Îª ¶È/S + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************/ +void ITG_Pooling(int16* X_Value, int16* Y_Value, int16* Z_Value ) +{ + int8 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + int8 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + int16 num_x1=0,num_y1=0,num_z1=0; + int16 num_x=0,num_y=0,num_z=0; + uint8 i = 0; + M3_Init(); + for(i=0;i<10;i++) + { + while (!(M3_ReadEEPROM(0x1A) & 0x01)); + BMA_XM_Value = M3_ReadEEPROM(0x1D); + halMcuWaitUs(5); + BMA_XL_Value = M3_ReadEEPROM(0x1E); + halMcuWaitUs(5); + BMA_YM_Value = M3_ReadEEPROM(0x1F); + halMcuWaitUs(5); + BMA_YL_Value = M3_ReadEEPROM(0x20); + halMcuWaitUs(5); + BMA_ZM_Value = M3_ReadEEPROM(0x21); + halMcuWaitUs(5); + BMA_ZL_Value = M3_ReadEEPROM(0x22); + halMcuWaitUs(5); + num_x1 = (BMA_XM_Value << 8) | BMA_XL_Value; + num_y1 = (BMA_YM_Value << 8) | BMA_YL_Value; + num_z1 = (BMA_ZM_Value << 8) | BMA_ZL_Value; + num_x = num_x + num_x1; + num_y = num_y + num_y1; + num_z = num_z + num_z1; + } + // »»Ëã³É ¶È/S + *X_Value = (int16)(num_x/10/14.375); + *Y_Value = (int16)(num_y/10/14.375); + *Z_Value = (int16)(num_z/10/14.375); +} + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.h b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.h new file mode 100644 index 0000000..8c5c2aa --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/dma_itg.h @@ -0,0 +1,20 @@ +#define ACK 1 +#define noACK 0 +#define measure_temp_H 0x1B +#define measure_temp_L 0x1C +#define measure_X_H 0x1D +#define measure_X_L 0x1E +#define measure_Y_H 0x1F +#define measure_Y_L 0x20 +#define measure_Z_H 0x21 +#define measure_Z_L 0x22 + + +#define uchar unsigned char +#define uint unsigned short +#define ulong unsigned long + + + +extern void ITG_Pooling(int16* X_Value, int16* Y_Value, int16* Z_Value ); + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.c b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.c new file mode 100644 index 0000000..f9dde86 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.c @@ -0,0 +1,160 @@ +/************************************************************************************************** + Filename: sh10.c + + Description: sh10 driver + +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +//#include "hal_types.h" +#include "get_adc.h" + + +/****************************************************************************** + * GLOBAL VARIABLES + */ +void hal_adc_Init(void); + uint16 readVoltage(void); +//static volatile uint32 value; + +void hal_adc_Init(void) +{ + APCFG |=1; + P0SEL |= (1 << (0)); + P0DIR &= ~(1 << (0)); + +} +/****************************************************************************** + * Ãû³Æ get_adc + * ¹¦ÄÜ ¶ÁÈ¡A/DÖµ + * Èë¿Ú²ÎÊý ÎÞ + * ³ö¿Ú²ÎÊý 16λµçѹֵ£¬·Ö±æÂÊΪ10mV, Èç0x0102±íʾ2.58V + *****************************************************************************/ +uint16 get_adc(void) +{ + int32 value; + hal_adc_Init(); // ADC³õʼ»¯ + ADCIF = 0; //ÇåADC ÖжϱêÖ¾ + //²ÉÓûù×¼µçѹavdd5:3.3V£¬Í¨µÀ0£¬Æô¶¯ADת»¯ + ADCCON3 = (0x80 | 0x10 | 0x00); + while ( !ADCIF ) + { + ; //µÈ´ýADת»¯½áÊø + } + value = ADCH; + value = value<< 8; + value |= ADCL; + if(value&0x8000) + value=0; + // ADֵת»¯³Éµçѹֵ + // 0 ±íʾ 0V £¬32768 ±íʾ 3.3V + // µçѹֵ = (value*3.3)/32768 £¨V) + value = (value * 330); + value = value >> 15; // ³ýÒÔ32768 + // ·µ»Ø·Ö±æÂÊΪ0.01VµÄµçѹֵ + return (uint16)value; +} +#define ACH1 0 +#define ACH2 4 +#define ACH3 5 +#define ACH4 6 + +void hal_adc4_Init(void); +void hal_adc4_Init(void) +{ + APCFG |= (1 << ACH1) | (1 << ACH2)| (1 << ACH3)| (1 << ACH4); + P0SEL |= (1 << ACH1) | (1 << ACH2)| (1 << ACH3)| (1 << ACH4); + P0DIR &= ~((1 << ACH1) | (1 << ACH2)| (1 << ACH3)| (1 << ACH4)); + +} +#define AD4MA 32768*150*4/3300 +#define AD20MA 32768*150*20/3300 +//return 10ADÖµ£¬0---0v, 3ff---3.3v +uint16 adC_ch(uint8 ch); +uint16 adC_ch(uint8 ch) +{ + int32 value; + ADCIF = 0; //ÇåADC ÖжϱêÖ¾ + //²ÉÓûù×¼µçѹavdd5:3.3V£¬Í¨µÀch£¬Æô¶¯ADת»¯ + ADCCON3 = (0x80 | 0x10 | (ch&0x0f) ); + while ( !ADCIF ) + { + ; //µÈ´ýADת»¯½áÊø + } + value = ADCH; + value = value<< 8; + value |= ADCL; + if(value&0x8000) + value=0; + value= value>>5; + return (uint16)value; + /* + // ADֵת»¯³Éµçѹֵ + // 0 ±íʾ 0V £¬32768 ±íʾ 3.3V + // µçÁ÷ 0--4ma, 255--20ma, µç×è150r + value = (value - AD4MA)*255/(AD20MA - AD4MA); + if(value<0) + return 0; + if(value>255) + return 255; + return (uint8)value&0xff;*/ +} +/****************************************************************************** + * Ãû³Æ get_adc4 + * ¹¦ÄÜ ¶ÁÈ¡ËÄͨµÀA/DÖµ ch0 ch4 ch5 ch6 + * Èë¿Ú²ÎÊý ÎÞ + * ³ö¿Ú²ÎÊý + *****************************************************************************/ +void get_adc4ch(uint8 *buf) +{ + uint16 value; + hal_adc4_Init(); // ADC³õʼ»¯ + value=adC_ch(ACH1); + *buf=value; + buf++; + *buf=value>>8; + buf++; + value=adC_ch(ACH2); + *buf=value; + buf++; + *buf=value>>8; + buf++; + value=adC_ch(ACH3); + *buf=value; + buf++; + *buf=value>>8; + buf++; + value=adC_ch(ACH4); + *buf=value; + buf++; + *buf=value>>8; +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.h b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.h new file mode 100644 index 0000000..17fc182 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_adc.h @@ -0,0 +1,16 @@ +/************************************************************************************************* + Filename: adc.h + + *****/ + + +#ifndef SIMPLE_adc_H +#define SIMPLE_adc_H + + +extern void hal_adc_Init(void); +extern uint16 get_adc(void); +extern void get_adc4ch(uint8 *buf); +#endif + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.c b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.c new file mode 100644 index 0000000..7a8a559 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.c @@ -0,0 +1,57 @@ +/************************************************************************************************** + Filename: + + Description: + +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +//#include "hal_types.h" +#include "get_swsensor.h" + + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +/****************************************************************************** + * Ãû³Æ get_swsensor + * ¹¦ÄÜ ¶ÁÈ¡¿ª¹ØÁ¿Öµ + * Èë¿Ú²ÎÊý ÎÞ + * ³ö¿Ú²ÎÊý 0»ò1µçƽ + *****************************************************************************/ +uint8 get_swsensor(void) +{ + P0SEL &= ~( 1 <<1); //ÉèÖÃp0.1ΪÆÕͨi/o¿Ú + P0DIR &= ~( 1 <<1); //ÉèÖÃp0.1ΪÊäÈë¿Ú + return P0_1; //·µ»Øp0.1µçƽ +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.h b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.h new file mode 100644 index 0000000..41ef756 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/get_swsensor.h @@ -0,0 +1,13 @@ +/************************************************************************************************* + Filename: + + *****/ + + +#ifndef SIMPLE_swsensor_H +#define SIMPLE_swsensor_H + +extern uint8 get_swsensor(void); +#endif + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.c b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.c new file mode 100644 index 0000000..fa93954 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.c @@ -0,0 +1,166 @@ +/************************************************************************************************** + Filename: sensor.c */ + + + +#include "hal_defs.h" +//#include "hal_types.h" +#include "hal_mcu.h" +#include "ioCC2530.h" +//#include "sh10.h" +#include "get_adc.h" +#include "sensor.h" +#include "dma_itg.h" +#include "bma020.h" +//#include "UART_PRINT.h" +//#include "OnBoard.h" + + +/****************************************************************************** + * GLOBAL VARIABLES + */ +void hal_LightSensor_Init(void); +static uint16 readVoltage(void); + +uint16 get_guangdian_ad(void); +void get_4channel_ad(uint8 *buf); +uint8 get_rentihongwai(void); +void get_wendu_shidu(int16 *temp, int16 *hum); +//static volatile uint32 value; + +void hal_LightSensor_Init(void) +{ + APCFG |=1; + P0SEL |= (1 << (0)); + P0DIR &= ~(1 << (0)); + P0INP |=1; +} +/****************************************************************************** + * @fn readVoltage + * + * @brief read voltage from ADC + * + * @param none + * + * @return voltage + *******/ +static uint16 readVoltage(void) +{ + + uint32 value; + int16 value1; + hal_LightSensor_Init(); + // Clear ADC interrupt flag + ADCIF = 0; + + ADCCON3 = (0x80 | 0x10 | 0x00); + //ADCCON3 = (0x80 | 0x10 | 0x0c); + //²ÉÓûù×¼µçѹavdd5:3.3V + // Wait for the conversion to finish + while ( !ADCIF ); + + // Get the result + value1 = ADCH; + value1 = value1<< 8; + value1 |= ADCL; + if(value1<0) + value1=0; + value=value1; + + // value now contains measurement of 3.3V + // 0 indicates 0V and 32767 indicates 3.3V + // voltage = (value*3.3)/32767 volts + // we will multiply by this by 10 to allow units of 0.01 volts + value = value >> 6; // divide first by 2^6 + value = (uint32)(value * 330); + value = value >> 9; // ...and later by 2^9...to prevent overflow during multiplication + + return (uint16)value; + +} + +/****************************************************************************** + * @fn readsensor + * + * @brief read readsensor ´«¸ÐÆ÷²ÉÑù + * + * @param sensorid + * + * @return sensor value, len + *******/ +uint8 readsensor(uint8 sensorid, char *val) +{ + if(sensorid == 0x01) + { //ÎÂʪ¶È + //call_sht11(tmp1,tmp2); + + return 4; + } + if(sensorid == 0x02) + { // G_SENSOR + BMA_Pooling((int16*)val, (int16*)(val+2),(int16*)(val+4)); + return 6; + } + if(sensorid == 0x03) + { //ÍÓÂÝÒÇ + ITG_Pooling((int16*)val, (int16*)(val+2),(int16*)(val+4)); + return 6; + } + if(sensorid == 0x4) + { //ÈËÌå p0.1 + APCFG &= ~(1<<1); + P0SEL &= ~(1 << (1)); + P0DIR &= ~(1 << (1)); + *val=0; + if( P0_1==0 ) + *val=0x01; + return 2; + } + if(sensorid == 0x5) + { //ËÄͨµÀ ad + get_adc4ch(val); + return 8; + } + if(sensorid == 0x6) + { //¹âÕÕ adc »òÆäËû + *(int16*)val=get_adc(); + return 2; + } +} +uint16 get_guangdian_ad(void) +{ + return get_adc(); +} +void get_4channel_ad(uint8 *buf) +{ + get_adc4ch(buf); +} +//1 youren +uint8 get_rentihongwai(void) +{ + uint8 val; + APCFG &= ~(1<<1); + P0SEL &= ~(1 << (1)); + P0DIR &= ~(1 << (1)); + val=0; + if( P0_1==0 ) + val=0x01; + return val; +} + +void get_wendu_shidu(int16 *temp, int16 *hum) +{ + int16 tmp1,tmp2; + call_sht11 (&tmp1,&tmp2); + *temp = tmp1; + *hum = tmp2; +} +//1 dongzuo +void set_relay(uint8 status) +{ + if(status == 1){ + HAL_TURN_ON_DC1(); + }else{ + HAL_TURN_OFF_DC1(); + } +} \ No newline at end of file diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.h b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.h new file mode 100644 index 0000000..ac08b19 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sensor.h @@ -0,0 +1,30 @@ +/************************************************************************************************** + Filename: + + +**************************************************************************************************/ + + +#ifndef SENSOR_H +#define SENSOR_H + +/****************************************************************************** + * CONSTANTS + */ + + +/****************************************************************************** + * PUBLIC FUNCTIONS + */ +extern uint8 readsensor(uint8 sensorid, char *val); + +extern uint16 get_guangdian_ad(void); +extern void get_4channel_ad(uint8 *buf); +extern uint8 get_rentihongwai(void); +extern void get_wendu_shidu(int16 *temp, int16 *hum); +extern void set_relay(uint8 status); +#endif // + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.c b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.c new file mode 100644 index 0000000..3dfd53c --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.c @@ -0,0 +1,325 @@ +/************************************************************************************************** + Filename: sh10.c + + Description: sh10 driver + +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +#include "sh10.h" + +#define BM(n) (1 << (n)) + +#define MCU_IO_TRISTATE 1 +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +#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); ) +#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); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) + + +#if defined (BOARD_OLD) +/***********¾É°åIOÉèÖÃ********************/ +#define HAL_BOARD_IO_SHT_SCK_PORT 2 +#define HAL_BOARD_IO_SHT_SCK_PIN 4 +#define HAL_BOARD_IO_SHT_SDA_PORT 2 +#define HAL_BOARD_IO_SHT_SDA_PIN 3 +#else +/***********аå°åIOÉèÖÃ********************/ +#define HAL_BOARD_IO_SHT_SCK_PORT 1 +#define HAL_BOARD_IO_SHT_SCK_PIN 6 +#define HAL_BOARD_IO_SHT_SDA_PORT 1 +#define HAL_BOARD_IO_SHT_SDA_PIN 5 +#endif + + +#define HAL_SHT_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_SHT_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1) +#define HAL_SHT_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) + +#define HAL_SHT_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_SHT_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0) +#define HAL_SHT_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_SHT_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,2) +#define HAL_SHT_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) + + + + +#define ACK 1 +#define noACK 0 +#define measure_temp 0x03 //²âÁ¿Î¶ÈÃüÁî +#define measure_humi 0x05 //²âÁ¿Êª¶ÈÃüÁî +#define RESET 0x1e //ÈíÆô¶¯ + +#define uchar unsigned char +#define uint unsigned int +#define ulong unsigned long + +//------------------------Êý¾Ý½á¹¹Ì嶨Òå--------------------------- +typedef union //±£´æËù²âµÃµÄζȣ¦Êª¶ÈÖµ +{ + uint i; + float f; +} value; +//WENSHIDU S; + + + + + + +/****************************************************************************** + * LOCAL FUNCTIONS + */ + +void SHT11_DELAY(uint16 usec); +char write_byte(unsigned char value); +char read_byte(unsigned char ack); +void transstart(void); +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode); +void calc_sth11(float *p_humidity ,float *p_temperature); + + +#define SENSOR_SHT10 + + + + + +#if defined SENSOR_SHT10 + +void SHT11_DELAY(uint16 usec) +{ + usec >>= 1; + + while (usec--) + { + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + } +} + + + + +char write_byte(unsigned char value) +{ + unsigned char i,error=0; + + for (i=0x80;i>0;i/=2) + { + if (i & value) + HAL_SHT_SDA_SET(); + else + HAL_SHT_SDA_CLR(); + + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + } + + HAL_SHT_SDA_SET(); + HAL_SHT_SDA_DIR_IN(); + HAL_SHT_SCK_SET(); + error=HAL_SHT_SDA_VAL(); + HAL_SHT_SCK_CLR(); + + return error; +} + +char read_byte(unsigned char ack) +{ + unsigned char i,val=0; + + HAL_SHT_SDA_SET(); + HAL_SHT_SDA_DIR_IN(); + for (i=0x80;i>0;i/=2) + { + HAL_SHT_SCK_SET(); + if (HAL_SHT_SDA_VAL()) + val=(val | i); + HAL_SHT_SCK_CLR(); + } + MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,!ack); + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + HAL_SHT_SDA_SET(); + + return val; +} + +void transstart(void) +{ + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + HAL_SHT_SDA_CLR(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + SHT11_DELAY(2); + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + + HAL_SHT_SDA_SET(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + SHT11_DELAY(2); + HAL_SHT_SDA_CLR(); +} + +void connectionreset(void) +{ + unsigned char i; + HAL_SHT_SDA_SET(); + HAL_SHT_SCK_CLR(); + for(i=0;i<9;i++) + { + HAL_SHT_SCK_SET(); + HAL_SHT_SCK_CLR(); + } + transstart(); +} + +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) +{ + unsigned char error=0; + unsigned int i; + + connectionreset(); + switch(mode) + { + case 0 : error+=write_byte(measure_temp); break; + case 1 : error+=write_byte(measure_humi); break; + default : break; + } + + HAL_SHT_SDA_DIR_IN(); + for (i=0;i<65535;i++) + { + SHT11_DELAY(10); + if(HAL_SHT_SDA_VAL()== 0) break; + } + if(HAL_SHT_SDA_VAL()) + { + error+=1; + } + + *(p_value+1) =read_byte(ACK); + *(p_value)=read_byte(ACK); + *p_checksum =read_byte(noACK); + return error; +} +/****************************************************************************** + * Ãû³Æ calc_sth11 + * ¹¦ÄÜ ¼ÆËãÎÂʪ¶ÈÖµ + * Èë¿Ú²ÎÊý float *p_humidity ,float *p_temperature + ʪ¶È ÎÂ¶È + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +void calc_sth11(float *p_humidity ,float *p_temperature) +{ + const float C1=-4.0; + const float C2=+0.0405; + const float C3=-0.0000028; + const float T1=+0.01; + const float T2=+0.00008; + float rh=*p_humidity; + float t=*p_temperature; + float rh_lin; + float rh_true; + float t_C; + t_C=t*0.01 - 40; + rh_lin=C3*rh*rh + C2*rh + C1; + rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; + if(rh_true>100)rh_true=100; + if(rh_true<0.1)rh_true=0.1; + *p_temperature=t_C; + *p_humidity=rh_true; +} + +/****************************************************************************** + * Ãû³Æ call_sht11 + * ¹¦ÄÜ ¶ÁÈ¡SH1xÎÂʪ¶ÈÖµ + * Èë¿Ú²ÎÊý void call_sht11(unsigned int *tem_val,unsigned int *hum_val) + *tem_val:ζȴæ·ÅµØÖ·£¬0.1¶È·Ö±æÂÊ + *hum_val:ʪ¶È´æ·ÅµØÖ·£¬0.1·Ö±æÂÊ + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +void call_sht11(unsigned int *tem_val,unsigned int *hum_val) +{ + value humi_val,temp_val; + unsigned char error = 0,checksum; + *tem_val=0; + *hum_val=0; + //Æô¶¯SH1xµÄʪ¶È²âÁ¿ + error+=s_measure((unsigned char*) &humi_val.i,&checksum,1); + //Æô¶¯SH1xµÄζȲâÁ¿ + error+=s_measure((unsigned char*) &temp_val.i,&checksum,0); + if(error!=0) + { //²âÊÔ´íÎ󣬽øÐÐÈí¸´Î» + connectionreset(); + } + else + { //²âÊÔÊý¾Ý´¦Àí + humi_val.f=(float)humi_val.i; + temp_val.f=(float)temp_val.i; + //¼ÆËãÎÂʪ¶Èʵ¼ÊÖµ + calc_sth11(&humi_val.f,&temp_val.f); + //ת»¯³É0.1µÄ·Ö±æÂÊ + *tem_val=temp_val.f*10; + *hum_val=humi_val.f*10; + } +} + +#endif + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.h b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.h new file mode 100644 index 0000000..c7f6f99 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/sensor_drv/sh10.h @@ -0,0 +1,14 @@ +/************************************************************************************************* + Filename: sh10.h + + *****/ + + +#ifndef SIMPLE_SH10_H +#define SIMPLE_SH10_H + +extern void call_sht11(unsigned int *tem, unsigned int *hum); +extern void connectionreset(void); +#endif + + diff --git a/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.cspy.bat b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.cspy.bat new file mode 100644 index 0000000..4b0b9ff --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.cspy.bat @@ -0,0 +1,15 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM + + +"D:\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "D:\IAR Systems\Embedded Workbench 6.0\8051\bin\8051proc.dll" "D:\IAR Systems\Embedded Workbench 6.0\8051\bin\8051emu_cc.dll" %1 --plugin "D:\IAR Systems\Embedded Workbench 6.0\8051\bin\8051bat.dll" --backend -B "--proc_core" "plain" "--proc_code_model" "banked" "--proc_nr_virtual_regs" "8" "--proc_pdata_bank_reg_addr" "0x93" "--proc_dptr_nr_of" "1" "--proc_codebank_reg" "0x9F" "--proc_codebank_start" "0x8000" "--proc_codebank_end" "0xFFFF" "--proc_codebank_mask" "0xFF" "--proc_data_model" "large" "-p" "D:\IAR Systems\Embedded Workbench 6.0\8051\config\devices\Texas Instruments\ioCC2530F256.ddf" "--proc_exclude_exit_breakpoint" "--proc_driver" "chipcon" "--retain_memory" "--verify_download" "use_crc16" "--stack_overflow" "--number_of_banks" "4" + + diff --git a/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dbgdt b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dbgdt new file mode 100644 index 0000000..e068f91 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dbgdt @@ -0,0 +1,5 @@ + + + + + diff --git a/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dni b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dni new file mode 100644 index 0000000..aef7a55 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.dni @@ -0,0 +1,24 @@ +[DebugChecksum] +Checksum=521045402 +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[StackPlugin] +Enabled=1 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnHow=0 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[Breakpoints] +Count=0 +[ChipconEmu] +Stop timers on halt=1 +Leave target running=1 +[Aliases] +Count=0 +SuppressDialog=0 diff --git a/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.wsdt b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.wsdt new file mode 100644 index 0000000..926a6d0 --- /dev/null +++ b/Zigbee无线通信/Aæ�¿/Project/settings/rf_set.wsdt @@ -0,0 +1,49 @@ + + + + + + rf_set/Debug + + + + + + + + + 140272727 + + 2098026165201861 + + + + + + TabID-1552-11148 + Workspace + Workspace + + + rf_setrf_set/Outputrf_set/apprf_set/basicrfrf_set/boardrf_set/common + + + + 0TabID-5639-8760BuildBuildTabID-28319-24938Debug LogDebug-Log0 + + + + + + TextEditor$WS_DIR$\rf_set.c096163416340TextEditor$WS_DIR$\..\CC2530_lib\basicrf\basic_rf.c03961304013057TextEditor$WS_DIR$\..\CC2530_lib\common\hal_mcu.c093133413460100000010000001 + + + + + + + iaridepm.enu1-2-2545214-2-213115085286194049140625707633-2-21831538-2-215401851002604239327111979239327 + + + + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.c new file mode 100644 index 0000000..b41d6f7 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.c @@ -0,0 +1,523 @@ +//------------------------------------------------------------------- +// Filename: basic_rf.c +// Description: Basic RF library +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" +#include "hal_mcu.h" // Using halMcuWaitUs() +#include "hal_rf.h" +#include "basic_rf.h" +#ifdef SECURITY_CCM + #include "hal_rf_security.h" + #include "basic_rf_security.h" +#endif +#include + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Packet and packet part lengths +#define PKT_LEN_MIC 8 +#define PKT_LEN_SEC PKT_LEN_UNSEC + PKT_LEN_MIC +#define PKT_LEN_AUTH 8 +#define PKT_LEN_ENCR 24 + +// Packet overhead ((frame control field, sequence number, PAN ID, +// destination and source) + (footer)) +// Note that the length byte itself is not included included in the packet length +#define BASIC_RF_PACKET_OVERHEAD_SIZE ((2 + 1 + 2 + 2 + 2) + (2)) +#define BASIC_RF_MAX_PAYLOAD_SIZE (127 - BASIC_RF_PACKET_OVERHEAD_SIZE - BASIC_RF_AUX_HDR_LENGTH - BASIC_RF_LEN_MIC) +#define BASIC_RF_ACK_PACKET_SIZE 5 +#define BASIC_RF_FOOTER_SIZE 2 +#define BASIC_RF_HDR_SIZE 10 + +// The time it takes for the acknowledgment packet to be received after the +// data packet has been transmitted. +#define BASIC_RF_ACK_DURATION (0.5 * 32 * 2 * ((4 + 1) + (1) + (2 + 1) + (2))) +#define BASIC_RF_SYMBOL_DURATION (32 * 0.5) + +// The length byte +#define BASIC_RF_PLD_LEN_MASK 0x7F + +// Frame control field +#define BASIC_RF_FCF_NOACK 0x8841 +#define BASIC_RF_FCF_ACK 0x8861 +#define BASIC_RF_FCF_ACK_BM 0x0020 +#define BASIC_RF_FCF_BM (~BASIC_RF_FCF_ACK_BM) +#define BASIC_RF_SEC_ENABLED_FCF_BM 0x0008 + +// Frame control field LSB +#define BASIC_RF_FCF_NOACK_L LO_UINT16(BASIC_RF_FCF_NOACK) +#define BASIC_RF_FCF_ACK_L LO_UINT16(BASIC_RF_FCF_ACK) +#define BASIC_RF_FCF_ACK_BM_L LO_UINT16(BASIC_RF_FCF_ACK_BM) +#define BASIC_RF_FCF_BM_L LO_UINT16(BASIC_RF_FCF_BM) +#define BASIC_RF_SEC_ENABLED_FCF_BM_L LO_UINT16(BASIC_RF_SEC_ENABLED_FCF_BM) + +// Auxiliary Security header +#define BASIC_RF_AUX_HDR_LENGTH 5 +#define BASIC_RF_LEN_AUTH BASIC_RF_PACKET_OVERHEAD_SIZE + BASIC_RF_AUX_HDR_LENGTH - BASIC_RF_FOOTER_SIZE +#define BASIC_RF_SECURITY_M 2 +#define BASIC_RF_LEN_MIC 8 +#ifdef SECURITY_CCM + #undef BASIC_RF_HDR_SIZE + #define BASIC_RF_HDR_SIZE 15 +#endif + +// Footer +#define BASIC_RF_CRC_OK_BM 0x80 + + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +// The receive struct +typedef struct +{ + uint8 seqNumber; + uint16 srcAddr; + uint16 srcPanId; + int8 length; + uint8 *pPayload; + uint8 ackRequest; + int8 rssi; + volatile uint8 isReady; + uint8 status; +} basicRfRxInfo_t; + +// Tx state +typedef struct +{ + uint8 txSeqNumber; + volatile uint8 ackReceived; + uint8 receiveOn; + uint32 frameCounter; +} basicRfTxState_t; + + +// Basic RF packet header (IEEE 802.15.4) +typedef struct +{ + uint8 packetLength; + uint8 fcf0; // Frame control field LSB + uint8 fcf1; // Frame control field MSB + uint8 seqNumber; + uint16 panId; + uint16 destAddr; + uint16 srcAddr; + #ifdef SECURITY_CCM + uint8 securityControl; + uint8 frameCounter[4]; + #endif +} basicRfPktHdr_t; + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +static basicRfRxInfo_t rxi = +{ + 0xFF +}; // Make sure sequence numbers are +static basicRfTxState_t txState = +{ + 0x00 +}; // initialised and distinct. + +static basicRfCfg_t *pConfig; +static uint8 txMpdu[BASIC_RF_MAX_PAYLOAD_SIZE + BASIC_RF_PACKET_OVERHEAD_SIZE + 1]; +static uint8 rxMpdu[128]; + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn basicRfBuildHeader +// @brief Builds packet header according to IEEE 802.15.4 frame format +// @param buffer - Pointer to buffer to write the header +// destAddr - destination short address +// payloadLength - length of higher layer payload +// @return uint8 - length of header +//------------------------------------------------------------------- +static uint8 basicRfBuildHeader(uint8 *buffer, uint16 destAddr, uint8 payloadLength) +{ + basicRfPktHdr_t *pHdr; + uint16 fcf; + + pHdr = (basicRfPktHdr_t*)buffer; + + // Populate packet header + pHdr->packetLength = payloadLength + BASIC_RF_PACKET_OVERHEAD_SIZE; + //pHdr->frameControlField = pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK; + fcf = pConfig->ackRequest ? BASIC_RF_FCF_ACK : BASIC_RF_FCF_NOACK; + pHdr->fcf0 = LO_UINT16(fcf); + pHdr->fcf1 = HI_UINT16(fcf); + pHdr->seqNumber = txState.txSeqNumber; + pHdr->panId = pConfig->panId; + pHdr->destAddr = destAddr; + pHdr->srcAddr = pConfig->myAddr; + + #ifdef SECURITY_CCM + + // Add security to FCF, length and security header + pHdr->fcf0 |= BASIC_RF_SEC_ENABLED_FCF_BM_L; + pHdr->packetLength += PKT_LEN_MIC; + pHdr->packetLength += BASIC_RF_AUX_HDR_LENGTH; + + pHdr->securityControl = SECURITY_CONTROL; + pHdr->frameCounter[0] = LO_UINT16(LO_UINT32(txState.frameCounter)); + pHdr->frameCounter[1] = HI_UINT16(LO_UINT32(txState.frameCounter)); + pHdr->frameCounter[2] = LO_UINT16(HI_UINT32(txState.frameCounter)); + pHdr->frameCounter[3] = HI_UINT16(HI_UINT32(txState.frameCounter)); + + #endif + + return BASIC_RF_HDR_SIZE; +} + +//------------------------------------------------------------------- +// @fn basicRfBuildMpdu +// @brief Builds mpdu (MAC header + payload) according to IEEE 802.15.4 +// frame format +// @param destAddr - Destination short address +// pPayload - pointer to buffer with payload +// payloadLength - length of payload buffer +// @return uint8 - length of mpdu +//------------------------------------------------------------------- +static uint8 basicRfBuildMpdu(uint16 destAddr, uint8 *pPayload, uint8 payloadLength) +{ + uint8 hdrLength, n; + + hdrLength = basicRfBuildHeader(txMpdu, destAddr, payloadLength); + + for (n = 0; n < payloadLength; n++) + { + txMpdu[hdrLength + n] = pPayload[n]; + } + return hdrLength + payloadLength; // total mpdu length +} + +//------------------------------------------------------------------- +// @fn basicRfRxFrmDoneIsr +// @brief Interrupt service routine for received frame from radio +// (either data or acknowlegdement) +// @param rxi - file scope variable info extracted from the last incoming +// frame +// txState - file scope variable that keeps tx state info +// @return none +//------------------------------------------------------------------- +static void basicRfRxFrmDoneIsr(void) +{ + basicRfPktHdr_t *pHdr; + uint8 *pStatusWord; + #ifdef SECURITY_CCM + uint8 authStatus = 0; + #endif + + // Map header to packet buffer + pHdr = (basicRfPktHdr_t*)rxMpdu; + + // Clear interrupt and disable new RX frame done interrupt + halRfDisableRxInterrupt(); + + // Enable all other interrupt sources (enables interrupt nesting) + halIntOn(); + + // Read payload length. + halRfReadRxBuf(&pHdr->packetLength, 1); + pHdr->packetLength &= BASIC_RF_PLD_LEN_MASK; // Ignore MSB + + // Is this an acknowledgment packet? + // Only ack packets may be 5 bytes in total. + if (pHdr->packetLength == BASIC_RF_ACK_PACKET_SIZE) + { + // Read the packet + halRfReadRxBuf(&rxMpdu[1], pHdr->packetLength); + + rxi.ackRequest = !!(pHdr->fcf0 &BASIC_RF_FCF_ACK_BM_L); + + // Read the status word and check for CRC OK + pStatusWord = rxMpdu + 4; + + // Indicate the successful ACK reception if CRC and sequence number OK + if ((pStatusWord[1] &BASIC_RF_CRC_OK_BM) && (pHdr->seqNumber == txState.txSeqNumber)) + { + txState.ackReceived = TRUE; + } + // No, it is data + } + else + { + // It is assumed that the radio rejects packets with invalid length. + // Subtract the number of bytes in the frame overhead to get actual payload. + rxi.length = pHdr->packetLength - BASIC_RF_PACKET_OVERHEAD_SIZE; + + #ifdef SECURITY_CCM + rxi.length -= (BASIC_RF_AUX_HDR_LENGTH + BASIC_RF_LEN_MIC); + authStatus = halRfReadRxBufSecure(&rxMpdu[1], pHdr->packetLength, rxi.length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M); + #else + halRfReadRxBuf(&rxMpdu[1], pHdr->packetLength); + #endif + + rxi.ackRequest = !!(pHdr->fcf0 &BASIC_RF_FCF_ACK_BM_L); + + // Read the source address + rxi.srcAddr = pHdr->srcAddr; + + // Read the packet payload + rxi.pPayload = rxMpdu + BASIC_RF_HDR_SIZE; + + // Read the FCS to get the RSSI and CRC + pStatusWord = rxi.pPayload + rxi.length; + #ifdef SECURITY_CCM + pStatusWord += BASIC_RF_LEN_MIC; + #endif + rxi.rssi = pStatusWord[0]; + + // Notify the application about the received data packet if the CRC is OK + // Throw packet if the previous packet had the same sequence number + if ((pStatusWord[1] &BASIC_RF_CRC_OK_BM) )//&& (rxi.seqNumber != pHdr->seqNumber)) + { + // If security is used check also that authentication passed + #ifdef SECURITY_CCM + if (authStatus == SUCCESS) + { + if ((pHdr->fcf0 &BASIC_RF_FCF_BM_L) == (BASIC_RF_FCF_NOACK_L | BASIC_RF_SEC_ENABLED_FCF_BM_L)) + { + rxi.isReady = TRUE; + } + } + #else + if (((pHdr->fcf0 &(BASIC_RF_FCF_BM_L)) == BASIC_RF_FCF_NOACK_L)) + { + rxi.isReady = TRUE; + } + #endif + } + rxi.seqNumber = pHdr->seqNumber; + } + // Enable RX frame done interrupt again + halIntOff(); + halRfEnableRxInterrupt(); +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn basicRfInit +// @brief Initialise basic RF datastructures. Sets channel, short address and +// PAN id in the chip and configures interrupt on packet reception +// @param pRfConfig - pointer to BASIC_RF_CONFIG struct. +// This struct must be allocated by higher layer +// txState - file scope variable that keeps tx state info +// rxi - file scope variable info extracted from the last incoming frame +// @return none +//------------------------------------------------------------------- +uint8 basicRfInit(basicRfCfg_t *pRfConfig) +{ + if (halRfInit() == FAILED) + { + return FAILED; + } + + halIntOff(); + + // Set the protocol configuration + pConfig = pRfConfig; + rxi.pPayload = NULL; + + txState.receiveOn = TRUE; + txState.frameCounter = 0; + + // Set channel + halRfSetChannel(pConfig->channel); + + // Write the short address and the PAN ID to the CC2520 RAM + halRfSetShortAddr(pConfig->myAddr); + halRfSetPanId(pConfig->panId); + + // if security is enabled, write key and nonce + #ifdef SECURITY_CCM + basicRfSecurityInit(pConfig); + #endif + + // Set up receive interrupt (received data or acknowlegment) + halRfRxInterruptConfig(basicRfRxFrmDoneIsr); + + halIntOn(); + + return SUCCESS; +} + +//------------------------------------------------------------------- +// @fn basicRfSendPacket +// @brief Send packet +// @param destAddr - destination short address +// pPayload - pointer to payload buffer. This buffer must be +// allocated by higher layer. +// length - length of payload +// txState - file scope variable that keeps tx state info +// mpdu - file scope variable. Buffer for the frame to send +// @return basicRFStatus_t - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 basicRfSendPacket(uint16 destAddr, uint8 *pPayload, uint8 length) +{ + uint8 mpduLength; + uint8 status; + + // Turn on receiver if its not on + if (!txState.receiveOn) + { + halRfReceiveOn(); + } + + // Check packet length + length = MIN(length, BASIC_RF_MAX_PAYLOAD_SIZE); + + // Wait until the transceiver is idle + halRfWaitTransceiverReady(); + + // Turn off RX frame done interrupt to avoid interference on the SPI interface + halRfDisableRxInterrupt(); + + mpduLength = basicRfBuildMpdu(destAddr, pPayload, length); + + #ifdef SECURITY_CCM + halRfWriteTxBufSecure(txMpdu, mpduLength, length, BASIC_RF_LEN_AUTH, BASIC_RF_SECURITY_M); + txState.frameCounter++; // Increment frame counter field + #else + halRfWriteTxBuf(txMpdu, mpduLength); + #endif + + // Turn on RX frame done interrupt for ACK reception + halRfEnableRxInterrupt(); + + // Send frame with CCA. return FAILED if not successful + if (halRfTransmit() != SUCCESS) + { + status = FAILED; + } + + // Wait for the acknowledge to be received, if any + if (pConfig->ackRequest) + { + txState.ackReceived = FALSE; + + // We'll enter RX automatically, so just wait until we can be sure that the ack reception should have finished + // The timeout consists of a 12-symbol turnaround time, the ack packet duration, and a small margin + halMcuWaitUs((12 *BASIC_RF_SYMBOL_DURATION) + (BASIC_RF_ACK_DURATION) + (2 *BASIC_RF_SYMBOL_DURATION) + 10); + + // If an acknowledgment has been received (by RxFrmDoneIsr), the ackReceived flag should be set + status = txState.ackReceived ? SUCCESS : FAILED; + } + else + { + status = SUCCESS; + } + + // Turn off the receiver if it should not continue to be enabled + if (!txState.receiveOn) + { + halRfReceiveOff(); + } + + if (status == SUCCESS) + { + txState.txSeqNumber++; + } + + #ifdef SECURITY_CCM + halRfIncNonceTx(); // Increment nonce value + #endif + + return status; +} + +//------------------------------------------------------------------- +// @fn basicRfPacketIsReady +// @brief Check if a new packet is ready to be read by next higher layer +// @param none +// @return uint8 - TRUE if a packet is ready to be read by higher layer +//------------------------------------------------------------------- +uint8 basicRfPacketIsReady(void) +{ + return rxi.isReady; +} + +//------------------------------------------------------------------- +// @fn basicRfReceive +// @brief Copies the payload of the last incoming packet into a buffer +// @param pRxData - pointer to data buffer to fill. This buffer must be +// allocated by higher layer. +// len - Number of bytes to read in to buffer +// rxi - file scope variable holding the information of the last +// incoming packet +// @return uint8 - number of bytes actually copied into buffer +//------------------------------------------------------------------- +uint8 basicRfReceive(uint8 *pRxData, uint16 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) + { + if (rxi.rssi < 128) + { + *pRssi = rxi.rssi - halRfGetRssiOffset(); + } + else + { + *pRssi = (rxi.rssi - 256) - halRfGetRssiOffset(); + } + } + rxi.isReady = FALSE; + halIntOn(); + + // Critical region end + return MIN(rxi.length, len); +} + +//------------------------------------------------------------------- +// @fn basicRfGetRssi +// @brief Copies the payload of the last incoming packet into a buffer +// @param none +// @return int8 - RSSI value +//------------------------------------------------------------------- +int8 basicRfGetRssi(void) +{ + if (rxi.rssi < 128) + { + return rxi.rssi - halRfGetRssiOffset(); + } + else + { + return (rxi.rssi - 256) - halRfGetRssiOffset(); + } +} + +//------------------------------------------------------------------- +// @fn basicRfReceiveOn +// @brief Turns on receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOn(void) +{ + txState.receiveOn = TRUE; + halRfReceiveOn(); +} + +//------------------------------------------------------------------- +// @fn basicRfReceiveOff +// @brief Turns off receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOff(void) +{ + txState.receiveOn = FALSE; + halRfReceiveOff(); +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.h new file mode 100644 index 0000000..655960e --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf.h @@ -0,0 +1,123 @@ +//------------------------------------------------------------------- +// Filename: basic_rf.h +// Description: Basic RF library header file +//------------------------------------------------------------------- +// The "Basic RF" library contains simple functions for packet transmission and +// reception with the IEEE 802.15.4 compliant radio devices. The intention of this +// library is to demonstrate how the radio devices are operated, and not to provide +// a complete and fully-functional packet protocol. The protocol uses 802.15.4 MAC compliant data +// and acknowledgment packets, however it contains only a small subset of the +// 802.15.4 standard: +// - Association, scanning nor beacons are not implemented +// - No defined coordinator/device roles (peer-to-peer, all nodes are equal) +// - Waits for the channel to become ready, but does not check CCA twice +// (802.15.4 CSMA-CA) +// - Does not retransmit packets +// +// INSTRUCTIONS: +// Startup: +// 1. Create a basicRfCfg_t structure, and initialize the members: +// 2. Call basicRfInit() to initialize the packet protocol. +// +// Transmission: +// 1. Create a buffer with the payload to send +// 2. Call basicRfSendPacket() +// +// Reception: +// 1. Check if a packet is ready to be received by highger layer with +// basicRfPacketIsReady() +// 2. Call basicRfReceive() to receive the packet by higher layer +// +// FRAME FORMATS: +// Data packets (without security): +// [Preambles (4)][SFD (1)][Length (1)][Frame control field (2)] +// [Sequence number (1)][PAN ID (2)][Dest. address (2)][Source address (2)] +// [Payload (Length - 2+1+2+2+2)][Frame check sequence (2)] +// +// Acknowledgment packets: +// [Preambles (4)][SFD (1)][Length = 5 (1)][Frame control field (2)] +// [Sequence number (1)][Frame check sequence (2)] +//------------------------------------------------------------------- + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef struct +{ + uint16 myAddr; // ±¾»úµØÖ· + uint16 panId; // ÍøÂçID + uint8 channel; // ͨÐÅÐŵÀ£¬ 11~26 + uint8 ackRequest; //Ó¦´ðÐźŠ+ #ifdef SECURITY_CCM + uint8 *securityKey; + uint8 *securityNonce; + #endif +} basicRfCfg_t; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS + + +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn basicRfInit +// @brief Initialise basic RF datastructures. Sets channel, short address and +// PAN id in the chip and configures interrupt on packet reception +// @param pRfConfig - pointer to BASIC_RF_CONFIG struct. +// This struct must be allocated by higher layer +// txState - file scope variable that keeps tx state info +// rxi - file scope variable info extracted from the last incoming frame +// @return none +//------------------------------------------------------------------- +uint8 basicRfInit(basicRfCfg_t *pRfConfig); + +//------------------------------------------------------------------- +// @fn basicRfSendPacket +// @brief Send packet +// @param destAddr - destination short address +// pPayload - pointer to payload buffer. This buffer must be +// allocated by higher layer. +// length - length of payload +// txState - file scope variable that keeps tx state info +// mpdu - file scope variable. Buffer for the frame to send +// @return basicRFStatus_t - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 basicRfSendPacket(uint16 destAddr, uint8 *pPayload, uint8 length); + +//------------------------------------------------------------------- +// @fn basicRfPacketIsReady +// @brief Check if a new packet is ready to be read by next higher layer +// @param none +// @return uint8 - TRUE if a packet is ready to be read by higher layer +//------------------------------------------------------------------- +uint8 basicRfPacketIsReady(void); + +//------------------------------------------------------------------- +// @fn basicRfReceive +// @brief Copies the payload of the last incoming packet into a buffer +// @param pRxData - pointer to data buffer to fill. This buffer must be +// allocated by higher layer. +// len - Number of bytes to read in to buffer +// rxi - file scope variable holding the information of the last +// incoming packet +// @return uint8 - number of bytes actually copied into buffer +//------------------------------------------------------------------- +uint8 basicRfReceive(uint8 *pRxData, uint16 len, int16 *pRssi); + +//------------------------------------------------------------------- +// @fn basicRfReceiveOn +// @brief Turns on receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOn(void); + +//------------------------------------------------------------------- +// @fn basicRfReceiveOff +// @brief Turns off receiver on radio +// @param txState - file scope variable +// @return none +//------------------------------------------------------------------- +void basicRfReceiveOff(void); + + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.c new file mode 100644 index 0000000..b73faf0 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.c @@ -0,0 +1,60 @@ +//------------------------------------------------------------------- +// Filename: basic_rf_security.c +// Description: Basic RF security library +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#ifdef SECURITY_CCM + #include "hal_defs.h" + #include "hal_rf_security.h" + #include "basic_rf.h" + #include "basic_rf_security.h" + + //------------------------------------------------------------------- + // CONSTANTS AND DEFINES + //------------------------------------------------------------------- + #define FLAG_FIELD 0x09 + #define NONCE_SIZE 16 + + //------------------------------------------------------------------- + // LOCAL VARIABLES + //------------------------------------------------------------------- + static uint8 nonceTx[NONCE_SIZE]; + static uint8 nonceRx[NONCE_SIZE]; + + //------------------------------------------------------------------- + // GLOBAL FUNCTIONS + //------------------------------------------------------------------- + //------------------------------------------------------------------- + // @fn basicRfSecurityInit + // @brief Initialise key and nonces and write to radio + // @param pConfig - file scope variable holding configuration data for basic RF + // @return none + //------------------------------------------------------------------- + void basicRfSecurityInit(basicRfCfg_t *pConfig) + { + uint8 i; + + // Initialise nonce bytes to 0 + for (i = 0; i < NONCE_SIZE; i++) + { + nonceRx[i] = 0; + nonceTx[i] = 0; + } + + // Set nonce flag field (Byte 0) + nonceRx[0] = FLAG_FIELD; + nonceTx[0] = FLAG_FIELD; + + // Set byte 7 and 8 of nonce to myAddr + nonceTx[8] = (uint8)pConfig->myAddr; + nonceTx[7] = (uint8)(pConfig->myAddr >> 8); + + // Set Security mode field of nonces (Byte 13) + nonceRx[13] = SECURITY_CONTROL; + nonceTx[13] = SECURITY_CONTROL; + + halRfSecurityInit(pConfig->securityKey, nonceRx, nonceTx); + } +#endif diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.h new file mode 100644 index 0000000..1af1cdf --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/basicrf/basic_rf_security.h @@ -0,0 +1,8 @@ +//------------------------------------------------------------------- +// Filename: basic_rf_security.h +// Description: Basic RF security library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void basicRfSecurityInit(basicRfCfg_t *pConfig); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.c new file mode 100644 index 0000000..1a1eb90 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.c @@ -0,0 +1,17 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_digio.h" +#include "hal_int.h" +#include "hal_board.h" +#include "hal_uart.h" + +void halBoardInit(void) +{ + halMcuInit(); + halUartInit(115200); + halIntOn(); +} + + + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.h new file mode 100644 index 0000000..51cae44 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_board.h @@ -0,0 +1,307 @@ +//------------------------------------------------------------------- +// Filename: hal_board.h +// Description: MCU-KIT1 board with CC2530 +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS +//------------------------------------------------------------------- + +// Board properties +#define BOARD_NAME "ZIGBEE-DMA2530" +#define NUM_LEDS 4 + +// Clock +#define BSP_CONFIG_CLOCK_MHZ 32 + + +//RFID_FLAG +#define HAL_BOARD_IO_FLAG_PORT 1 +#define HAL_BOARD_IO_FLAG_PIN 1 + +//CD2530_Test_Pin +#define HAL_BOARD_IO_TEST1_PORT 1 +#define HAL_BOARD_IO_TEST1_PIN 3 +#define HAL_BOARD_IO_TEST2_PORT 1 +#define HAL_BOARD_IO_TEST2_PIN 4 +#define HAL_BOARD_IO_TEST3_PORT 1 +#define HAL_BOARD_IO_TEST3_PIN 5 +#define HAL_BOARD_IO_TEST4_PORT 0 +#define HAL_BOARD_IO_TEST4_PIN 0 + + +// LEDs +#define HAL_BOARD_IO_LED_PORT 1 + +//#define HAL_BOARD_IO_LED_1_PORT 1 +//#define HAL_BOARD_IO_LED_1_PIN 2 +#define HAL_BOARD_IO_LED_1_PORT 1 +#define HAL_BOARD_IO_LED_1_PIN 0 +#define HAL_BOARD_IO_LED_2_PORT 1 +#define HAL_BOARD_IO_LED_2_PIN 1 +#define HAL_BOARD_IO_LED_3_PORT 1 +#define HAL_BOARD_IO_LED_3_PIN 3 +#define HAL_BOARD_IO_LED_4_PORT 1 +#define HAL_BOARD_IO_LED_4_PIN 4 + +//DC +#define HAL_BOARD_IO_DC_1_PORT 2 +#define HAL_BOARD_IO_DC_1_PIN 0 +#define HAL_BOARD_IO_DC_2_PORT 1 +#define HAL_BOARD_IO_DC_2_PIN 7 + +//TC72 +#define HAL_BOARD_IO_TC72_SDI_PORT 0 +#define HAL_BOARD_IO_TC72_SDI_PIN 4 +#define HAL_BOARD_IO_TC72_SCL_PORT 0 +#define HAL_BOARD_IO_TC72_SCL_PIN 5 +#define HAL_BOARD_IO_TC72_SDO_PORT 0 +#define HAL_BOARD_IO_TC72_SDO_PIN 6 +#define HAL_BOARD_IO_TC72_SSS_PORT 0 +#define HAL_BOARD_IO_TC72_SSS_PIN 7 + +//AT24C02(E2PROM) +#define HAL_BOARD_IO_E2PROM_SCL_PORT 0 +#define HAL_BOARD_IO_E2PROM_SCL_PIN 6 +#define HAL_BOARD_IO_E2PROM_SDA_PORT 0 +#define HAL_BOARD_IO_E2PROM_SDA_PIN 7 + +//ITG +#define HAL_BOARD_IO_E2PROM_SCK_PORT 0 +#define HAL_BOARD_IO_E2PROM_SCK_PIN 6 +#define HAL_BOARD_IO_E2PROM_SDA_PORT 0 +#define HAL_BOARD_IO_E2PROM_SDA_PIN 7 + + +// SPI +#define HAL_BOARD_IO_SPI_MISO_PORT 0 +#define HAL_BOARD_IO_SPI_MISO_PIN 6 +#define HAL_BOARD_IO_SPI_MOSI_PORT 0 +#define HAL_BOARD_IO_SPI_MOSI_PIN 4 +#define HAL_BOARD_IO_SPI_CLK_PORT 0 +#define HAL_BOARD_IO_SPI_CLK_PIN 5 +#define HAL_BOARD_IO_SPI_CS_PORT 0 +#define HAL_BOARD_IO_SPI_CS_PIN 7 + +//SHT +#define HAL_BOARD_IO_SHT_SCK_PORT 2 +#define HAL_BOARD_IO_SHT_SCK_PIN 4 +#define HAL_BOARD_IO_SHT_SDA_PORT 2 +#define HAL_BOARD_IO_SHT_SDA_PIN 3 + +//SR04£¨³¬Éù²¨£© +#define HAL_BOARD_IO_SR04_TX_PORT 2 +#define HAL_BOARD_IO_SR04_TX_PIN 3 +#define HAL_BOARD_IO_SR04_RX_PORT 2 +#define HAL_BOARD_IO_SR04_RX_PIN 4 + +//TCS (ÑÕÉ«) +#define HAL_BOARD_IO_TCS_S2_PORT 2 +#define HAL_BOARD_IO_TCS_S2_PIN 3 +#define HAL_BOARD_IO_TCS_S3_PORT 2 +#define HAL_BOARD_IO_TCS_S3_PIN 4 + + +// I2C +#define HAL_BOARD_IO_I2C_SCL_PORT 0 +#define HAL_BOARD_IO_I2C_SCL_PIN 5 +#define HAL_BOARD_IO_I2C_SDA_PORT 0 +#define HAL_BOARD_IO_I2C_SDA_PIN 4 + +// LED +#define HAL_BOARD_IO_LED_DATA_PORT 1 + +// A/D +#define HAL_BOARD_IO_ADC_PORT 0 +#define HAL_BOARD_IO_ADC_CH 0 + +// INT +#define HAL_BOARD_IO_INT_PORT 0 +#define HAL_BOARD_IO_INT_PIN 1 + +// DO +#define HAL_BOARD_IO_DO_PORT 0 +#define HAL_BOARD_IO_DO_PIN 0 + +//OUT +#define HAL_BOARD_IO_OUT_PORT 1 +#define HAL_BOARD_IO_OUT_PIN 7 + +// UART +#define HAL_BOARD_IO_UART_TXD_PORT 0 +#define HAL_BOARD_IO_UART_TXD_PIN 3 +#define HAL_BOARD_IO_UART_RXD_PORT 0 +#define HAL_BOARD_IO_UART_RXD_PIN 2 + +// UART1 +#define HAL_BOARD_IO_UART1_TXD_PORT 1 +#define HAL_BOARD_IO_UART1_TXD_PIN 6 +#define HAL_BOARD_IO_UART1_RXD_PORT 1 +#define HAL_BOARD_IO_UART1_RXD_PIN 7 + +// Debounce +#define HAL_DEBOUNCE(expr) { char i; for (i=0; i<50; i++) { if (!(expr)) i = 0; } } + +// Assert +#define HAL_ASSERT(szErrMsg) { halAssertHandler(szErrMsg); } + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- + +//CD2530_Test_Pin + +#define HAL_BOARD_TEST1_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST1_PORT, HAL_BOARD_IO_TEST1_PIN, MCU_IO_PULLUP) +#define HAL_BOARD_TEST2_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST2_PORT, HAL_BOARD_IO_TEST2_PIN, MCU_IO_PULLUP) +#define HAL_BOARD_TEST3_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST3_PORT, HAL_BOARD_IO_TEST3_PIN, MCU_IO_PULLUP) +#define HAL_BOARD_TEST4_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_TEST4_PORT, HAL_BOARD_IO_TEST4_PIN, MCU_IO_PULLUP) + +#define HAL_BOARD_TEST1_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST1_PORT, HAL_BOARD_IO_TEST1_PIN) +#define HAL_BOARD_TEST2_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST2_PORT, HAL_BOARD_IO_TEST2_PIN) +#define HAL_BOARD_TEST3_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST3_PORT, HAL_BOARD_IO_TEST3_PIN) +#define HAL_BOARD_TEST4_VAL() MCU_IO_GET(HAL_BOARD_IO_TEST4_PORT, HAL_BOARD_IO_TEST4_PIN) + +//RFID_FLAG +#define HAL_FLAG_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_FLAG_PORT, HAL_BOARD_IO_FLAG_PIN) +#define HAL_FLAG_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_FLAG_PORT, HAL_BOARD_IO_FLAG_PIN) + +// LED +#define HAL_LED_SET_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN) +#define HAL_LED_SET_2() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN) +#define HAL_LED_SET_3() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN) +#define HAL_LED_SET_4() MCU_IO_SET_HIGH(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN) + +#define HAL_LED_CLR_1() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN) +#define HAL_LED_CLR_2() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN) +#define HAL_LED_CLR_3() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN) +#define HAL_LED_CLR_4() MCU_IO_SET_LOW(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN) + + +#define HAL_LED_TGL_1() MCU_IO_TGL(HAL_BOARD_IO_LED_1_PORT, HAL_BOARD_IO_LED_1_PIN) +#define HAL_LED_TGL_2() MCU_IO_TGL(HAL_BOARD_IO_LED_2_PORT, HAL_BOARD_IO_LED_2_PIN) +#define HAL_LED_TGL_3() MCU_IO_TGL(HAL_BOARD_IO_LED_3_PORT, HAL_BOARD_IO_LED_3_PIN) +#define HAL_LED_TGL_4() MCU_IO_TGL(HAL_BOARD_IO_LED_4_PORT, HAL_BOARD_IO_LED_4_PIN) + +//DC +#define HAL_DC_START_1() MCU_IO_SET_HIGH(HAL_BOARD_IO_DC_1_PORT, HAL_BOARD_IO_DC_1_PIN) +#define HAL_DC_START_2() MCU_IO_SET_HIGH(HAL_BOARD_IO_DC_2_PORT, HAL_BOARD_IO_DC_2_PIN) + +#define HAL_DC_STOP_1() MCU_IO_SET_LOW(HAL_BOARD_IO_DC_1_PORT, HAL_BOARD_IO_DC_1_PIN) +#define HAL_DC_STOP_2() MCU_IO_SET_LOW(HAL_BOARD_IO_DC_2_PORT, HAL_BOARD_IO_DC_2_PIN) + +//TC72 +#define HAL_TC72_SDI_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SDI_PORT, HAL_BOARD_IO_TC72_SDI_PIN) +#define HAL_TC72_SCL_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SCL_PORT, HAL_BOARD_IO_TC72_SCL_PIN) +#define HAL_TC72_SSS_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SSS_PORT, HAL_BOARD_IO_TC72_SSS_PIN) + +#define HAL_TC72_SDI_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_TC72_SDI_PORT, HAL_BOARD_IO_TC72_SDI_PIN) +#define HAL_TC72_SCL_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_TC72_SCL_PORT, HAL_BOARD_IO_TC72_SCL_PIN) +#define HAL_TC72_SSS_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_TC72_SSS_PORT, HAL_BOARD_IO_TC72_SSS_PIN) + +#define HAL_TC72_SDO_VAL() MCU_IO_GET(HAL_BOARD_IO_TC72_SDO_PORT, HAL_BOARD_IO_TC72_SDO_PIN) + +#define HAL_TC72_SDO_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_TC72_SDO_PORT, HAL_BOARD_IO_TC72_SDO_PIN) + +//AT24C02(E2PROM) +#define HAL_E2PROM_SCL_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,0) +//#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,1) +//#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,MCU_IO_PULLUP) + +#define HAL_E2PROM_SCL_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN) +#define HAL_E2PROM_SCL_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN) + +//#define HAL_E2PROM_SDA_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) +//#define HAL_E2PROM_SDA_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) + +//#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) + +//ITG +#define HAL_E2PROM_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,1) +#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,1) +#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,MCU_IO_PULLUP) + +#define HAL_E2PROM_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,1) +#define HAL_E2PROM_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,0) + +#define HAL_E2PROM_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,1) +#define HAL_E2PROM_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,0) + +#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN) + +// LED_ALL +#define HAL_LED_PORT(val) MCU_PORT_OUTPUT(HAL_BOARD_IO_LED_DATA_PORT, val) + +// SPI +#define HAL_SPI_INIT() {MCU_IO_OUTPUT(HAL_BOARD_IO_SPI_MOSI_PORT, HAL_BOARD_IO_SPI_MOSI_PIN, 1);MCU_IO_OUTPUT(HAL_BOARD_IO_SPI_CLK_PORT, HAL_BOARD_IO_SPI_CLK_PIN, 1);MCU_IO_OUTPUT(HAL_BOARD_IO_SPI_CS_PORT, HAL_BOARD_IO_SPI_CS_PIN, 1);MCU_IO_INPUT(HAL_BOARD_IO_SPI_MISO_PORT, HAL_BOARD_IO_SPI_MISO_PIN,MCU_IO_PULLUP);} + +#define HAL_SPI_MOSI_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_SPI_MOSI_PORT, HAL_BOARD_IO_SPI_MOSI_PIN) +#define HAL_SPI_MOSI_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_SPI_MOSI_PORT, HAL_BOARD_IO_SPI_MOSI_PIN) + +#define HAL_SPI_CLK_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_SPI_CLK_PORT, HAL_BOARD_IO_SPI_CLK_PIN) +#define HAL_SPI_CLK_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_SPI_CLK_PORT, HAL_BOARD_IO_SPI_CLK_PIN) + +#define HAL_SPI_CS_EN() MCU_IO_SET_LOW(HAL_BOARD_IO_SPI_CS_PORT, HAL_BOARD_IO_SPI_CS_PIN) +#define HAL_SPI_CS_DIS() MCU_IO_SET_HIGH(HAL_BOARD_IO_SPI_CS_PORT, HAL_BOARD_IO_SPI_CS_PIN) + +#define HAL_SPI_MISO_VAL() MCU_IO_GET(HAL_BOARD_IO_SPI_MISO_PORT, HAL_BOARD_IO_SPI_MISO_PIN) + +//SHT +#define HAL_SHT_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_SHT_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1)//MCU_IO_SET_HIGH(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN) +#define HAL_SHT_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0)//MCU_IO_SET_LOW(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN) + +#define HAL_SHT_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1)//MCU_IO_SET_HIGH(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define HAL_SHT_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0)//MCU_IO_SET_LOW(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define HAL_SHT_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_SHT_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,MCU_IO_PULLUP) +#define HAL_SHT_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) + +//SR04£¨³¬Éù²¨£© + +#define HAL_SHT_TX_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SR04_TX_PORT, HAL_BOARD_IO_SR04_TX_PIN,0) +#define HAL_SHT_TX_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SR04_TX_PORT, HAL_BOARD_IO_SR04_TX_PIN,1) +#define HAL_SHT_TX_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SR04_TX_PORT, HAL_BOARD_IO_SR04_TX_PIN,0) + +#define HAL_SHT_RX_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SR04_RX_PORT, HAL_BOARD_IO_SR04_RX_PIN,MCU_IO_PULLUP) +#define HAL_SHT_RX_VAL() MCU_IO_GET(HAL_BOARD_IO_SR04_RX_PORT, HAL_BOARD_IO_SR04_RX_PIN) + +//flame(»ðÑæ) +#define HAL_SHT_FLAME_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH,MCU_IO_PULLUP) +#define HAL_SHT_FLAME_VAL() MCU_IO_GET(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH) + +//TCS(ÑÕÉ«) +#define HAL_SHT_S2_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S2_PORT, HAL_BOARD_IO_TCS_S2_PIN,0) +#define HAL_SHT_S2_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S2_PORT, HAL_BOARD_IO_TCS_S2_PIN,1) +#define HAL_SHT_S2_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S2_PORT, HAL_BOARD_IO_TCS_S2_PIN,0) + +#define HAL_SHT_S3_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S3_PORT, HAL_BOARD_IO_TCS_S3_PIN,0) +#define HAL_SHT_S3_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S3_PORT, HAL_BOARD_IO_TCS_S3_PIN,1) +#define HAL_SHT_S3_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_TCS_S3_PORT, HAL_BOARD_IO_TCS_S3_PIN,0) + +// I2C +#define HAL_I2C_SCL_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_I2C_SCL_PORT, HAL_BOARD_IO_I2C_SCL_PIN,0) +#define HAL_I2C_SCL_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_I2C_SCL_PORT, HAL_BOARD_IO_I2C_SCL_PIN) +#define HAL_I2C_SCL_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_I2C_SCL_PORT, HAL_BOARD_IO_I2C_SCL_PIN) + +#define HAL_I2C_SDA_SET() MCU_IO_SET_HIGH(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN) +#define HAL_I2C_SDA_CLR() MCU_IO_SET_LOW(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN) +#define HAL_I2C_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN,1) +#define HAL_I2C_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN,MCU_IO_PULLUP) +#define HAL_I2C_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_I2C_SDA_PORT, HAL_BOARD_IO_I2C_SDA_PIN) + +// DO +#define HAL_DO_OFF() MCU_IO_SET_HIGH(HAL_BOARD_IO_DO_PORT, HAL_BOARD_IO_DO_PIN) +#define HAL_DO_ON() MCU_IO_SET_LOW(HAL_BOARD_IO_DO_PORT, HAL_BOARD_IO_DO_PIN) +#define HAL_DO_OUTPUT() MCU_IO_OUTPUT(HAL_BOARD_IO_DO_PORT, HAL_BOARD_IO_DO_PIN, 1) + +//INT +#define HAL_INT_VAL() MCU_IO_GET(HAL_BOARD_IO_INT_PORT, HAL_BOARD_IO_INT_PIN) + +//OUT +#define HAL_OUT_VAL() MCU_IO_GET(HAL_BOARD_IO_OUT_PORT, HAL_BOARD_IO_OUT_PIN) + + +//------------------------------------------------------------------- +// FUNCTION PROTOTYPES +//------------------------------------------------------------------- +void halBoardInit(void); + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.c new file mode 100644 index 0000000..1980f63 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.c @@ -0,0 +1,98 @@ +//------------------------------------------------------------------- +// Filename: hal_led.c +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_led.h" + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halLedSet +// @brief Turn LED on. +// @param uint8 id - led to set +// @return none +//------------------------------------------------------------------- +void halLedSet(uint8 id) +{ + switch (id) + { + case 1: + HAL_LED_SET_1(); + break; + case 2: + HAL_LED_SET_2(); + break; + case 3: + HAL_LED_SET_3(); + break; + case 4: + HAL_LED_SET_4(); + break; + + default: + break; + } +} + +//------------------------------------------------------------------- +// @fn halLedClear +// @brief Turn LED off. +// @param uint8 id - led to clear +// @return none +//------------------------------------------------------------------- +void halLedClear(uint8 id) +{ + switch (id) + { + case 1: + HAL_LED_CLR_1(); + break; + case 2: + HAL_LED_CLR_2(); + break; + case 3: + HAL_LED_CLR_3(); + break; + case 4: + HAL_LED_CLR_4(); + break; + default: + break; + } +} + +//------------------------------------------------------------------- +// @fn halLedToggle +// @brief Change state of LED. If on, turn it off. Else turn on. +// @param uint8 id - led to toggle +// @return none +//------------------------------------------------------------------- +void halLedToggle(uint8 id) +{ + switch (id) + { + case 1: + HAL_LED_TGL_1(); + break; + case 2: + HAL_LED_TGL_2(); + break; + case 3: + HAL_LED_TGL_3(); + break; + case 4: + HAL_LED_TGL_4(); + break; + default: + break; + } +} + +//------------------------------------------------------------------- diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.h new file mode 100644 index 0000000..1591503 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/board/hal_led.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: hal_led.h +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halLedSet(uint8 led_id); +void halLedClear(uint8 led_id); +void halLedToggle(uint8 led_id); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.c new file mode 100644 index 0000000..1ec78ce --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.c @@ -0,0 +1,57 @@ +#include "hal_defs.h" +#include "hal_led.h" +#include "TIMER.h" + + +uint8 SEND_DATA_FLAG = 0; +uint16 NUM = 0; + +void Timer4_Init(void) +{ + // Set prescaler divider value to 128 (32M/128 = 250KHZ) + T4CTL |= 0xE0; + T4CTL &= ~(0x10); // Stop timer + T4CTL &= ~(0x08); // ½ûÖ¹Òç³öÖÐ¶Ï + T4CTL |= 0x04; //¼ÆÊýÆ÷ÇåÁã + T4IE = 0; // Disable interrupt +} + +void Timer4_On(void) +{ + T4CTL |= 0x08; //ʹÄÜÒç³öÖÐ¶Ï + T4CTL &= ~(0x03);//0x00-0xFF + T4CTL |= 0x10; // Start timer + T4IE = 1; // Enable interrupt +} + +void Timer4_Off(void) +{ + T4CTL &= ~(0x08); // ½ûÖ¹Òç³öÖÐ¶Ï + T4CTL &= ~(0x10); // Stop timer + T4IE = 0; // Disable interrupt +} + +uint8 GetSendDataFlag(void) +{ + return SEND_DATA_FLAG; +} + + + +HAL_ISR_FUNCTION(T4_ISR, T4_VECTOR) +{ + T4OVFIF = 0; + T4IF = 0; + + NUM ++; + if(NUM == 500)//1953) //¶¨Ê±2s£¬·­×ªÒ»´Î£¨1/250000*256£©ÕâÊǽøÒ»´ÎÖжÏËùÐèÒªµÄʱ¼ä£¬½ø781´ÎÖжϴóÔ¼ÊÇ0.8s + { + NUM = 0; + SEND_DATA_FLAG = 1; + //halLedToggle(1); + } + else + { + SEND_DATA_FLAG = 0; + } +} \ No newline at end of file diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.h new file mode 100644 index 0000000..16a4653 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/TIMER.h @@ -0,0 +1,4 @@ +void Timer4_Init(void); +void Timer4_On(void); +void Timer4_Off(void); +uint8 GetSendDataFlag(void); \ No newline at end of file diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.c new file mode 100644 index 0000000..04d7258 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.c @@ -0,0 +1,56 @@ +//------------------------------------------------------------------- +// Filename: hal_adc.c +// Description: These functions/macros simplifies usage of the ADC. +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_adc.h" + +//------------------------------------------------------------------- +// @fn adcSampleSingle +// @brief +// This function makes the adc sample the given channel at the given +// resolution with the given reference. +// @param uint8 reference +// The reference to compare the channel to be sampled. +// uint8 resolution +// The resolution to use during the sample (8, 10, 12 or 14 bit) +// uint8 input +// The channel to be sampled. +// @return int16 +// The conversion result +//------------------------------------------------------------------- +unsigned int adcSampleSingle(uint8 reference, uint8 resolution, uint8 channel) +{ + unsigned int value; + + ADC_ENABLE_CHANNEL(channel); + + ADCIF = 0; + ADC_SINGLE_CONVERSION(reference | resolution | channel); + while (!ADCIF) + ; + + value = ((unsigned int) ADCH) << 8; + value |= (unsigned int) ADCL; + + if(value & 0x8000) + { + value = 0; + } + + value = value & 0x7FF8; + + ADC_DISABLE_CHANNEL(channel); + + // The variable 'value' contains 16 bits where + // bit 15 is a sign bit + // bit [14 .. 0] contain the absolute sample value + // Only the r upper bits are significant, where r is the resolution + // Resolution: + // 12 -> [14 .. 3] (bitmask 0x7FF8) + // 10 -> [14 .. 5] (bitmask 0x7FE0) + // 9 -> [14 .. 6] (bitmask 0x7FC0) + // 7 -> [14 .. 8] (bitmask 0x7F00) + + return value; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.h new file mode 100644 index 0000000..309c674 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_adc.h @@ -0,0 +1,86 @@ +//------------------------------------------------------------------- +// Filename: hal_adc.h +// Description: These functions/macros simplifies usage of the ADC. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND MACROS +//------------------------------------------------------------------- +// Macro for setting up a single conversion. If ADCCON1.STSEL = 11, using this +// macro will also start the conversion. +#define ADC_SINGLE_CONVERSION(settings) st( ADCCON3 = (settings); ) + +// Macro for setting up a single conversion +#define ADC_SEQUENCE_SETUP(settings) st( ADCCON2 = (settings); ) + +// Where _settings_ are the following: +// Reference voltage: +#define ADC_REF_1_25_V 0x00 // Internal 1.25V reference +#define ADC_REF_P0_7 0x40 // External reference on AIN7 pin +#define ADC_REF_AVDD 0x80 // AVDD_SOC pin +#define ADC_REF_P0_6_P0_7 0xC0 // External reference on AIN6-AIN7 differential input + +// Resolution (decimation rate): +#define ADC_7_BIT 0x00 // 64 decimation rate +#define ADC_9_BIT 0x10 // 128 decimation rate +#define ADC_10_BIT 0x20 // 256 decimation rate +#define ADC_12_BIT 0x30 // 512 decimation rate + +// Input channel: +#define ADC_AIN0 0x00 // single ended P0_0 +#define ADC_AIN1 0x01 // single ended P0_1 +#define ADC_AIN2 0x02 // single ended P0_2 +#define ADC_AIN3 0x03 // single ended P0_3 +#define ADC_AIN4 0x04 // single ended P0_4 +#define ADC_AIN5 0x05 // single ended P0_5 +#define ADC_AIN6 0x06 // single ended P0_6 +#define ADC_AIN7 0x07 // single ended P0_7 +#define ADC_GND 0x0C // Ground +#define ADC_TEMP_SENS 0x0E // on-chip temperature sensor +#define ADC_VDD_3 0x0F // (vdd/3) + +// Macro for starting the ADC in continuous conversion mode +#define ADC_SAMPLE_CONTINUOUS() \ +st( ADCCON1 &= ~0x30; \ +ADCCON1 |= 0x10; ) + +// Macro for stopping the ADC in continuous mode +#define ADC_STOP() st( ADCCON1 |= 0x30; ) + +// Macro for initiating a single sample in single-conversion mode (ADCCON1.STSEL = 11). +#define ADC_SAMPLE_SINGLE() \ +st( ADC_STOP(); \ +ADCCON1 |= 0x40; ) + +// Macro for configuring the ADC to be started from T1 channel 0. (T1 ch 0 must be in compare mode!!) +#define ADC_TRIGGER_FROM_TIMER1() \ +st( ADC_STOP(); \ +ADCCON1 &= ~0x10; ) + +// Expression indicating whether a conversion is finished or not. +#define ADC_SAMPLE_READY() st( ADCCON1 & 0x80; ) + +// Macro for setting/clearing a channel as input of the ADC +#define ADC_ENABLE_CHANNEL(ch) ADCCFG |= (0x01 << ch) +#define ADC_DISABLE_CHANNEL(ch) ADCCFG &= ~(0x01 << ch) + + +// Macros for configuring the ADC input: +// Example usage: +// IO_ADC_PORT0_PIN(0, IO_ADC_EN); +// IO_ADC_PORT0_PIN(4, IO_ADC_DIS); +// IO_ADC_PORT0_PIN(6, IO_ADC_EN); + +#define IO_ADC_PORT0_PIN(pin, adcEn) \ +st( if (adcEn) \ +ADCCFG |= BM( pin ); \ +else \ +ADCCFG &= ~BM( pin ) ) + +// where adcEn is one of: +#define IO_ADC_EN 1 // ADC input enabled +#define IO_ADC_DIS 0 // ADC input disab + +//------------------------------------------------------------------- +// PUBLIC FUNCTIONS +//------------------------------------------------------------------- +unsigned int adcSampleSingle(uint8 reference, uint8 resolution, uint8 channel); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_cc8051.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_cc8051.h new file mode 100644 index 0000000..d59f7f6 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_cc8051.h @@ -0,0 +1,53 @@ +//------------------------------------------------------------------- +// Filename: hal_cc8051.h +//------------------------------------------------------------------- +//------------------------------------------------------------------- +//CONSTANTS +//------------------------------------------------------------------- +#define BIT0 0x01 +#define BIT1 0x02 +#define BIT2 0x04 +#define BIT3 0x08 +#define BIT4 0x10 +#define BIT5 0x20 +#define BIT6 0x40 +#define BIT7 0x80 + +//------------------------------------------------------------------- +//MACROS +//------------------------------------------------------------------- +#define MCU_IO_TRISTATE 1 // Used as "func" for the macros below +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +//----------------------------------------------------------------------------- +// Macros for simple configuration of IO pins on TI LPW SoCs +//----------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL(port, pin) MCU_IO_PERIPHERAL_PREP(port, pin) +#define MCU_IO_INPUT(port, pin, func) MCU_IO_INPUT_PREP(port, pin, func) +#define MCU_IO_OUTPUT(port, pin, val) MCU_IO_OUTPUT_PREP(port, pin, val) +#define MCU_IO_SET(port, pin, val) MCU_IO_SET_PREP(port, pin, val) +#define MCU_IO_SET_HIGH(port, pin) MCU_IO_SET_HIGH_PREP(port, pin) +#define MCU_IO_SET_LOW(port, pin) MCU_IO_SET_LOW_PREP(port, pin) +#define MCU_IO_TGL(port, pin) MCU_IO_TGL_PREP(port, pin) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_DIR_INPUT(port, pin) MCU_IO_DIR_INPUT_PREP(port, pin) +#define MCU_IO_DIR_OUTPUT(port, pin) MCU_IO_DIR_OUTPUT_PREP(port, pin) +#define MCU_PORT_SET_OUTPUT(port, val) MCU_PORT_SET_OUTPUT_PREP(port, val) +#define MCU_PORT_OUTPUT(port, val) MCU_PORT_OUTPUT_PREP(port, val) + +//---------------------------------------------------------------------------------- +// Macros for internal use (the macros above need a new round in the preprocessor) +//---------------------------------------------------------------------------------- +#define MCU_IO_PERIPHERAL_PREP(port, pin) st( P##port##SEL |= BM(pin); ) +#define MCU_IO_INPUT_PREP(port, pin, func) st( P##port##SEL &= ~BM(pin); P##port##DIR &= ~BM(pin); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_OUTPUT_PREP(port, pin, val) st( P##port##SEL &= ~BM(pin); P##port##_##pin## = val; P##port##DIR |= BM(pin); ) +#define MCU_IO_SET_HIGH_PREP(port, pin) st( P##port##_##pin## = 1; ) +#define MCU_IO_SET_LOW_PREP(port, pin) st( P##port##_##pin## = 0; ) +#define MCU_IO_SET_PREP(port, pin, val) st( P##port##_##pin## = val; ) +#define MCU_IO_TGL_PREP(port, pin) st( P##port##_##pin## ^= 1; ) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) +#define MCU_IO_DIR_INPUT_PREP(port, pin) st( P##port##DIR &= ~BM(pin); ) +#define MCU_IO_DIR_OUTPUT_PREP(port, pin) st( P##port##DIR |= BM(pin); ) +#define MCU_PORT_SET_OUTPUT_PREP(port, val) st( P##port##SEL = 0x00; P##port## = val; P##port##DIR = 0xff; ) +#define MCU_PORT_OUTPUT_PREP(port, val) st( P##port## = val; ) diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.c new file mode 100644 index 0000000..fa4351a --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.c @@ -0,0 +1,75 @@ +//------------------------------------------------------------------- +// Filename: hal_clock.c +// Description: This file defines clock related functions for the CC253x family +// of RF system-on-chips from Texas Instruments. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_clock.h" + +//------------------------------------------------------------------- +// PUBLIC FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn clockSetMainSrc +// @brief Function for setting the main system clock source. +// The function turns off the clock source that is not being used. +// TICKSPD is set to the same frequency as the source. +// @param uint8 source (one of CLOCK_SRC_HFRC or CLOCK_SRC_XOSC) +// @return void +//------------------------------------------------------------------- +void clockSetMainSrc(uint8 source) +{ + register uint8 osc32k_bm = CLKCONCMD &CLKCON_OSC32K_BM; + + // Source can have the following values: + // CLOCK_SRC_XOSC 0x00 High speed Crystal Oscillator (XOSC) + // CLOCK_SRC_HFRC 0x01 Low power RC Oscillator (HFRC) + + SLEEPCMD &= ~SLEEP_OSC_PD_BM; // power up both oscillators + while (!CC2530_IS_HFRC_STABLE() || ((SLEEPSTA &SLEEP_OSC_PD_BM) != 0)) + ; + // wait until the oscillator is stable + NOP(); + + if (source == CLOCK_SRC_HFRC) + { + CLKCONCMD = (osc32k_bm | CLKCON_OSC_BM | TICKSPD_DIV_2 | CLKCON_CLKSPD_BM); + } + else if (source == CLOCK_SRC_XOSC) + { + CLKCONCMD = (osc32k_bm | TICKSPD_DIV_1); + } + CC2530_WAIT_CLK_UPDATE(); + SLEEPCMD |= SLEEP_OSC_PD_BM; // power down the unused oscillator +} + +//------------------------------------------------------------------- +// @fn clockSelect32k +// @brief Function for selecting source for the 32kHz oscillator +// @param uint8 source (one of CLOCK_32K_XTAL or CLOCK_32K_RCOSC) +// @return uint8 - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 clockSelect32k(uint8 source) +{ + // System clock source must be high frequency RC oscillator before + // changing 32K source. + if (!(CLKCONSTA &CLKCON_OSC_BM)) + { + return FAILED; + } + + if (source == CLOCK_32K_XTAL) + { + CLKCONCMD &= ~CLKCON_OSC32K_BM; + } + else if (source == CLOCK_32K_RCOSC) + { + CLKCONCMD |= CLKCON_OSC32K_BM; + } + CC2530_WAIT_CLK_UPDATE(); + + return SUCCESS; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.h new file mode 100644 index 0000000..c664467 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_clock.h @@ -0,0 +1,66 @@ +//------------------------------------------------------------------- +// Filename: hal_clock.h +// Description: This file defines interface for clock related functions +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS +//------------------------------------------------------------------- +// SEE DATA SHEET FOR DETAILS ABOUT THE FOLLOWING BIT MASKS + +// Parameters for cc2530ClockSetMainSrc +#define CLOCK_SRC_XOSC 0 // High speed Crystal Oscillator Control +#define CLOCK_SRC_HFRC 1 // Low power RC Oscillator + +// Parameters for cc2530ClockSelect32k +#define CLOCK_32K_XTAL 0 // 32.768 Hz crystal oscillator +#define CLOCK_32K_RCOSC 1 // 32 kHz RC oscillator + +// Bit masks to check CLKCON register +#define CLKCON_OSC32K_BM 0x80 // bit mask, for the slow 32k clock oscillator +#define CLKCON_OSC_BM 0x40 // bit mask, for the system clock oscillator +#define CLKCON_TICKSPD_BM 0x38 // bit mask, for timer ticks output setting +#define CLKCON_CLKSPD_BM 0x01 // bit maks, for the clock speed + +#define TICKSPD_DIV_1 (0x00 << 3) +#define TICKSPD_DIV_2 (0x01 << 3) +#define TICKSPD_DIV_4 (0x02 << 3) +#define TICKSPD_DIV_8 (0x03 << 3) +#define TICKSPD_DIV_16 (0x04 << 3) +#define TICKSPD_DIV_32 (0x05 << 3) +#define TICKSPD_DIV_64 (0x06 << 3) +#define TICKSPD_DIV_128 (0x07 << 3) + +// Bit masks to check SLEEPSTA register +#define SLEEP_XOSC_STB_BM 0x40 // bit mask, check the stability of XOSC +#define SLEEP_HFRC_STB_BM 0x20 // bit maks, check the stability of the High-frequency RC oscillator +#define SLEEP_OSC_PD_BM 0x04 // bit mask, power down system clock oscillator(s) + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +// Macro for checking status of the high frequency RC oscillator. +#define CC2530_IS_HFRC_STABLE(x) (SLEEPSTA & SLEEP_HFRC_STB_BM) + +// Macro for checking status of the crystal oscillator +#define CC2530_IS_XOSC_STABLE(x) (SLEEPSTA & SLEEP_XOSC_STB_BM) + +// Macro for getting the clock division factor +#define CC2530_GET_CLKSPD(x) (CLKCONSTA & CLKCON_CLKSPD_BM) + +// Macro for getting the timer tick division factor. +#define CC2530_GET_TICKSPD(x) ((CLKCONSTA & CLKCON_TICKSPD_BM) >> 3) + +// Macro for setting the clock division factor, x value from 0b000 to 0b111 +#define CC2530_SET_TICKSPD(x) st( CLKCONCMD = ((((x) << 3) & 0x38) | (CLKCONCMD & 0xC7)); ) + +// Macro for setting the timer tick division factor, x value from 0b000 to 0b111 +#define CC2530_SET_CLKSPD(x) st( CLKCONCMD = (((x) & 0x07)| (CLKCONCMD & 0xF8)); ) + +// Macro for waiting for clock updates +#define CC2530_WAIT_CLK_UPDATE() st( uint8 ____clkcon; uint8 ____clkconsta; ____clkcon = CLKCONCMD; do { ____clkconsta = CLKCONSTA; } while (____clkconsta != ____clkcon); ) + +//------------------------------------------------------------------- +// FUNCTIONS +//------------------------------------------------------------------- +void clockSetMainSrc(uint8 source); +uint8 clockSelect32k(uint8 source); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_defs.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_defs.h new file mode 100644 index 0000000..84c14d7 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_defs.h @@ -0,0 +1,105 @@ +//------------------------------------------------------------------- +// Filename: hal_defs.h +// Description: HAL defines +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef signed char int8; +typedef unsigned char uint8; + +typedef signed short int16; +typedef unsigned short uint16; + +typedef signed long int32; +typedef unsigned long uint32; + +typedef void(*ISR_FUNC_PTR)(void); +typedef void(*VFPTR)(void); + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +#define TRUE 1 +#define FALSE 0 +#define NULL (void *)0 + +#define SUCCESS 0 +#define FAILED 1 + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define BV(n) (1 << (n)) + +#define BM(n) (1 << (n)) + +#define BF(x,b,s) (((x) & (b)) >> (s)) + +#define MIN(n,m) (((n) < (m)) ? (n) : (m)) + +#define MAX(n,m) (((n) < (m)) ? (m) : (n)) + +#define ABS(n) (((n) < 0) ? -(n) : (n)) + +// uint32 processing +#define BREAK_UINT32( var, ByteNum ) (uint8)((uint32)(((var) >>((ByteNum) * 8)) & 0x00FF)) +#define BUILD_UINT32(Byte0, Byte1, Byte2, Byte3) ((uint32)((uint32)((Byte0) & 0x00FF) + ((uint32)((Byte1) & 0x00FF) << 8) + ((uint32)((Byte2) & 0x00FF) << 16) + ((uint32)((Byte3) & 0x00FF) << 24))) + +#define HI_UINT32(a) ((uint16) (((uint32)(a)) >> 16)) +#define LO_UINT32(a) ((uint16) ((uint32)(a))) + +// uint16 processing +#define BUILD_UINT16(loByte, hiByte) ((uint16)(((loByte) & 0x00FF) + (((hiByte) & 0x00FF) << 8))) + +#define HI_UINT16(a) (((uint16)(a) >> 8) & 0xFF) +#define LO_UINT16(a) ((uint16)(a) & 0xFF) + +// uint16 processing +#define BUILD_UINT8(hiByte, loByte) ((uint8)(((loByte) & 0x0F) + (((hiByte) & 0x0F) << 4))) + +#define HI_UINT8(a) (((uint8)(a) >> 4) & 0x0F) +#define LO_UINT8(a) ((uint8)(a) & 0x0F) + +//------------------------------------------------------------------- +// This macro is for use by other macros to form a fully valid C statement. +// Without this, the if/else conditionals could show unexpected behavior. +// +// For example, use... +// #define SET_REGS() st( ioreg1 = 0; ioreg2 = 0; ) +// instead of ... +// #define SET_REGS() { ioreg1 = 0; ioreg2 = 0; } +// or +// #define SET_REGS() ioreg1 = 0; ioreg2 = 0; +// The last macro would not behave as expected in the if/else construct. +// The second to last macro will cause a compiler error in certain uses +// of if/else construct +// +// It is not necessary, or recommended, to use this macro where there is +// already a valid C statement. For example, the following is redundant... +// #define CALL_FUNC() st( func(); ) +// This should simply be... +// #define CALL_FUNC() func() +// +// (The while condition below evaluates false without generating a +// constant-controlling-loop type of warning on most compilers.) +//------------------------------------------------------------------- +#define st(x) do { x } while (__LINE__ == -1) + +//------------------------------------------------------------------- +// Compiler abstraction +//------------------------------------------------------------------- +#define _PRAGMA(x) _Pragma(#x) + +#define FAR +#define NOP() asm("NOP") + +#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__ +#define HAL_ISR_FUNC_DECLARATION(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNC_PROTOTYPE(f,v) _PRAGMA(vector=v) __near_func __interrupt void f(void) +#define HAL_ISR_FUNCTION(f,v) HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v) diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.c new file mode 100644 index 0000000..4c5fd79 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.c @@ -0,0 +1,492 @@ +//------------------------------------------------------------------- +// Filename: hal_digio.c +// Description: HAL digital IO functionality +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" +#include "hal_digio.h" + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- + +static ISR_FUNC_PTR port0_isr_tbl[8] = +{ + 0 +}; +static ISR_FUNC_PTR port1_isr_tbl[8] = +{ + 0 +}; +static ISR_FUNC_PTR port2_isr_tbl[5] = +{ + 0 +}; + + +// Find a better place for this! +#define PICTL_PADSC_BM 0x80 +#define PICTL_P2IEN_BM 0x40 +#define PICTL_P0IENH_BM 0x20 +#define PICTL_P0IENL_BM 0x10 +#define PICTL_P2ICON_BM 0x08 +#define PICTL_P1ICONH_BM 0x04 +#define PICTL_P1ICONL_BM 0x02 +#define PICTL_P1ICON_BM 0x06 // Combined - for compatibility +#define PICTL_P0ICON_BM 0x01 + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halDigioConfig +// @brief Configure the pin as specified by p. +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- + +//comment: find better way of doing this. SFR registers can not be accessed by pointers, therefore code is different from MSP430 code +// comment: currently support only P0 and P1 +uint8 halDigioConfig(const digioConfig *p) +{ + // register volatile uint8* dir; + register const uint8 bitmask = p->pin_bm; + + // Sanity check + if ((bitmask == 0) || (bitmask != (uint8)BV(p->pin))) + { + return (HAL_DIGIO_ERROR); + } + + switch (p->port) + { + case 0: + P0SEL &= ~bitmask; + if (p->dir == HAL_DIGIO_OUTPUT) + { + if (p->initval == 1) + { + P0 |= bitmask; + } + else + { + P0 &= ~bitmask; + } + P0DIR |= bitmask; + } + else + // input + { + P0DIR &= ~bitmask; + } + break; + case 1: + P1SEL &= ~bitmask; + if (p->dir == HAL_DIGIO_OUTPUT) + { + if (p->initval == 1) + { + P1 |= bitmask; + } + else + { + P1 &= ~bitmask; + } + P1DIR |= bitmask; + } + else + // input + { + P1DIR &= ~bitmask; + } + break; + case 2: + P2SEL &= ~bitmask; + if (p->dir == HAL_DIGIO_OUTPUT) + { + if (p->initval == 1) + { + P2 |= bitmask; + } + else + { + P2 &= ~bitmask; + } + P2DIR |= bitmask; + } + else + // input + { + P2DIR &= ~bitmask; + } + break; + //case 1: P1SEL &= ~bitmask; out = &P1OUT; dir = &P1DIR; break; + //case 2: P2SEL &= ~bitmask; out = &P2OUT; dir = &P2DIR; break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + + +//------------------------------------------------------------------- +// @fn halDigioSet +// @brief Set output pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioSet(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_OUTPUT) + { + switch (p->port) + { + case 0: + P0 |= p->pin_bm; + break; + case 1: + P1 |= p->pin_bm; + break; + case 2: + P2 |= p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); + } + return (HAL_DIGIO_ERROR); +} + + +//------------------------------------------------------------------- +// @fn halDigioClear +// @brief Clear output pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioClear(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_OUTPUT) + { + switch (p->port) + { + case 0: + P0 &= ~p->pin_bm; + break; + case 1: + P1 &= ~p->pin_bm; + break; + case 2: + P2 &= ~p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); + } + return (HAL_DIGIO_ERROR); +} + +//------------------------------------------------------------------- +// @fn halDigioToggle +// @brief Toggle output pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioToggle(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_OUTPUT) + { + switch (p->port) + { + case 0: + P0 ^= p->pin_bm; + break; + case 1: + P1 ^= p->pin_bm; + break; + case 2: + P2 ^= p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); + } + return (HAL_DIGIO_ERROR); +} + +//------------------------------------------------------------------- +// @fn halDigioGet +// @brief Get value on input pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioGet(const digioConfig *p) +{ + if (p->dir == HAL_DIGIO_INPUT) + { + switch (p->port) + { + case 0: + return (P0 &p->pin_bm ? 1 : 0); + case 1: + return (P1 &p->pin_bm ? 1 : 0); + case 2: + return (P2 &p->pin_bm ? 1 : 0); + default: + break; + } + } + return (HAL_DIGIO_ERROR); +} + +//------------------------------------------------------------------- +// @fn halDigioIntConnect +// @brief Connect function to IO interrupt +// @param digioConfig* p - pointer to configuration structure for IO pin +// ISR_FUNC_PTR func - pointer to function +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntConnect(const digioConfig *p, ISR_FUNC_PTR func) +{ + istate_t key; + HAL_INT_LOCK(key); + switch (p->port) + { + case 0: + port0_isr_tbl[p->pin] = func; + break; + case 1: + port1_isr_tbl[p->pin] = func; + break; + case 2: + port2_isr_tbl[p->pin] = func; + break; + default: + HAL_INT_UNLOCK(key); + return (HAL_DIGIO_ERROR); + } + halDigioIntClear(p); + HAL_INT_UNLOCK(key); + return (HAL_DIGIO_OK); +} + + +//------------------------------------------------------------------- +// @fn halDigioIntEnable +// @brief Enable interrupt on IO pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntEnable(const digioConfig *p) +{ + switch (p->port) + { + case 0: + P0IE = 1; // set P0IE bit + P0IEN |= p->pin_bm; + break; + case 1: + IEN2 |= 0x10; // set P1IE bit + P1IEN |= p->pin_bm; + break; + case 2: + IEN2 |= 0x02; // set P2IE bit + P2IEN |= p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn halDigioIntDisable +// @brief Disable interrupt on IO pin +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntDisable(const digioConfig *p) +{ + switch (p->port) + { + case 0: + P0IEN &= ~p->pin_bm; + break; + case 1: + P1IEN &= ~p->pin_bm; + break; + case 2: + P2IEN &= ~p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn halDigioIntClear +// @brief Clear interrupt flag +// @param digioConfig* p - pointer to configuration structure for IO pin +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +uint8 halDigioIntClear(const digioConfig *p) +{ + switch (p->port) + { + case 0: + P0IFG &= ~p->pin_bm; + break; + case 1: + P1IFG &= ~p->pin_bm; + break; + case 2: + P2IFG &= ~p->pin_bm; + break; + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn halDigioIntSetEdge +// @brief Set edge for IO interrupt +// @param digioConfig* p - pointer to configuration structure for IO pin +// edge - HAL_DIGIO_INT_FALLING_EDGE or HAL_DIGIO_INT_RISING_EDGE +// @return uint8 - HAL_DIGIO_ERROR or HAL_DIGIO_OK +//------------------------------------------------------------------- +// Comment: all pins on port are configured at same time +uint8 halDigioIntSetEdge(const digioConfig *p, uint8 edge) +{ + switch (edge) + { + case HAL_DIGIO_INT_FALLING_EDGE: + switch (p->port) + { + case 0: + PICTL |= PICTL_P0ICON_BM; // set P0ICON high + break; + case 1: + PICTL |= PICTL_P1ICON_BM; // set P1ICON high + break; + case 2: + PICTL |= PICTL_P2ICON_BM; // set P2ICON high + break; + default: + return (HAL_DIGIO_ERROR); + } + break; + + case HAL_DIGIO_INT_RISING_EDGE: + switch (p->port) + { + case 0: + PICTL &= ~PICTL_P0ICON_BM; // set P0ICON low + break; + case 1: + PICTL &= ~PICTL_P1ICON_BM; // set P0ICON low + break; + case 2: + PICTL &= ~PICTL_P2ICON_BM; // set P0ICON low + break; + default: + return (HAL_DIGIO_ERROR); + } + break; + + default: + return (HAL_DIGIO_ERROR); + } + return (HAL_DIGIO_OK); +} + +//------------------------------------------------------------------- +// @fn port0_ISR +// @brief ISR framework for P0 digio interrupt +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(port0_ISR, P0INT_VECTOR) +{ + register uint8 i; + P0IF = 0; + if (P0IFG) + { + for (i = 0; i < 8; i++) + { + register const uint8 pinmask = 1 << i; + if (P0IFG &pinmask) + { + if (port0_isr_tbl[i] != 0) + { + (*port0_isr_tbl[i])(); + } + P0IFG &= ~pinmask; + } + } + //__low_power_mode_off_on_exit(); + } +} + +//------------------------------------------------------------------- +// @fn port1_ISR +// @brief ISR framework for P0 digio interrupt +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(port1_ISR, P1INT_VECTOR) +{ + register uint8 i; + P1IF = 0; + if (P1IFG) + { + for (i = 0; i < 8; i++) + { + register const uint8 pinmask = 1 << i; + if (P1IFG &pinmask) + { + if (port1_isr_tbl[i] != 0) + { + (*port1_isr_tbl[i])(); + } + P1IFG &= ~pinmask; + } + } + //__low_power_mode_off_on_exit(); + } +} + +//------------------------------------------------------------------- +// @fn port2_ISR +// @brief ISR framework for P2 digio interrupt +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(port2_ISR, P2INT_VECTOR) +{ + register uint8 i; + P2IF = 0; + if (P2IFG) + { + for (i = 0; i < 5; i++) + { + register const uint8 pinmask = 1 << i; + if (P2IFG &pinmask) + { + if (port2_isr_tbl[i] != 0) + { + (*port2_isr_tbl[i])(); + } + P2IFG &= ~pinmask; + } + } + //__low_power_mode_off_on_exit(); + } +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.h new file mode 100644 index 0000000..e851f23 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_digio.h @@ -0,0 +1,46 @@ +//------------------------------------------------------------------- +// Filename: hal_digio.h +// Description: HAL digital IO functionality +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +enum +{ + HAL_DIGIO_INPUT, HAL_DIGIO_OUTPUT +}; + +enum +{ + HAL_DIGIO_INT_FALLING_EDGE, HAL_DIGIO_INT_RISING_EDGE +}; + +#define HAL_DIGIO_OK 0 +#define HAL_DIGIO_ERROR (~0) + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef struct +{ + uint8 port; // port number + uint8 pin; // pin number + uint8 pin_bm; // pin bitmask + uint8 dir; // direction (input or output) + uint8 initval; // initial value +} digioConfig; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +uint8 halDigioConfig(const digioConfig *p); +uint8 halDigioClear(const digioConfig *p); +uint8 halDigioToggle(const digioConfig *p); +uint8 halDigioSet(const digioConfig *p); +uint8 halDigioGet(const digioConfig *p); + +uint8 halDigioIntConnect(const digioConfig *p, ISR_FUNC_PTR func); +uint8 halDigioIntEnable(const digioConfig *p); +uint8 halDigioIntDisable(const digioConfig *p); +uint8 halDigioIntClear(const digioConfig *p); +uint8 halDigioIntSetEdge(const digioConfig *p, uint8 edge); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.c new file mode 100644 index 0000000..29e52ce --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.c @@ -0,0 +1,60 @@ +//------------------------------------------------------------------- +// Filename: hal_int.c +// Description: HAL interrupt control +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halIntOn +// @brief Enable global interrupts. +// @param none +// @return none +//------------------------------------------------------------------- +void halIntOn(void) +{ + HAL_INT_ON(); +} + +//------------------------------------------------------------------- +// @fn halIntOff +// @brief Turns global interrupts off. +// @param none +// @return none +//------------------------------------------------------------------- +void halIntOff(void) +{ + HAL_INT_OFF(); +} + +//------------------------------------------------------------------- +// @fn halIntLock +// @brief Turns global interrupts off and returns current interrupt state. +// Should always be used together with halIntUnlock(). +// @param none +// @return uint16 - current interrupt state +//------------------------------------------------------------------- +uint16 halIntLock(void) +{ + istate_t key; + HAL_INT_LOCK(key); + return (key); +} + +//------------------------------------------------------------------- +// @fn halIntUnlock +// @brief Set interrupt state back to the state it had before calling halIntLock(). +// Should always be used together with halIntLock(). +// @param key +// @return none +//------------------------------------------------------------------- +void halIntUnlock(uint16 key) +{ + HAL_INT_UNLOCK(key); +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.h new file mode 100644 index 0000000..648e6d3 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_int.h @@ -0,0 +1,21 @@ +//------------------------------------------------------------------- +// Filename: hal_int.h +// Description: HAL interrupt control header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define HAL_INT_ON(x) st( EA = 1; ) +#define HAL_INT_OFF(x) st( EA = 0; ) +#define HAL_INT_LOCK(x) st( (x) = EA; EA = 0; ) +#define HAL_INT_UNLOCK(x) st( EA = (x); ) + +typedef unsigned short istate_t; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halIntOn(void); +void halIntOff(void); +uint16 halIntLock(void); +void halIntUnlock(uint16 key); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.c new file mode 100644 index 0000000..5054eb1 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.c @@ -0,0 +1,116 @@ +//------------------------------------------------------------------- +// Filename: hal_mcu.c +// Description: +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_clock.h" +#include "hal_mcu.h" +#include "hal_board.h" + +//------------------------------------------------------------------- +// @fn halMcuInit +// @brief Set Main Clock source to XOSC +// @param none +// @return none +//------------------------------------------------------------------- +void halMcuInit(void) +{ + clockSetMainSrc(CLOCK_SRC_XOSC); +} + +//------------------------------------------------------------------- +// @fn halMcuWaitUs +// @brief Busy wait function. Waits the specified number of microseconds. Use +// assumptions about number of clock cycles needed for the various +// instructions. This function assumes a 32 MHz clock. +// NB! This function is highly dependent on architecture and compiler! +// @param uint16 usec - number of microseconds delays +// @return none +//------------------------------------------------------------------- +#pragma optimize=none +void halMcuWaitUs(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} + +//------------------------------------------------------------------- +// @fn halMcuWaitMs +// @brief Busy wait function. Waits the specified number of milliseconds. Use +// assumptions about number of clock cycles needed for the various +// instructions. +// NB! This function is highly dependent on architecture and compiler! +// @param uint16 millisec - number of milliseconds delay +// @return none +//------------------------------------------------------------------- +#pragma optimize=none +void halMcuWaitMs(uint16 msec) +{ + while (msec--) + { + halMcuWaitUs(1000); + } +} + +//------------------------------------------------------------------- +// @fn halMcuSetLowPowerMode +// @brief Sets the MCU in a low power mode. Will turn global interrupts on at +// the same time as entering the LPM mode. The MCU must be waken from +// an interrupt (status register on stack must be modified). +// NB! This function is highly dependent on architecture and compiler! +// @param uint8 mode - power mode +// @return none +//------------------------------------------------------------------- +void halMcuSetLowPowerMode(uint8 mode) +{ + char buf[] = "LowPowerMode( )"; + buf[13] = mode + '0'; + // comment: not yet implemented + HAL_ASSERT(buf); +} + + +//------------------------------------------------------------------- +// @fn halMcuReset +// @brief +// Resets the MCU. This utilize the watchdog timer as there is no other way +// for a software reset. The reset will not occur until ~2 ms. +// NB: The function will not return! (hangs until reset) +// Parameters: +// @param void +// @return void +//------------------------------------------------------------------- +void halMcuReset(void) +{ + const uint8 WDT_INTERVAL_MSEC_2 = 0x03; // after ~2 ms + + WDCTL = ((WDCTL &0xFC) | (WDT_INTERVAL_MSEC_2 &0x03)); + // Start watchdog + WDCTL &= ~0x04; // Select watchdog mode + WDCTL |= 0x08; // Enable timer + while (1) + ; + // Halt here until reset +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.h new file mode 100644 index 0000000..6ecb965 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_mcu.h @@ -0,0 +1,17 @@ +//------------------------------------------------------------------- +// Filename: hal_mcu.h +// Description: hal mcu library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halMcuInit(void); +void halMcuWaitUs(uint16 usec); +void halMcuWaitMs(uint16 msec); +void halMcuSetLowPowerMode(uint8 mode); +void halMcuReset(void); +uint8 halMcuGetResetCause(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.c new file mode 100644 index 0000000..d46019d --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.c @@ -0,0 +1,418 @@ +//------------------------------------------------------------------- +// Filename: hal_rf.c +// Description: CC2530 radio interface. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_int.h" +#include "util.h" +#include "hal_rf.h" + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// CC2530 RSSI Offset +#define RSSI_OFFSET 73 + +// Various radio settings +#define AUTO_ACK 0x20 +#define AUTO_CRC 0x40 + +// TXPOWER values +#define CC2530_TXPOWER_MIN_3_DBM 0xB5 +#define CC2530_TXPOWER_0_DBM 0xD5 +#define CC2530_TXPOWER_4_DBM 0xF5 + +#define HAL_RF_TXPOWER_MIN_3_DBM 0 +#define HAL_RF_TXPOWER_0_DBM 1 +#define HAL_RF_TXPOWER_4_DBM 2 + +// RF interrupt flags +#define IRQ_TXDONE 0x02 +#define IRQ_RXPKTDONE 0x40 + +// Selected strobes +#define ISRXON() st(RFST = 0xE3;) +#define ISTXON() st(RFST = 0xE9;) +#define ISTXONCCA() st(RFST = 0xEA;) +#define ISRFOFF() st(RFST = 0xEF;) +#define ISFLUSHRX() st(RFST = 0xEC;) +#define ISFLUSHTX() st(RFST = 0xEE;) + + + +//------------------------------------------------------------------- +// GLOBAL DATA +//------------------------------------------------------------------- + +static const menuItem_t pPowerSettings[] = +{ + "-3dBm", HAL_RF_TXPOWER_MIN_3_DBM, "0dBm", HAL_RF_TXPOWER_0_DBM, "4dBm", HAL_RF_TXPOWER_4_DBM +}; + +const menu_t powerMenu = +{ + pPowerSettings, N_ITEMS(pPowerSettings) +}; + +//------------------------------------------------------------------- +// LOCAL DATA +//------------------------------------------------------------------- + +static ISR_FUNC_PTR pfISR = NULL; + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halRfInit +// @brief Power up, sets default tuning settings, enables autoack, enables random generator. +// @param none +// @return SUCCESS always (for interface compatibility) +//------------------------------------------------------------------- +uint8 halRfInit(void) +{ + // Enable auto ack and auto crc + FRMCTRL0 |= (AUTO_ACK | AUTO_CRC); + + // Write non-default register values + // Tuning settings + TXPOWER = CC2530_TXPOWER_0_DBM; // TX output power ~0 dBm + + // Recommended RX settings + TXFILTCFG = 0x09; + AGCCTRL1 = 0x15; + FSCAL1 = 0x00; + + // Enable random generator -> Not implemented yet + + // Enable CC2591 with High Gain Mode -> Not implemented yet + + // Enable RX interrupt + halRfEnableRxInterrupt(); + + return SUCCESS; +} + +//------------------------------------------------------------------- +// @fn halRfGetChipId +// @brief Get chip id +// @param none +// @return uint8 - result +//------------------------------------------------------------------- +uint8 halRfGetChipId(void) +{ + return CHIPID; +} + +//------------------------------------------------------------------- +// @fn halRfGetChipVer +// @brief Get chip version +// @param none +// @return uint8 - result +//------------------------------------------------------------------- +uint8 halRfGetChipVer(void) +{ + // return major revision (4 upper bits) + return CHVER >> 4; +} + +//------------------------------------------------------------------- +// @fn halRfGetRssiOffset +// @brief Return RSSI Offset +// @param none +// @return uint8 - RSSI offset +//------------------------------------------------------------------- +uint8 halRfGetRssiOffset(void) +{ + return RSSI_OFFSET; +} + +//------------------------------------------------------------------- +// @fn halRfSetChannel +// @brief Set RF channel in the 2.4GHz band. The Channel must be in the range 11-26, +// 11= 2005 MHz, channel spacing 5 MHz. +// @param channel - logical channel number +// @return none +//------------------------------------------------------------------- +void halRfSetChannel(uint8 channel) +{ + FREQCTRL = (MIN_CHANNEL + (channel - MIN_CHANNEL) *CHANNEL_SPACING); +} + +//------------------------------------------------------------------- +// @fn halRfSetShortAddr +// @brief Write short address to chip +// @param none +// @return none +//------------------------------------------------------------------- +void halRfSetShortAddr(uint16 shortAddr) +{ + SHORT_ADDR0 = LO_UINT16(shortAddr); + SHORT_ADDR1 = HI_UINT16(shortAddr); +} + +//------------------------------------------------------------------- +// @fn halRfSetPanId +// @brief Write PAN Id to chip +// @param none +// @return none +//------------------------------------------------------------------- +void halRfSetPanId(uint16 panId) +{ + PAN_ID0 = LO_UINT16(panId); + PAN_ID1 = HI_UINT16(panId); +} + + +//------------------------------------------------------------------- +// @fn halRfSetPower +// @brief Set TX output power +// @param uint8 power - power level: TXPOWER_MIN_4_DBM, TXPOWER_0_DBM, TXPOWER_4_DBM +// @return uint8 - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 halRfSetTxPower(uint8 power) +{ + uint8 n; + + switch (power) + { + case HAL_RF_TXPOWER_MIN_3_DBM: + n = CC2530_TXPOWER_MIN_3_DBM; + break; + case HAL_RF_TXPOWER_0_DBM: + n = CC2530_TXPOWER_0_DBM; + break; + case HAL_RF_TXPOWER_4_DBM: + n = CC2530_TXPOWER_4_DBM; + break; + + default: + return FAILED; + } + + // Set TX power + TXPOWER = n; + + return SUCCESS; +} + +//------------------------------------------------------------------- +// @fn halRfWriteTxBuf +// @brief Write to TX buffer +// @param uint8* pData - buffer to write +// uint8 length - number of bytes +// @return none +//------------------------------------------------------------------- +void halRfWriteTxBuf(uint8 *pData, uint8 length) +{ + uint8 i; + + ISFLUSHTX(); // Making sure that the TX FIFO is empty. + + RFIRQF1 = ~IRQ_TXDONE; // Clear TX done interrupt + + // Insert data + for (i = 0; i < length; i++) + { + RFD = pData[i]; + } +} + + +//------------------------------------------------------------------- +// @fn halRfAppendTxBuf +// @brief Write to TX buffer +// @param uint8* pData - buffer to write +// uint8 length - number of bytes +// @return none +//------------------------------------------------------------------- +void halRfAppendTxBuf(uint8 *pData, uint8 length) +{ + uint8 i; + + // Insert data + for (i = 0; i < length; i++) + { + RFD = pData[i]; + } +} + +//------------------------------------------------------------------- +// @fn halRfReadRxBuf +// @brief Read RX buffer +// @param uint8* pData - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// @return none +//------------------------------------------------------------------- +void halRfReadRxBuf(uint8 *pData, uint8 length) +{ + // Read data + while (length > 0) + { + *pData++ = RFD; + length--; + } +} + + +//------------------------------------------------------------------- +// @fn halRfReadMemory +// @brief Read RF device memory +// @param uint16 addr - memory address +// uint8* pData - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// @return Number of bytes read +//------------------------------------------------------------------- +uint8 halRfReadMemory(uint16 addr, uint8 *pData, uint8 length) +{ + return 0; +} + + +//------------------------------------------------------------------- +// @fn halRfWriteMemory +// @brief Write RF device memory +// @param uint16 addr - memory address +// uint8* pData - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// @return Number of bytes written +//------------------------------------------------------------------- +uint8 halRfWriteMemory(uint16 addr, uint8 *pData, uint8 length) +{ + return 0; +} + +//------------------------------------------------------------------- +// @fn halRfTransmit +// @brief Transmit frame with Clear Channel Assessment. +// @param none +// @return uint8 - SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 halRfTransmit(void) +{ + uint8 status; + + ISTXON(); // Sending + + // Waiting for transmission to finish + while (!(RFIRQF1 &IRQ_TXDONE)) + ; + + RFIRQF1 = ~IRQ_TXDONE; + status = SUCCESS; + + return status; +} + +//------------------------------------------------------------------- +// @fn halRfReceiveOn +// @brief Turn receiver on +// @param none +// @return none +//------------------------------------------------------------------- +void halRfReceiveOn(void) +{ + ISFLUSHRX(); // Making sure that the TX FIFO is empty. + ISRXON(); +} + +//------------------------------------------------------------------- +// @fn halRfReceiveOff +// @brief Turn receiver off +// @param none +// @return none +//------------------------------------------------------------------- +void halRfReceiveOff(void) +{ + ISRFOFF(); + ISFLUSHRX(); // Making sure that the TX FIFO is empty. +} + + +//------------------------------------------------------------------- +// @fn halRfDisableRxInterrupt +// @brief Clear and disable RX interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfDisableRxInterrupt(void) +{ + // disable RXPKTDONE interrupt + RFIRQM0 &= ~BV(6); + // disable general RF interrupts + IEN2 &= ~BV(0); +} + + +//------------------------------------------------------------------- +// @fn halRfEnableRxInterrupt +// @brief Enable RX interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfEnableRxInterrupt(void) +{ + // enable RXPKTDONE interrupt + RFIRQM0 |= BV(6); + // enable general RF interrupts + IEN2 |= BV(0); +} + +//------------------------------------------------------------------- +// @fn halRfRxInterruptConfig +// @brief Configure RX interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfRxInterruptConfig(ISR_FUNC_PTR pf) +{ + uint8 x; + HAL_INT_LOCK(x); + pfISR = pf; + HAL_INT_UNLOCK(x); +} + + +//------------------------------------------------------------------- +// @fn halRfWaitTransceiverReady +// @brief Wait until the transciever is ready (SFD inactive). +// @param none +// @return none +//------------------------------------------------------------------- +void halRfWaitTransceiverReady(void) +{ + // Wait for SFD not active and TX_Active not active + while (FSMSTAT1 &(BV(1) | BV(5))) + ; +} + + +//------------------------------------------------------------------- +// @fn rfIsr +// @brief Interrupt service routine that handles RFPKTDONE interrupt. +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(rfIsr, RF_VECTOR) +{ + uint8 x; + + HAL_INT_LOCK(x); + + if (RFIRQF0 &IRQ_RXPKTDONE) + { + if (pfISR) + { + (*pfISR)(); // Execute the custom ISR + } + S1CON = 0; // Clear general RF interrupt flag + RFIRQF0 &= ~IRQ_RXPKTDONE; // Clear RXPKTDONE interrupt + } + HAL_INT_UNLOCK(x); +} + +//------------------------------------------------------------------- diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.h new file mode 100644 index 0000000..845b908 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf.h @@ -0,0 +1,56 @@ +//------------------------------------------------------------------- +// Filename: hal_rf.h +// Description: HAL radio interface header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Chip ID's +#define HAL_RF_CHIP_ID_CC1100 0x00 +#define HAL_RF_CHIP_ID_CC1110 0x01 +#define HAL_RF_CHIP_ID_CC1111 0x11 +#define HAL_RF_CHIP_ID_CC2420 0x02 +#define HAL_RF_CHIP_ID_CC2500 0x80 +#define HAL_RF_CHIP_ID_CC2510 0x81 +#define HAL_RF_CHIP_ID_CC2511 0x91 +#define HAL_RF_CHIP_ID_CC2550 0x82 +#define HAL_RF_CHIP_ID_CC2520 0x84 +#define HAL_RF_CHIP_ID_CC2430 0x85 +#define HAL_RF_CHIP_ID_CC2431 0x89 +#define HAL_RF_CHIP_ID_CC2530 0xA5 +#define HAL_RF_CHIP_ID_CC2531 0xB5 +#define HAL_RF_CHIP_ID_CC2540 0x8D + +// IEEE 802.15.4 defined constants (2.4 GHz logical channels) +#define MIN_CHANNEL 11 // 2405 MHz +#define MAX_CHANNEL 26 // 2480 MHz +#define CHANNEL_SPACING 5 // MHz + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +// Generic RF interface +uint8 halRfInit(void); +uint8 halRfSetTxPower(uint8 power); +uint8 halRfTransmit(void); + +uint8 halRfGetChipId(void); +uint8 halRfGetChipVer(void); +uint8 halRfGetRssiOffset(void); + +void halRfWriteTxBuf(uint8 *pData, uint8 length); +void halRfReadRxBuf(uint8 *pData, uint8 length); +void halRfWaitTransceiverReady(void); +uint8 halRfReadMemory(uint16 addr, uint8 *pData, uint8 length); +uint8 halRfWriteMemory(uint16 addr, uint8 *pData, uint8 length); + +void halRfReceiveOn(void); +void halRfReceiveOff(void); +void halRfDisableRxInterrupt(void); +void halRfEnableRxInterrupt(void); +void halRfRxInterruptConfig(ISR_FUNC_PTR pfISR); + +// IEEE 802.15.4 specific interface +void halRfSetChannel(uint8 channel); +void halRfSetShortAddr(uint16 shortAddr); +void halRfSetPanId(uint16 PanId); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.c new file mode 100644 index 0000000..480368e --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.c @@ -0,0 +1,393 @@ +//------------------------------------------------------------------- +// Filename: hal_rf_security.c +// Description: CC2530 CCM security +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_rf.h" +#include "hal_rf_security.h" +#include "util.h" +#include + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Staring AES operation +#define AES_START() st (ENCCS |= 0x01;) + +// Setting the mode of the AES operation +#define AES_SET_MODE(mode) st( ENCCS &= ~0x70; ENCCS |= mode; ) + +// Starting or stopping encryption or decryption +#define AES_SET_OPERATION(op) st( ENCCS = (ENCCS & ~0x07) | op; ) + +// Poll the AES ready bit +#define AES_RDY() ( ENCCS & 8) + +// Encryption mode +#define AES_MODE_CBC 0x00 +#define AES_MODE_CFB 0x10 +#define AES_MODE_OFB 0x20 +#define AES_MODE_CTR 0x30 +#define AES_MODE_ECB 0x40 +#define AES_MODE_CBCMAC 0x50 + +// Operations +#define AES_ENCRYPT 0x00 +#define AES_DECRYPT 0x02 +#define AES_LOAD_KEY 0x04 +#define AES_LOAD_IV 0x06 + +// Convert MIC to MIC length +#define MIC_2_MICLEN(m) ( BV((m&3)+1) & ~3 ) + +//------------------------------------------------------------------- +// LOCAL DATA +//------------------------------------------------------------------- +static uint8 nonceTx[16]; +static uint8 nonceRx[16]; +static uint8 IV[16]; +static uint8 cipherText[128]; +static uint8 buf[128]; + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void halAesEncrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector); +static void halAesDecrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector); +static uint8 generateAuthData(uint8 c, uint8 *pIv, uint8 *pData, uint8 f, uint8 lm); + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +extern void halRfAppendTxBuf(uint8 *pData, uint8 length); + +//------------------------------------------------------------------- +// @fn halRfSecurityInit +// @brief Security init. Write nonces and key to chip. +// @param none +// @return none +//------------------------------------------------------------------- +void halRfSecurityInit(uint8 *pKey, uint8 *pNonceRx, uint8 *pNonceTx) +{ + uint8 i; + + AES_SET_OPERATION(AES_LOAD_KEY); + + // Starting loading of key or vector. + AES_START(); + + // Store key and nonces + for (i = 0; i < NONCE_LENGTH; i++) + { + nonceRx[i] = *pNonceRx; + nonceTx[i] = *pNonceTx; + pNonceTx++; + pNonceRx++; + ENCDI = *pKey++; + } +} + +//------------------------------------------------------------------- +// @fn halRfWriteTxBufSecure +// @brief Encrypt and authenticate plaintext then fill TX buffer +// @param uint8* data - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// uint8 c - number of bytes to encrypt +// uint8 f - number of bytes to authenticate +// uint8 m - integrity code (m=1,2,3 gives lenght of integrity +// field l(m)= 4,8,16) +// @return none +//------------------------------------------------------------------- +void halRfWriteTxBufSecure(uint8 *pPkt, uint8 length, uint8 c, uint8 f, uint8 m) +{ + uint8 i, lm; + + // Generate B(i) vector + memset(buf, 0, sizeof(buf)); + lm = MIC_2_MICLEN(m); + i = generateAuthData(c, nonceTx, pPkt + 1, f, lm); + + // Calculate CBC-MAC value + memset(IV, 0, sizeof(IV)); + halAesEncrypt(AES_MODE_CBCMAC, buf, i, cipherText, IV); + + // Encrypt authentication tag + memcpy(IV, nonceTx, 16); // Use nonce as IV + IV[0] = 0x01; // Flag for CTR + IV[15] = 0; // Counter= 0 + + memcpy(buf, cipherText, 16); + halAesEncrypt(AES_MODE_CTR, buf, 16, cipherText, IV); + + // Encrypt plaintext + memset(buf + i, 0, 16-(i &0xf)); // Zero padding + IV[15] = 1; // Counter= 1 + halAesEncrypt(AES_MODE_CTR, &buf[i - c], c, &cipherText[i - c], IV); + + // Fill TX buffer + halRfWriteTxBuf(pPkt, 1); // Length byte + halRfAppendTxBuf(pPkt + 1, f); // MPDU + halRfAppendTxBuf(&cipherText[i - c], c); // Payload + halRfAppendTxBuf(cipherText, lm); // MIC +} + +//------------------------------------------------------------------- +// @fn halRfReadRxBufSecure +// @brief Decrypts and reverse authenticates with CCM then reads out received frame +// @param uint8* pPkt - data buffer. This must be allocated by caller. +// uint8 length - number of bytes +// uint8 encrLength - number of bytes to decrypt +// uint8 authLength - number of bytes to reverse authenticate +// uuint8 m - ets length of integrity code (m=1,2,3 gives lenght of integrity field 4,8,16) +// @return SUCCESS or FAILED +//------------------------------------------------------------------- +uint8 halRfReadRxBufSecure(uint8 *data, uint8 length, uint8 c, uint8 f, uint8 m) +{ + uint8 lm, l, i; + + // Get received packet + halRfReadRxBuf(data, length); + + // Update RX nonce; frame counter + nonceRx[12] = data[10]; + nonceRx[11] = data[11]; + nonceRx[10] = data[12]; + nonceRx[9] = data[13]; + // Update RX nonce; source address + nonceRx[7] = data[8]; + nonceRx[8] = data[7]; + + // Decrypt authentication tag + memcpy(IV, nonceRx, 16); + IV[15] = 0; // Counter= 0 + IV[0] = 0x01; // Flag field for decryption + lm = MIC_2_MICLEN(m); // Length of authentication tag + + halAesDecrypt(AES_MODE_CTR, data + c + f, lm, buf, IV); + memcpy(data + c + f, buf, lm); + + // Prepare payload for decryption + memcpy(cipherText, data + f, c); + + // Zero padding + l = (c &0x0f) == 0 ? c : (c &0xf0) + 0x10; + for (i = c; i < l; i++) + { + cipherText[i] = 0x00; + } + + // Decrypt payload + IV[15] = 1; // Counter= 1 + halAesDecrypt(AES_MODE_CTR, cipherText, c, buf, IV); + memcpy(data + f, buf, c); + + // Generate B(i) vector + memset(buf, 0, sizeof(buf)); + i = generateAuthData(c, nonceRx, data, f, lm); + + // Calculate CBC-MAC value + memset(IV, 0, sizeof(IV)); + halAesEncrypt(AES_MODE_CBCMAC, buf, i, cipherText, IV); + + // Check authentication data + return memcmp(cipherText, data + c + f, lm) == 0 ? SUCCESS : FAILED; +} + +//------------------------------------------------------------------- +// @fn halRfIncNonceTx +// @brief Increments frame counter field of stored nonce TX +// @param none +// @return none +//------------------------------------------------------------------- +void halRfIncNonceTx(void) +{ + uint32 *pCount; + + pCount = (uint32*) &nonceTx[9]; + utilReverseBuf((uint8*)pCount, 4); + (*pCount)++; + utilReverseBuf((uint8*)pCount, 4); +} + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS + +//------------------------------------------------------------------- +static void halAesLoadBlock(uint8 *pData, uint8 op) +{ + uint8 i; + + // Set operation + AES_SET_OPERATION(op); + // Starting loading of key or vector. + AES_START(); + + // loading the data (key or vector) + for (i = 0; i < 16; i++) + { + ENCDI = pData[i]; + } + + return ; +} + +//------------------------------------------------------------------- +static void halAesOperation(uint8 oper, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector) +{ + uint16 i; + uint8 j, k; + uint8 mode; + uint16 nbrOfBlocks; + uint16 convertedBlock; + + nbrOfBlocks = length / 0x10; + + if ((length % 0x10) != 0) + { + // length not multiplum of 16, convert one block extra with zeropadding + nbrOfBlocks++; + } + + // Loading the IV. + halAesLoadBlock(pInitVector, AES_LOAD_IV); + + // Start the operation + AES_SET_OPERATION(oper); + + // Getting the operation mode. + mode = ENCCS &0x70; + + for (convertedBlock = 0; convertedBlock < nbrOfBlocks; convertedBlock++) + { + // Starting the conversion. + AES_START(); + + i = convertedBlock * 16; + // Counter, Output Feedback and Cipher Feedback operates on 4 bytes and not 16 bytes. + if ((mode == AES_MODE_CFB) || (mode == AES_MODE_OFB) || (mode == AES_MODE_CTR)) + { + + for (j = 0; j < 4; j++) + { + // Writing the input data with zero-padding + for (k = 0; k < 4; k++) + { + ENCDI = ((i + 4 * j + k < length) ? pDataIn[i + 4 * j + k]: 0x00); + } + + // Read out data for every 4th byte + for (k = 0; k < 4; k++) + { + pDataOut[i + 4 * j + k] = ENCDO; + } + + } + } + else if (mode == AES_MODE_CBCMAC) + { + // Writing the input data with zero-padding + for (j = 0; j < 16; j++) + { + ENCDI = ((i + j < length) ? pDataIn[i + j]: 0x00); + } + // The last block of the CBC-MAC is computed by using CBC mode. + if (convertedBlock == nbrOfBlocks - 2) + { + AES_SET_MODE(AES_MODE_CBC); + // wait for data ready + halMcuWaitUs(1); + } + // The CBC-MAC does not produce an output on the n-1 first blocks + // only the last block is read out + else if (convertedBlock == nbrOfBlocks - 1) + { + + // wait for data ready + halMcuWaitUs(1); + for (j = 0; j < 16; j++) + { + pDataOut[j] = ENCDO; + } + } + } // ECB or CBC + else + { + // Writing the input data with zero-padding + for (j = 0; j < 16; j++) + { + ENCDI = ((i + j < length) ? pDataIn[i + j]: 0x00); + } + + // wait for data ready + halMcuWaitUs(1); + + // Read out data + for (j = 0; j < 16; j++) + { + pDataOut[i + j] = ENCDO; + } + } + } +} + +//------------------------------------------------------------------- +static void halAesEncrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector) +{ + AES_SET_MODE(mode); + halAesOperation(AES_ENCRYPT, pDataIn, length, pDataOut, pInitVector); +} + +//------------------------------------------------------------------- +static void halAesDecrypt(uint8 mode, uint8 *pDataIn, uint16 length, uint8 *pDataOut, uint8 *pInitVector) +{ + AES_SET_MODE(mode); + halAesOperation(AES_DECRYPT, pDataIn, length, pDataOut, pInitVector); +} + +//------------------------------------------------------------------- +static uint8 generateAuthData(uint8 c, uint8 *pIv, uint8 *pData, uint8 f, uint8 lm) +{ + uint8 i, j, l; + + // Prepare input for CBC-MAC, B0, Bi.... Bn + memcpy(buf, pIv, 16); // B0 + + // Create flag + buf[0] = 0x01; // L'= L - 1 (L=2) + if (f > 0) + { + buf[0] |= 0x40; + } + // Adata= f > 0 + buf[0] |= ((lm - 2) / 2) << 3; // M'= (lm-2) / 2; + + buf[14] = 0x00; + buf[15] = c; + + // Add authentication data + buf[16] = 0; + buf[17] = f; + memcpy(&buf[18], pData, f); + + // .... zero padding + i = 18+f; + l = (i &0x0f) == 0 ? i : (i &0xf0) + 0x10; + while (i < l) + { + buf[i++] = 0x00; + } + + // Add command payload + j = 0; + while (i < l + c) + { + buf[i++] = pData[f + j]; + j++; + } + + return i; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.h new file mode 100644 index 0000000..e05c6ca --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_security.h @@ -0,0 +1,21 @@ +//------------------------------------------------------------------- +// Filename: hal_rf_security.h +// Description: HAL radio interface header file for security operations. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// IEEE 802.15.4 security (AES-128) +#define KEY_LENGTH 16 +#define NONCE_LENGTH 16 + +#define SECURITY_CONTROL 0x06 // MIC-64 + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +// CCM security interface, IEEE 802.15.4 +void halRfSecurityInit(uint8 *key, uint8 *nonceRx, uint8 *nonceTx); +uint8 halRfReadRxBufSecure(uint8 *pData, uint8 length, uint8 encrLength, uint8 authLength, uint8 m); +void halRfWriteTxBufSecure(uint8 *pData, uint8 length, uint8 encrLength, uint8 authLength, uint8 m); +void halRfIncNonceTx(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.c new file mode 100644 index 0000000..0487a75 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.c @@ -0,0 +1,60 @@ +//------------------------------------------------------------------- +// Filename: hal_rf_util.c +// Description: Support for anergy detection applications. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_mcu.h" +#include "hal_rf_util.h" +#include "hal_rf.h" + +//------------------------------------------------------------------- +// FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halSampleED +// @brief Sample Energy Detect +// @param uint8 channel - channel between 11 and 26 +// uint16 sampleTime - sample time in us +// @return int8 - sampled RSSI value +//------------------------------------------------------------------- +int8 halSampleED(uint8 channel, uint16 sampleTime) +{ + int8 rssi = 0; + + // Set channel + halRfSetChannel(channel); + + // Set RX on + halRfReceiveOn(); + while (!RSSISTAT) + ; + + // Enable energy scan mode, using peak signal strength + FRMCTRL0 |= 0x10; + + // Spend sampleTime us accumulating the peak RSSI value + halMcuWaitUs(sampleTime); + rssi = RSSI; + + // Exit the current channel + halRfReceiveOff(); + // Disable ED scan mode + FRMCTRL0 &= ~0x10; + + return rssi; +} + +//------------------------------------------------------------------- +// @fn halSetRxScanMode +// @brief Set chip in RX scanning mode +// @param none +// @return none +//------------------------------------------------------------------- +void halSetRxScanMode(void) +{ + // Infinite RX mode (disables symbol search) + FRMCTRL0 = 0x0C; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.h new file mode 100644 index 0000000..1a496cd --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_rf_util.h @@ -0,0 +1,10 @@ +//------------------------------------------------------------------- +// Filename: hal_util_rf.h +// Description: +//------------------------------------------------------------------- + +//------------------------------------------------------------------- +// PUBLIC FUNCTIONS +//------------------------------------------------------------------- +int8 halSampleED(uint8 channel, uint16 sampleTime); +void halSetRxScanMode(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.c new file mode 100644 index 0000000..840aefc --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.c @@ -0,0 +1,41 @@ +#include + +void SET_POWER_MODE(unsigned char mode) +{ + if(mode == 0) + SLEEPCMD &= ~0x03; + else + if(mode == 3) + SLEEPCMD |= 0x03; + else + { + SLEEPCMD &= ~0x03; + SLEEPCMD |= mode; + } + + PCON |= 0x01; + asm("NOP"); +} + +void Set_ST_Period(unsigned char sec) +{ + unsigned long sleepTimer = 0; + + sleepTimer |= ST0; + sleepTimer |= (unsigned long)ST1 << 8; + sleepTimer |= (unsigned long)ST2 << 16; + + sleepTimer += ((unsigned long)sec * (unsigned long)32768); + + ST2 = (unsigned char)(sleepTimer >> 16); + ST1 = (unsigned char)(sleepTimer >> 8); + ST0 = (unsigned char) sleepTimer; +} + +void Init_SLEEP_TIMER(void) +{ + EA = 1; + STIE = 1; + STIF = 0; +} + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.h new file mode 100644 index 0000000..83b2601 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_sleep.h @@ -0,0 +1,10 @@ +#include + +#define CRYSTAL 0 +#define RC 1 + +void SET_MAIN_CLOCK_SOURCE(unsigned char source); +void SET_LOW_CLOCK(unsigned char source); +void SET_POWER_MODE(unsigned char mode); +void Set_ST_Period(unsigned char sec); +void Init_SLEEP_TIMER(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.c new file mode 100644 index 0000000..8b8ab4f --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.c @@ -0,0 +1,130 @@ +//------------------------------------------------------------------- +// Filename: hal_timer_32k.c +// Description: hal 32KHz timer +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_int.h" +#include "hal_timer_32k.h" + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +static ISR_FUNC_PTR fptr; + +//------------------------------------------------------------------- +// @fn halTimer32kInit +// @brief Set up timer 1 to generate an interrupt every "cycles" 32768 Hz +// clock cycles. +// Use halTimerIntConnect() to connect an ISR to the interrupt. +// @param uint16 cycles - Number of cycles between interrupt +// (does not support larger cycles value than 0xFFFF/8) +// @return none +//------------------------------------------------------------------- +void halTimer32kInit(uint16 cycles) +{ + uint16 compareValue; + + //uint16 clock_divider = ID_0; // Default - don't divide input clock + + // Set prescaler divider value to 128 + T1CTL |= 0x0C; + + // Multiply cycles by 8 to get 32KHz cycles + // 32MHz/128/8 gives approximately 32KHz + if (cycles > 0xFFFF / 8) + { + compareValue = 0xFFFF; + } + else + { + compareValue = cycles * 8; + } + + // Set compare value + T1CC0H = HI_UINT16(compareValue); + T1CC0L = LO_UINT16(compareValue); + #ifndef CC2530_PG1 + // Set conmpare mode with interrupt enabled + T1CCTL0 = 0x44; + #endif + + // clear interrupt pending flag, disable interrupt + #ifdef CC2530_PG1 + T1CTL &= ~0x10; // T1CTL.OVFIF = 0 + #else + T1STAT &= ~0x01; // T1STAT.CH1IF = 0 + #endif + IEN1 &= ~0x02; // IEN1.T1EN = 0 +} + +//------------------------------------------------------------------- +// @fn halTimer32kRestart +// @brief Restart timer 1. The timer is first stopped, then restarted, +// counting up from 0 +// @param none +// @return none +//------------------------------------------------------------------- +void halTimer32kRestart(void) +{ + T1CTL &= ~0x02; // Stop timer + IEN1 &= ~0x02; // Disable interrupt + + T1CNTL = 0x00; // Reset counter value + + T1CTL |= 0x02; // Start timer + IEN1 |= 0x02; // Enable interrupt +} + +//------------------------------------------------------------------- +// @fn halTimer32kIntConnect +// @brief Connect function to timer interrupt +// @param ISR_FUNC_PTR isr - pointer to function +// @return none +//------------------------------------------------------------------- +void halTimer32kIntConnect(ISR_FUNC_PTR isr) +{ + istate_t key; + HAL_INT_LOCK(key); + fptr = isr; + HAL_INT_UNLOCK(key); +} + +//------------------------------------------------------------------- +// @fn halTimer32kIntEnable +// @brief Enable 32KHz timer interrupt +// @param none +// @return none +//------------------------------------------------------------------- +void halTimer32kIntEnable(void) +{ + IEN1 |= 0x02; // IEN1.T1EN = 1 + + // Start timer in modulo mode + T1CTL |= 0x02; // T1CTL.MODE = 10 + +} + +//------------------------------------------------------------------- +// @fn halTimer32kIntDisable +// @brief Disable 32KHz timer interrupt +// @param none +// @return none +//------------------------------------------------------------------- +void halTimer32kIntDisable(void) +{ + IEN1 &= ~0x02; // IEN1.T1EN = 0 +} + +//------------------------------------------------------------------- +// @fn timer32k0_ISR +// @brief ISR framework for the 32KHz timer component +// @param none +// @return none +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(T1_ISR, T1_VECTOR) +{ + if (fptr != NULL) + { + (*fptr)(); + } +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.h new file mode 100644 index 0000000..e9d639e --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_timer_32k.h @@ -0,0 +1,17 @@ +//------------------------------------------------------------------- +// Filename: hal_timer_32k.h +// Description: hal 32KHz timer library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +#define TIMER_32K_CLK_FREQ 32768 + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halTimer32kInit(uint16 cycles); +void halTimer32kRestart(void); +void halTimer32kIntConnect(ISR_FUNC_PTR isr); +void halTimer32kIntEnable(void); +void halTimer32kIntDisable(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.c new file mode 100644 index 0000000..88d9d68 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.c @@ -0,0 +1,286 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.c +// Description: This file contains the interface to the H/W UART driver. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_board.h" +#include "hal_uart.h" + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define HAL_UART_ISR_RX_AVAIL() \ +(uartCfg.rxTail >= uartCfg.rxHead) ? \ +(uartCfg.rxTail - uartCfg.rxHead) : \ +(HAL_UART_ISR_RX_MAX - uartCfg.rxHead + uartCfg.rxTail) + +#define HAL_UART_ISR_TX_AVAIL() \ +(uartCfg.txHead > uartCfg.txTail) ? \ +(uartCfg.txHead - uartCfg.txTail - 1) : \ +(HAL_UART_ISR_TX_MAX - uartCfg.txTail + uartCfg.txHead - 1) + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +// U0CSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// U0UCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX0IE 0x04 +#define U0RX_TX 0x0C + +#define HAL_UART_PERCFG_BIT 0x01 + +#define HAL_UART_ISR_RX_MAX 128 +#define HAL_UART_ISR_TX_MAX HAL_UART_ISR_RX_MAX + +typedef struct +{ + uint8 rxBuf[HAL_UART_ISR_RX_MAX]; + uint8 rxHead; + volatile uint8 rxTail; + uint8 rxShdw; + + uint8 txBuf[HAL_UART_ISR_TX_MAX]; + volatile uint8 txHead; + uint8 txTail; + uint8 txMT; +} uartCfg_t; + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +uartCfg_t uartCfg; + +//------------------------------------------------------------------- +// @fn halUartInit +// @brief Initialize the UART +// @param none +// @return none +//------------------------------------------------------------------- +void halUartInit(uint32 baud) +{ + // UART Configuration + PERCFG &= ~HAL_UART_PERCFG_BIT; // Set UART0 I/O location to P0. + + P0SEL |= U0RX_TX; // Enable Tx and Rx peripheral functions on pins. + ADCCFG &= ~U0RX_TX; // Make sure ADC doesnt use this. + U0CSR = CSR_MODE; // Mode is UART Mode. + U0UCR = UCR_FLUSH; // Flush it. + + // Only supporting subset of baudrate for code size - other is possible. + // 38400 + //U0BAUD = 59; + //U0GCR = 10; + // 9600 + //U0BAUD = 59; + //U0GCR = 8; + //U0BAUD = value_u0baud; + //U0GCR = value_u0gcr; + + switch(baud) + { + case 1200 : + U0BAUD = 59; U0GCR = 5; break; + case 2400 : + U0BAUD = 59; U0GCR = 6; break; + case 4800 : + U0BAUD = 59; U0GCR = 7; break; + case 9600 : + U0BAUD = 59; U0GCR = 8; break; + case 14400 : + U0BAUD = 216; U0GCR = 8; break; + case 19200 : + U0BAUD = 59; U0GCR = 9; break; + case 28800 : + U0BAUD = 216; U0GCR = 9; break; + case 38400 : + U0BAUD = 59; U0GCR = 10; break; + case 57600 : + U0BAUD = 216; U0GCR = 10; break; + case 76800 : + U0BAUD = 59; U0GCR = 11; break; + case 115200 : + U0BAUD = 216; U0GCR = 11; break; + case 230400 : + U0BAUD = 216; U0GCR = 12; break; + default : + U0BAUD = 59; U0GCR = 10; break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + U0UCR = UCR_STOP; + U0CSR |= CSR_RE; + URX0IE = 1; + U0DBUF = 0; // Prime the ISR pump. + + uartCfg.rxHead = 0; + uartCfg.rxTail = 0; + uartCfg.txHead = 0; + uartCfg.txTail = 0; + uartCfg.rxShdw = 0; + uartCfg.txMT = 0; + +} + +//------------------------------------------------------------------- +// @fn halUartRead +// @brief Read a buffer from the UART +// @param buf - valid data buffer at least 'len' bytes in size +// len - max length number of bytes to copy to 'buf' +// @return length of buffer that was read +//------------------------------------------------------------------- +uint16 halUartRead(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + while ((uartCfg.rxHead != uartCfg.rxTail) && (cnt < len)) + { + *buf++ = uartCfg.rxBuf[uartCfg.rxHead++]; + if (uartCfg.rxHead >= HAL_UART_ISR_RX_MAX) + { + uartCfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartWrite +// @brief Write a buffer to the UART. +// @param buf - pointer to the buffer that will be written, not freed +// len - length of +// @return length of the buffer that was sent +//------------------------------------------------------------------- +uint16 halUartWrite(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Accept "all-or-none" on write request. + if (HAL_UART_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + uartCfg.txBuf[uartCfg.txTail] = *buf++; + uartCfg.txMT = 0; + + if (uartCfg.txTail >= HAL_UART_ISR_TX_MAX - 1) + { + uartCfg.txTail = 0; + } + else + { + uartCfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTX0IE; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartRxLen() +// @brief Calculate Rx Buffer length - the number of bytes in the buffer. +// @param none +// @return length of current Rx Buffer +//------------------------------------------------------------------- +uint16 halUartRxLen(void) +{ + return HAL_UART_ISR_RX_AVAIL(); +} + +//------------------------------------------------------------------- +// @fn halUartSuspend +// @brief Suspend UART hardware before entering PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUartSuspend(void) +{ + U0CSR &= ~CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartResume +// @brief Resume UART hardware after exiting PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUartResume(void) +{ + U0UCR |= UCR_FLUSH; + U0CSR |= CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartRxIsr +// @brief UART Receive Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart0RxIsr, URX0_VECTOR) +{ + uint8 tmp = U0DBUF; + uartCfg.rxBuf[uartCfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (uartCfg.rxHead == uartCfg.rxTail) + { + uartCfg.rxShdw = ST0; + } + + if (++uartCfg.rxTail >= HAL_UART_ISR_RX_MAX) + { + uartCfg.rxTail = 0; + } +} + +//------------------------------------------------------------------- +// @fn halUartTxIsr +// @brief UART Transmit Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart0TxIsr, UTX0_VECTOR) +{ + if (uartCfg.txHead == uartCfg.txTail) + { + IEN2 &= ~UTX0IE; + uartCfg.txMT = 1; + } + else + { + UTX0IF = 0; + U0DBUF = uartCfg.txBuf[uartCfg.txHead++]; + + if (uartCfg.txHead >= HAL_UART_ISR_TX_MAX) + { + uartCfg.txHead = 0; + } + } +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.h new file mode 100644 index 0000000..1dfea8c --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart.h @@ -0,0 +1,35 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.h +// Description: hal UART library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------ + +//------------------------------------------------------------------- +// Initialize UART at the startup +//------------------------------------------------------------------- +void halUartInit(uint32 baud); + +//------------------------------------------------------------------- +// Read a buffer from the UART +//------------------------------------------------------------------- +extern uint16 halUartRead(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Write a buff to the uart +//------------------------------------------------------------------- +extern uint16 halUartWrite(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Return the number of bytes in the Rx buffer +//------------------------------------------------------------------- +extern uint16 halUartRxLen(void); + +//------------------------------------------------------------------- +// Abort UART when entering sleep mode +//------------------------------------------------------------------- +extern void halUartSuspend(void); + +//------------------------------------------------------------------- +// Resume UART after wakeup from sleep +//------------------------------------------------------------------- +extern void halUartResume(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.c new file mode 100644 index 0000000..b281d45 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.c @@ -0,0 +1,282 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.c +// Description: This file contains the interface to the H/W UART driver. +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_board.h" +#include "hal_uart1.h" + +//------------------------------------------------------------------- +// MACROS +//------------------------------------------------------------------- +#define HAL_UART1_ISR_RX_AVAIL() \ +(uart1Cfg.rxTail >= uart1Cfg.rxHead) ? \ +(uart1Cfg.rxTail - uart1Cfg.rxHead) : \ +(HAL_UART1_ISR_RX_MAX - uart1Cfg.rxHead + uart1Cfg.rxTail) + +#define HAL_UART1_ISR_TX_AVAIL() \ +(uart1Cfg.txHead > uart1Cfg.txTail) ? \ +(uart1Cfg.txHead - uart1Cfg.txTail - 1) : \ +(HAL_UART1_ISR_TX_MAX - uart1Cfg.txTail + uart1Cfg.txHead - 1) + +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +// U0CSR - USART Control and Status Register. +#define CSR_MODE 0x80 +#define CSR_RE 0x40 +#define CSR_SLAVE 0x20 +#define CSR_FE 0x10 +#define CSR_ERR 0x08 +#define CSR_RX_BYTE 0x04 +#define CSR_TX_BYTE 0x02 +#define CSR_ACTIVE 0x01 + +// U0UCR - USART UART Control Register. +#define UCR_FLUSH 0x80 +#define UCR_FLOW 0x40 +#define UCR_D9 0x20 +#define UCR_BIT9 0x10 +#define UCR_PARITY 0x08 +#define UCR_SPB 0x04 +#define UCR_STOP 0x02 +#define UCR_START 0x01 + +#define UTX1IE 0x08 +#define U1RX_TX 0xC0 + +#define HAL_UART1_PERCFG_BIT 0x02 + +#define HAL_UART1_ISR_RX_MAX 128 +#define HAL_UART1_ISR_TX_MAX HAL_UART1_ISR_RX_MAX + +typedef struct +{ + uint8 rxBuf[HAL_UART1_ISR_RX_MAX]; + uint8 rxHead; + volatile uint8 rxTail; + uint8 rxShdw; + + uint8 txBuf[HAL_UART1_ISR_TX_MAX]; + volatile uint8 txHead; + uint8 txTail; + uint8 txMT; +} uartCfg_t; + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +uartCfg_t uart1Cfg; + +//------------------------------------------------------------------- +// @fn halUartInit +// @brief Initialize the UART +// @param none +// @return none +//------------------------------------------------------------------- +void halUart1Init(uint32 baud) +{ + // UART Configuration + PERCFG |= HAL_UART1_PERCFG_BIT; // ÉèÖà UART1 I/O λÖÃÔÚP1¿ÚÉÏ. + + P1SEL |= U1RX_TX; // ʹÄÜ UART1 µÄTx£¨P1.6£©ºÍRx £¨P1.7£©ÍⲿÉ豸¹¦ÄÜÒý½Å. + // ADCCFG &= ~U0RX_TX; // Make sure ADC doesnt use this. + U1CSR = CSR_MODE; // UART ģʽ. + U1UCR = UCR_FLUSH; // Çå³ýµ¥Ôª. + + // Only supporting subset of baudrate for code size - other is possible. + // 38400 + //U1BAUD = 59; + //U1GCR = 10; + //9600 + //U1BAUD = 59; + //U1GCR = 8; + switch(baud) + { + case 2400 : + U1BAUD = 59; U1GCR = 6; break; + case 4800 : + U1BAUD = 59; U1GCR = 7; break; + case 9600 : + U1BAUD = 59; U1GCR = 8; break; + case 14400 : + U1BAUD = 216; U1GCR = 8; break; + case 19200 : + U1BAUD = 59; U1GCR = 9; break; + case 28800 : + U1BAUD = 216; U1GCR = 9; break; + case 38400 : + U1BAUD = 59; U1GCR = 10; break; + case 57600 : + U1BAUD = 216; U1GCR = 10; break; + case 76800 : + U1BAUD = 59; U1GCR = 11; break; + case 115200 : + U1BAUD = 216; U1GCR = 11; break; + case 230400 : + U1BAUD = 216; U1GCR = 12; break; + default : + U1BAUD = 59; U1GCR = 10; break; + } + + // 8 bits/char; no parity; 1 stop bit; stop bit hi. + U1UCR = UCR_STOP; //ֹͣλΪ¸ßµçƽ£¨1£© + U1CSR |= CSR_RE; //UART1 ½ÓÊÕÆ÷ʹÄÜ + URX1IE = 1; //UART1 ½ÓÊÕÖжÏʹÄÜ + U1DBUF = 0; //Êý¾Ý»º³åÆ÷Çå0 + + uart1Cfg.rxHead = 0; + uart1Cfg.rxTail = 0; + uart1Cfg.txHead = 0; + uart1Cfg.txTail = 0; + uart1Cfg.rxShdw = 0; + uart1Cfg.txMT = 0; + +} + +//------------------------------------------------------------------- +// @fn halUartRead +// @brief Read a buffer from the UART +// @param buf - valid data buffer at least 'len' bytes in size +// len - max length number of bytes to copy to 'buf' +// @return length of buffer that was read +//------------------------------------------------------------------- +uint16 halUart1Read(uint8 *buf, uint16 len) +{ + uint16 cnt = 0; + + while ((uart1Cfg.rxHead != uart1Cfg.rxTail) && (cnt < len)) + { + *buf++ = uart1Cfg.rxBuf[uart1Cfg.rxHead++]; + if (uart1Cfg.rxHead >= HAL_UART1_ISR_RX_MAX) + { + uart1Cfg.rxHead = 0; + } + cnt++; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartWrite +// @brief Write a buffer to the UART. +// @param buf - pointer to the buffer that will be written, not freed +// len - length of +// @return length of the buffer that was sent +//------------------------------------------------------------------- +uint16 halUart1Write(uint8 *buf, uint16 len) +{ + uint16 cnt; + + // Accept "all-or-none" on write request. + if (HAL_UART1_ISR_TX_AVAIL() < len) + { + return 0; + } + + for (cnt = 0; cnt < len; cnt++) + { + uart1Cfg.txBuf[uart1Cfg.txTail] = *buf++; + uart1Cfg.txMT = 0; + + if (uart1Cfg.txTail >= HAL_UART1_ISR_TX_MAX - 1) + { + uart1Cfg.txTail = 0; + } + else + { + uart1Cfg.txTail++; + } + + // Keep re-enabling ISR as it might be keeping up with this loop due to other ints. + IEN2 |= UTX1IE; + } + + return cnt; +} + +//------------------------------------------------------------------- +// @fn halUartRxLen() +// @brief Calculate Rx Buffer length - the number of bytes in the buffer. +// @param none +// @return length of current Rx Buffer +//------------------------------------------------------------------- +uint16 halUart1RxLen(void) +{ + return HAL_UART1_ISR_RX_AVAIL(); +} + +//------------------------------------------------------------------- +// @fn halUartSuspend +// @brief Suspend UART hardware before entering PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUart1Suspend(void) +{ + U1CSR &= ~CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartResume +// @brief Resume UART hardware after exiting PM mode 1, 2 or 3. +// @param None +// @return None +//------------------------------------------------------------------- +void halUart1Resume(void) +{ + U1UCR |= UCR_FLUSH; + U1CSR |= CSR_RE; +} + +//------------------------------------------------------------------- +// @fn halUartRxIsr +// @brief UART Receive Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart1RxIsr, URX1_VECTOR) +{ + uint8 tmp = U1DBUF; + uart1Cfg.rxBuf[uart1Cfg.rxTail] = tmp; + + // Re-sync the shadow on any 1st byte received. + if (uart1Cfg.rxHead == uart1Cfg.rxTail) + { + uart1Cfg.rxShdw = ST0; + } + + if (++uart1Cfg.rxTail >= HAL_UART1_ISR_RX_MAX) + { + uart1Cfg.rxTail = 0; + } +} + +//------------------------------------------------------------------- +// @fn halUartTxIsr +// @brief UART Transmit Interrupt +// @param None +// @return None +//------------------------------------------------------------------- +HAL_ISR_FUNCTION(halUart1TxIsr, UTX1_VECTOR) +{ + if (uart1Cfg.txHead == uart1Cfg.txTail) + { + IEN2 &= ~UTX1IE; + uart1Cfg.txMT = 1; + } + else + { + UTX1IF = 0; + U1DBUF = uart1Cfg.txBuf[uart1Cfg.txHead++]; + + if (uart1Cfg.txHead >= HAL_UART1_ISR_TX_MAX) + { + uart1Cfg.txHead = 0; + } + } +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.h new file mode 100644 index 0000000..a528757 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/common/hal_uart1.h @@ -0,0 +1,35 @@ +//------------------------------------------------------------------- +// Filename: hal_uart.h +// Description: hal UART library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// FUNCTIONS - API +//------------------------------------------------------------------- +// Initialize UART at the startup +//------------------------------------------------------------------- +extern void halUart1Init(uint32 baud); + +//------------------------------------------------------------------- +// Read a buffer from the UART +//------------------------------------------------------------------- +extern uint16 halUart1Read(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Write a buff to the uart +//------------------------------------------------------------------- +extern uint16 halUart1Write(uint8 *pBuffer, uint16 length); + +//------------------------------------------------------------------- +// Return the number of bytes in the Rx buffer +//------------------------------------------------------------------- +extern uint16 halUart1RxLen(void); + +//------------------------------------------------------------------- +// Abort UART when entering sleep mode +//------------------------------------------------------------------- +extern void halUart1Suspend(void); + +//------------------------------------------------------------------- +// Resume UART after wakeup from sleep +//------------------------------------------------------------------- +extern void halUart1Resume(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.c new file mode 100644 index 0000000..de7bc79 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.c @@ -0,0 +1,38 @@ +//------------------------------------------------------------------- +// Filename: dma_ad590.c +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_ad590.h" + +//------------------------------------------------------------------- +// @fn dma_ad590_Init +// @brief Set up port ad590 ad +// @return none +//------------------------------------------------------------------- +void dma_ad590_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_ad590_GetValue +// @brief Get this ad590 module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_ad590_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.h new file mode 100644 index 0000000..e27099c --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_ad590.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: dma_ad590.h +// Description: ad590 module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_ad590_Init(void); +uint16 dma_ad590_GetValue(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.c new file mode 100644 index 0000000..00a11df --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.c @@ -0,0 +1,193 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.c +// Description: dma_bma module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "dma_bma.h" + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cAck(void)//µ±SDA=0ʱ²úÉúÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cNack(void)//µ±SDA=1ʱ²úÉú·ÇÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCL_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } +} + +//------------------------------------------------------------------- +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + HAL_E2PROM_SCL_SET(); + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); + } + HAL_E2PROM_SDA_DIR_OUT();//cpu»ñÈ¡ÍêÒ»¸ö×Ö½Úºó£¬ÔÙ½«SDA¶Ë¿ÚÉèÖóÉÊä³ö£¬ÇÒÖÃ¸ß´Ë¶Ë¿Ú + return res; +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); +} + + +//------------------------------------------------------------------- +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0x70);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); + halMcuWaitMs(5); +} + +//------------------------------------------------------------------- +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + + M3_I2cWrite(0x70); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + + M3_I2cStart(); + + M3_I2cWrite(0x71); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + + M3_I2cNack(); + M3_I2cStop(); + + return res; +} + +uint16 BMA_X_Value,BMA_Y_Value,BMA_Z_Value; + +void BMA_Pooling(void) +{ + uint16 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + uint16 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + + BMA_XL_Value = M3_ReadEEPROM(0x02); + BMA_XM_Value = M3_ReadEEPROM(0x03); + BMA_YL_Value = M3_ReadEEPROM(0x04); + BMA_YM_Value = M3_ReadEEPROM(0x05); + BMA_ZL_Value = M3_ReadEEPROM(0x06); + BMA_ZM_Value = M3_ReadEEPROM(0x07); + + BMA_X_Value = (BMA_XM_Value << 2) + ((BMA_XL_Value&0xc0)>>6); + BMA_Y_Value = (BMA_YM_Value << 2) + ((BMA_YL_Value&0xc0)>>6); + BMA_Z_Value = (BMA_ZM_Value << 2) + ((BMA_ZL_Value&0xc0)>>6); +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.h new file mode 100644 index 0000000..f5096dc --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_bma.h @@ -0,0 +1,16 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.h +// Description: dma_bma module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +extern uint16 BMA_X_Value; +extern uint16 BMA_Y_Value; +extern uint16 BMA_Z_Value; + +void M3_Init(void); +//void M3_WriteEEPROM(uint8 addr, uint8 ch); +uint8 M3_ReadEEPROM(uint8 addr); + +void BMA_Pooling(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.c new file mode 100644 index 0000000..446351d --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.c @@ -0,0 +1,59 @@ +//------------------------------------------------------------------- +// Filename: hal_dc.c +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "dma_dc.h" + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// @fn halDcStart +// @brief Turn DC on. +// @param uint8 id - led to set +// @return none +//------------------------------------------------------------------- +void halDcStart(uint8 dc_num) +{ + switch (dc_num) + { + case 1: + HAL_DC_START_1(); + break; + case 2: + HAL_DC_START_2(); + break; + default: + break; + } +} + +//------------------------------------------------------------------- +// @fn halDcStop +// @brief Turn LED off. +// @param uint8 id - led to clear +// @return none +//------------------------------------------------------------------- +void halDcStop(uint8 dc_num) +{ + switch (dc_num) + { + case 1: + HAL_DC_STOP_1(); + break; + case 2: + HAL_DC_STOP_2(); + break; + default: + break; + } +} + + +//------------------------------------------------------------------- diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.h new file mode 100644 index 0000000..063d3de --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_dc.h @@ -0,0 +1,8 @@ +//------------------------------------------------------------------- +// Filename: hal_led.h +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void halDcStart(uint8 dc_num); +void halDcStop(uint8 dc_num); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.c new file mode 100644 index 0000000..0e581dd --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.c @@ -0,0 +1,175 @@ +//------------------------------------------------------------------- +// Filename: dma_eeprom.c +// Description: dma_eeprom module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "dma_eeprom.h" + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cAck(void)//µ±SDA=0ʱ²úÉúÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_CLR(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cNack(void)//µ±SDA=1ʱ²úÉú·ÇÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); + halMcuWaitUs(2); + + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); +} + +//------------------------------------------------------------------- +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCL_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } +} + +//------------------------------------------------------------------- +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + HAL_E2PROM_SCL_SET(); + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + halMcuWaitUs(2); + HAL_E2PROM_SCL_CLR(); + halMcuWaitUs(2); + } + HAL_E2PROM_SDA_DIR_OUT();//cpu»ñÈ¡ÍêÒ»¸ö×Ö½Úºó£¬ÔÙ½«SDA¶Ë¿ÚÉèÖóÉÊä³ö£¬ÇÒÖÃ¸ß´Ë¶Ë¿Ú + return res; +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); +} + + +//------------------------------------------------------------------- +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0xa0);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); + halMcuWaitMs(5); +} + +//------------------------------------------------------------------- +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + + M3_I2cWrite(0xa0); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + + M3_I2cStart(); + + M3_I2cWrite(0xa1); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + + M3_I2cNack(); + M3_I2cStop(); + + return res; +} + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.h new file mode 100644 index 0000000..6875a54 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_eeprom.h @@ -0,0 +1,11 @@ +//------------------------------------------------------------------- +// Filename: dma_eeprom.h +// Description: dma_eeprom module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- + +void M3_Init(void); +void M3_WriteEEPROM(uint8 addr, uint8 ch); +uint8 M3_ReadEEPROM(uint8 addr); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.c new file mode 100644 index 0000000..fd2b78c --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.c @@ -0,0 +1,64 @@ +//------------------------------------------------------------------- +// Filename: dma_imc.c +// Description: dma_imc library +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "dma_imc.h" + +//------------------------------------------------------------------- +// LOCAL VARIABLES +//------------------------------------------------------------------- +uint16 M1_ImcValue; + +static const digioConfig pinM1_Imc = +{ + HAL_BOARD_IO_INT_PORT, HAL_BOARD_IO_INT_PIN, BV(HAL_BOARD_IO_INT_PIN), HAL_DIGIO_INPUT, 0 +}; + +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +/*static void M1_ImcISR(void) +{ + M1_ImcValue++; +}*/ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M1_Init(void) +{ + M1_ImcValue = 0; + halDigioConfig(&pinM1_Imc); + MCU_IO_INPUT(HAL_BOARD_IO_INT_PORT, HAL_BOARD_IO_INT_PIN, MCU_IO_TRISTATE); //MCU_IO_TRISTATE MCU_IO_PULLUP + halDigioIntSetEdge(&pinM1_Imc, HAL_DIGIO_INT_RISING_EDGE); + // halDigioIntConnect(&pinM1_Imc, &M1_ImcISR); +} + +//------------------------------------------------------------------- +uint16 M1_GetValue(void) +{ + M1_ImcValue = HAL_INT_VAL(); + return M1_ImcValue; +} + +//------------------------------------------------------------------- +void M1_Enable(void) +{ + M1_ImcValue = 0; + halDigioIntEnable(&pinM1_Imc); +} + +//------------------------------------------------------------------- +void M1_Disable(void) +{ + halDigioIntDisable(&pinM1_Imc); +} + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.h new file mode 100644 index 0000000..78c234c --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_imc.h @@ -0,0 +1,11 @@ +//------------------------------------------------------------------- +// Filename: dma_imc.h +// Description: dma_imc library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void M1_Init(void); +uint16 M1_GetValue(void); +void M1_Enable(void); +void M1_Disable(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.c new file mode 100644 index 0000000..80accd1 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.c @@ -0,0 +1,204 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_int.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_uart.h" +#include "hal_led.h" +#include "dma_itg.h" + + + +//--------- write a byte and checks the ack signal----------------- +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCK_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } + +} + +//--------- read a byte and checks the ack signal----------------- +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + HAL_E2PROM_SCK_SET(); + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR(); + halMcuWaitUs(2); + } + // MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,!ack); /*µ±ack£½1ʱÀ­µÍÊý¾ÝÏß*/ + // HAL_E2PROM_SDA_SET(); + + HAL_E2PROM_SCK_SET(); /*clk #9 for ack*/ + halMcuWaitUs(1); /*pulswith approx 1 us */ + HAL_E2PROM_SCK_CLR(); + HAL_E2PROM_SDA_SET(); + + return res; +} + +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCK_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + + HAL_E2PROM_SCK_SET(); //SCL=1 + + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +void M3_I2cAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_SET(); + HAL_E2PROM_SCK_CLR(); +} + +//------------------------------------------------------------------- +void M3_I2cNAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_CLR(); + HAL_E2PROM_SCK_CLR(); +} + +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCK_PORT, HAL_BOARD_IO_E2PROM_SCK_PIN,1); +} + +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0xD2);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); +} + +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + M3_I2cWrite(0xD2); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cStart(); + M3_I2cWrite(0xD3); //Æ÷¼þÉèÖÃΪ¶Á״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + M3_I2cNAck(); + M3_I2cStop(); + + return res; +} + +uint16 BMA_X_Value,BMA_Y_Value,BMA_Z_Value; +uint8 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; +uint8 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + +void BMA_Pooling(void) +{ + // uint16 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + // uint16 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + uint16 num_x1=0,num_y1=0,num_z1=0; + uint16 num_x=0,num_y=0,num_z=0; + uint8 i = 0; + + for(i=0;i<10;i++) + { + while (!(M3_ReadEEPROM(0x1A) & 0x01)); + + BMA_XM_Value = M3_ReadEEPROM(0x1D); //1d 1b + halMcuWaitUs(5); + BMA_XL_Value = M3_ReadEEPROM(0x1E); //1e 1c + halMcuWaitUs(5); + BMA_YM_Value = M3_ReadEEPROM(0x1F); + halMcuWaitUs(5); + BMA_YL_Value = M3_ReadEEPROM(0x20); + halMcuWaitUs(5); + BMA_ZM_Value = M3_ReadEEPROM(0x21); + halMcuWaitUs(5); + BMA_ZL_Value = M3_ReadEEPROM(0x22); + halMcuWaitUs(5); + + + num_x1 = (BMA_XM_Value << 8) + BMA_XL_Value; + num_y1 = (BMA_YM_Value << 8) + BMA_YL_Value; + num_z1 = (BMA_ZM_Value << 8) + BMA_ZL_Value; + + num_x = num_x + num_x1; + num_y = num_y + num_y1; + num_z = num_z + num_z1; + } + BMA_X_Value = num_x/10; + BMA_Y_Value = num_y/10; + BMA_Z_Value = num_z/10; + + halMcuWaitMs(1); +} + + + + + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.h new file mode 100644 index 0000000..937107c --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_itg.h @@ -0,0 +1,25 @@ +#define ACK 1 +#define noACK 0 +#define measure_temp_H 0x1B +#define measure_temp_L 0x1C +#define measure_X_H 0x1D +#define measure_X_L 0x1E +#define measure_Y_H 0x1F +#define measure_Y_L 0x20 +#define measure_Z_H 0x21 +#define measure_Z_L 0x22 + + +#define uchar unsigned char +#define uint unsigned int +#define ulong unsigned long + +extern uint16 BMA_X_Value,BMA_Y_Value,BMA_Z_Value; +extern uint8 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; +extern uint8 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + + + +void M3_Init(void); +void BMA_Pooling(void); +void M3_WriteEEPROM(uint8 addr, uint8 ch); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.c new file mode 100644 index 0000000..14d09aa --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: dma_tgs.c +// Description: dma_tgs library (A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_kr.h" + +//------------------------------------------------------------------- +// @fn dma_tgs_Init +// @brief Set up port dma_tgs ad +// @return none +//------------------------------------------------------------------- +void dma_tgs_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_tgs_GetValue +// @brief Get this dma_tgs module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_tgs_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.h new file mode 100644 index 0000000..4adb40d --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_kr.h @@ -0,0 +1,6 @@ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_tgs_Init(void); +uint16 dma_tgs_GetValue(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.c new file mode 100644 index 0000000..2cf60c1 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: dma_m4.c +// Description: dma_m4 library (A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_m4.h" + +//------------------------------------------------------------------- +// @fn dma_m4_Init +// @brief Set up port dma_m4 ad +// @return none +//------------------------------------------------------------------- +void dma_m4_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_m4_GetValue +// @brief Get this dma_m4 module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_m4_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.h new file mode 100644 index 0000000..915079b --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_m4.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: dma_m4.h +// Description: dma_m4 module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_m4_Init(void); +uint16 dma_m4_GetValue(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_sht.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_sht.h new file mode 100644 index 0000000..c817fb3 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_sht.h @@ -0,0 +1,219 @@ + + +#define ACK 1 +#define noACK 0 +#define measure_temp 0x03 //²âÁ¿Î¶ÈÃüÁî +#define measure_humi 0x05 //²âÁ¿Êª¶ÈÃüÁî +#define RESET 0x1e //ÈíÆô¶¯ + +#define uchar unsigned char +#define uint unsigned int +#define ulong unsigned long + +//------------------------Êý¾Ý½á¹¹Ì嶨Òå--------------------------- +typedef union //±£´æËù²âµÃµÄζȣ¦Êª¶ÈÖµ +{ uint i; + float f; +} value; + +typedef struct __WENSHIDU__ +{ + uchar gewei; + uchar shiwei; + uchar DateString1[4]; + // uchar DateString2[8]; +}WENSHIDU; + +WENSHIDU S; + + +/***************************º¯ÊýÉùÃ÷*******************************/ +char write_byte(unsigned char value); +char read_byte(unsigned char ack); +void transstart(void); +void connectionreset(void); +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode); +void calc_sth11(float *p_humidity ,float *p_temperature); +void DateToStr(WENSHIDU *Time,float datax,float datax1); +void call_sht11(void); + + + + +//--------- write a byte and checks the ack signal----------------- +char write_byte(uchar value) +{ + uchar i,error=0; + + for (i=0x80;i>0;i/=2) /*Á¬ÐøÏòÓÒÒÆ¶¯8λ*/ + { + if (i & value) + HAL_SHT_SDA_SET(); /*°ÑÏàÓ¦µÄλËÍÊý¾ÝÏß*/ + else + HAL_SHT_SDA_CLR(); + + HAL_SHT_SCK_SET(); /*ʱÐòÂö³å£¬Ó¦Ñϸñ°´×Ŵ˱ê×¼*/ + halMcuWaitUs(1); /*´óÔ¼ 1 us*/ + HAL_SHT_SCK_CLR(); + } + HAL_SHT_SDA_SET(); /*ÊÍ·ÅÊý¾ÝÏß*/ + HAL_SHT_SDA_DIR_IN(); + HAL_SHT_SCK_SET(); /*µÚ9λ×÷ΪÏìӦλ*/ + error=HAL_SHT_SDA_VAL(); /*¼ì²âÏìÓ¦Çé¿ö£¬Èç¹ûÓÐÏìÓ¦Êý¾ÝÏ߾ͻᱻSHT10À­µÍ*/ + HAL_SHT_SCK_CLR(); + + return error; /*·µ»Ø1±íʾûÏìÓ¦*/ +} + +//--------- read a byte and checks the ack signal----------------- +char read_byte(uchar ack) +{ + uchar i,val=0; + + HAL_SHT_SDA_SET(); /*ÊÍ·ÅÊý¾ÝÏß*/ + HAL_SHT_SDA_DIR_IN(); + for (i=0x80;i>0;i/=2) /*Á¬ÐøÏòÓÒÒÆ¶¯8λ*/ + { + HAL_SHT_SCK_SET(); /*clk for SENSI-BUS*/ + if (HAL_SHT_SDA_VAL()) + val=(val | i); /*read bit */ + HAL_SHT_SCK_CLR(); + } + MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,!ack); /*µ±ack£½1ʱÀ­µÍÊý¾ÝÏß*/ + HAL_SHT_SCK_SET(); /*clk #9 for ack*/ + halMcuWaitUs(1); /*pulswith approx 1 us */ + HAL_SHT_SCK_CLR(); + HAL_SHT_SDA_SET(); /*ÊÍ·ÅÊý¾ÝÏß*/ + + return val; +} + + +void transstart(void) +{ + HAL_SHT_SCK_SET(); + halMcuWaitUs(1); + HAL_SHT_SDA_CLR(); + halMcuWaitUs(1); + HAL_SHT_SCK_CLR(); + halMcuWaitUs(2); + HAL_SHT_SCK_SET(); + halMcuWaitUs(1); + + HAL_SHT_SDA_SET(); + halMcuWaitUs(1); + HAL_SHT_SCK_CLR(); + halMcuWaitUs(2); + HAL_SHT_SDA_CLR(); +} + +void connectionreset(void) +{ + unsigned char i; + + HAL_SHT_SDA_SET(); + HAL_SHT_SCK_CLR(); //Initial state + + for(i=0;i<9;i++) //9 SCK cycles + { + HAL_SHT_SCK_SET(); + HAL_SHT_SCK_CLR(); + } + + transstart(); //transmission start +} + + + +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) +{ + unsigned error=0; + uint i; + + connectionreset(); + switch(mode) + { //·¢ËͼĴæÆ÷µØÖ·¸ø´«¸ÐÆ÷ + case 0 : error+=write_byte(measure_temp); break; + case 1 : error+=write_byte(measure_humi); break; + default : break; + } + HAL_SHT_SDA_DIR_IN(); + for (i=0;i<35000;i++) + { + halMcuWaitUs(1); + if(HAL_SHT_SDA_VAL()== 0) break; + } //µÈ´ýÀ­µÍÊý¾ÝÏß + if(HAL_SHT_SDA_VAL()) error+=1; + *(p_value+1) =read_byte(ACK); //¶Á¸ß×Ö½Ú + *(p_value)=read_byte(ACK); //¶ÁµÍ×Ö½Ú + *p_checksum =read_byte(noACK); + + return error; +} + + +void calc_sth11(float *p_humidity ,float *p_temperature) +{ + const float C1=-4.0; //for 12 Bit + const float C2=+0.0405; //for 12 Bit + const float C3=-0.0000028; //for 12 Bit + const float T1=+0.01; //for 14 Bit @ 5V + const float T2=+0.00008; //for 14 Bit @ 5V + + float rh=*p_humidity; //rh: Humidity [Ticks] 12 Bit + float t=*p_temperature; //*t: Temperature [Ticks] 14 Bit + float rh_lin; //rh_lin: Humidity linear + float rh_true; //rh_true: Temperature compensated humidity + float t_C; //t_C : Temperature [°C] + + t_C=t*0.01 - 40; //calc. temperature from ticks to [°C] + rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH] + rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH] + if(rh_true>100)rh_true=100; //cut if the value is outside of + if(rh_true<0.1)rh_true=0.1; //the physical possible range + + *p_temperature=t_C; //return temperature [°C] + *p_humidity=rh_true; //return humidity[%RH] +} + + +void DateToStr(WENSHIDU *Time,float datax,float datax1) +{ + uint i; + + i=(int)datax; + Time->DateString1[0] = i; + i=(int)((datax-i)*10); + Time->DateString1[1] = i; + + i=(int)datax1; + Time->DateString1[2] = i; + i=(int)((datax1-i)*10); + Time->DateString1[3] = i; + +} + + + +void call_sht11(void) +{ + + value humi_val,temp_val; + unsigned char error = 0,checksum; + + + error+=s_measure((unsigned char*) &humi_val.i,&checksum,1); //measure humidity + error+=s_measure((unsigned char*) &temp_val.i,&checksum,0); //measure temperature + if(error!=0) + connectionreset(); //Èç¹û·¢Éú´íÎó£¬ÏµÍ³¸´Î» + else + { + humi_val.f=(float)humi_val.i; //converts integer to float + temp_val.f=(float)temp_val.i; //converts integer to float + calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity,temperature + DateToStr(&S,temp_val.f,humi_val.f); + } +} + + + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.c new file mode 100644 index 0000000..731a8dd --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.c @@ -0,0 +1,101 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_tc72.h" + +uint16 TC72_Value = 0; + +void Write_Tc72(uint8 ch) +{ + uint8 i, cmd; + + cmd = ch; + for (i = 0; i < 8; i++) + { + HAL_TC72_SCL_CLR(); + if (cmd &0x80) + { + HAL_TC72_SDI_SET(); + } + else + { + HAL_TC72_SDI_CLR(); + } + cmd <<= 1; + HAL_TC72_SCL_SET(); + } + HAL_TC72_SDI_SET(); +} + +uint16 Read_Tc72(void) +{ + uint8 i, ret; + + HAL_TC72_SDI_CLR(); + for (i = 0; i < 8; i++) + { + HAL_TC72_SCL_CLR(); + ret <<= 1; + HAL_TC72_SCL_SET(); + if (HAL_TC72_SDO_VAL()) + ret |= 0x01; + } + HAL_TC72_SDI_SET(); + return ret; +} + + + +//------------------------------------------------------------------- +void TC72_Start(void) +{ + HAL_TC72_SSS_SET(); + Write_Tc72(0x80); + Write_Tc72(0x15); + HAL_TC72_SSS_CLR(); +} + +//------------------------------------------------------------------- +void TC72_Read(void) +{ + uint16 m,n; + HAL_TC72_SSS_SET(); + + Write_Tc72(0x02); + halMcuWaitUs(200); + m = Read_Tc72(); + halMcuWaitUs(200); + + Write_Tc72(0x01); + halMcuWaitUs(200); + n = Read_Tc72(); + halMcuWaitUs(200); + + TC72_Value = (m<<8)+n; + HAL_TC72_SSS_CLR(); +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void TC72_Init(void) +{ + MCU_IO_INPUT(HAL_BOARD_IO_TC72_SDO_PORT, HAL_BOARD_IO_TC72_SDO_PIN, MCU_IO_PULLUP); + MCU_IO_OUTPUT(HAL_BOARD_IO_TC72_SDI_PORT, HAL_BOARD_IO_TC72_SDI_PIN,1); + MCU_IO_OUTPUT(HAL_BOARD_IO_TC72_SCL_PORT, HAL_BOARD_IO_TC72_SCL_PIN,1); + MCU_IO_OUTPUT(HAL_BOARD_IO_TC72_SSS_PORT, HAL_BOARD_IO_TC72_SSS_PIN,1); +} + +//------------------------------------------------------------------- +uint16 TC72_ReadTemp(void) +{ + TC72_Start(); + halMcuWaitMs(2); + TC72_Read(); + return TC72_Value; +} + + diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.h new file mode 100644 index 0000000..672b851 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tc72.h @@ -0,0 +1,8 @@ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- + +void TC72_Init(void); +uint16 TC72_ReadTemp(void); +void TC72_Enable(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.c new file mode 100644 index 0000000..034a3a8 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: dma_tgs.c +// Description: dma_tgs library (A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_tgs.h" + +//------------------------------------------------------------------- +// @fn dma_tgs_Init +// @brief Set up port dma_tgs ad +// @return none +//------------------------------------------------------------------- +void dma_tgs_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn dma_tgs_GetValue +// @brief Get this dma_tgs module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_tgs_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.h new file mode 100644 index 0000000..4adb40d --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs.h @@ -0,0 +1,6 @@ + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_tgs_Init(void); +uint16 dma_tgs_GetValue(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.c new file mode 100644 index 0000000..9e743a2 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.c @@ -0,0 +1,39 @@ +//------------------------------------------------------------------- +// Filename: M190.c +// Description: hal M190 library å�¯è®Šé›»é˜»(A/D) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_mcu.h" +#include "hal_board.h" +#include "hal_digio.h" +#include "hal_adc.h" +#include "dma_tgs2602.h" + +//------------------------------------------------------------------- +// @fn M190_Init +// @brief Set up port M190 ad +// @return none +//------------------------------------------------------------------- +void dma_tgs2602_Init(void) +{ + // Analog input + MCU_IO_PERIPHERAL(HAL_BOARD_IO_ADC_PORT, HAL_BOARD_IO_ADC_CH); + +} + +//------------------------------------------------------------------- +// @fn M190_GetValue +// @brief Get this M190 module value +// @param none +// @return none +//------------------------------------------------------------------- +uint16 dma_tgs2602_GetValue(void) +{ + uint16 adcValue; + adcValue = adcSampleSingle(ADC_REF_AVDD, ADC_12_BIT, HAL_BOARD_IO_ADC_CH); + return adcValue; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.h new file mode 100644 index 0000000..fb8f887 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/moudle/dma_tgs2602.h @@ -0,0 +1,9 @@ +//------------------------------------------------------------------- +// Filename: M190.h +// Description: M190 module library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +void dma_tgs2602_Init(void); +uint16 dma_tgs2602_GetValue(void); diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/Flash_data.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/Flash_data.c new file mode 100644 index 0000000..c0c5f3a --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/Flash_data.c @@ -0,0 +1,73 @@ +#include "hal_defs.h" +#include "hal_flash.h" +#include "Flash_data.h" + +#define OSAL_NV_WORD_SIZE 4 + + +void writeWordM( uint8 pg, uint16 offset, uint8 *buf, uint16 cnt ) +{ + offset = (offset >> 2) + ((uint16)pg << 9); + HalFlashWrite(offset, buf, cnt); + +} + + +void writeWord( uint8 pg, uint16 offset, uint8 *buf ) +{ + offset = (offset / HAL_FLASH_WORD_SIZE) + ((uint16)pg * (HAL_FLASH_PAGE_SIZE / HAL_FLASH_WORD_SIZE)); + HalFlashWrite(offset, buf, 1); +} + + +extern void writeBuf( uint8 dstPg, uint16 dstOff, uint16 len, uint8 *buf ) +{ + uint8 rem = dstOff % OSAL_NV_WORD_SIZE; + uint8 tmp[OSAL_NV_WORD_SIZE]; + + if ( rem ) + { + dstOff = (dstOff / OSAL_NV_WORD_SIZE) * OSAL_NV_WORD_SIZE; + HalFlashRead(dstPg, dstOff, tmp, OSAL_NV_WORD_SIZE); + + while ( (rem < OSAL_NV_WORD_SIZE) && len ) + { + tmp[rem++] = *buf++; + len--; + } + + writeWord( dstPg, dstOff, tmp ); + dstOff += OSAL_NV_WORD_SIZE; + } + + rem = len % OSAL_NV_WORD_SIZE; + len /= OSAL_NV_WORD_SIZE; + + if ( len ) + { + writeWordM( dstPg, dstOff, buf, len ); + dstOff += OSAL_NV_WORD_SIZE * len; + buf += OSAL_NV_WORD_SIZE * len; + } + + if ( rem ) + { + uint8 idx = 0; + HalFlashRead(dstPg, dstOff, tmp, OSAL_NV_WORD_SIZE); + while ( rem-- ) + { + tmp[idx++] = *buf++; + } + writeWord( dstPg, dstOff, tmp ); + } + } + + +void delay(int time ) +{ + uint16 cntr1,cntr2; + for (cntr1=0;cntr1 +#include +#include + + +void WaitUs(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} +/********************************************************** +func: ½ÓÊÕ´®¿ÚÊý¾Ý°ü +²ÎÊý£º + 1. *buf -- ´®¿Ú½ÓÊÕÊý¾ÝËù´æ·ÅµÄµØ·½ + 2. maxlen -- ´®¿Ú½ÓÊÕÊý¾ÝµÄ×î´ó³¤¶È +retuen: uint16 ½ÓÊÕµ½µÄÊý¾Ý³¤¶È +***********************************************************/ +uint16 uart_read(uint8 *buf, uint16 maxlen) +{ + uint16 slen=0; + uint8 dtime=0; + while(dtime<20) + { + while(HalUARTRead(buf+slen, 1)) + { + slen++; + if(slen>=maxlen) + return slen; + dtime=0; + } + WaitUs(30); // Wait 30us; + dtime++; + } + return slen; +} +/***** +°´printf¸ñʽ´òÓ¡Êä³ö×Ö·û´® + +***/ +void printf_str( char *buf, char *fmt,... ) +{ + va_list ap; + va_start(ap,fmt); + vsprintf(buf,fmt,ap); + va_end(ap); +} +/********/ +void uart_printf(char *fmt,...) +{ + va_list ap; + char str[256]; + + va_start(ap,fmt); + vsprintf(str,fmt,ap); + UartWrite(str,strlen(str)); + va_end(ap); +} + +void uart_enter(void) +{ + + uart_printf("\r\n"); + +} + +void uart_datas(void * fmt,uint16 len) +{ + char * ptr; + ptr=fmt; + while(len--) + { + uart_printf("%02x ",*ptr ); + ptr++; + } + uart_enter(); +} + +uint8 lrc_checksum(uint8* buf, uint8 len) +{ + uint8 lrc=0; + while(len--) + { + lrc+=*buf; + buf++; + } + lrc =~lrc; + lrc++; + return lrc; +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_PRINT.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_PRINT.h new file mode 100644 index 0000000..771f60a --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_PRINT.h @@ -0,0 +1,17 @@ + + +#ifndef uart_PRINT_H +#define uart_PRINT_H +//#define UartWrite(buf,len) (HalUARTWrite(HAL_UART_PORT_0,(buf),(len))) +#define UartWrite(buf,len) (halUartWrite((buf),(len))) +#define HalUARTRead(buf,len) (halUartRead((buf),(len))) + +uint16 RecvUartData(uint8 *uRxData, uint16 uRxlen); +uint16 RecvUart1Data(uint8 *uRxData, uint16 uRxlen); +extern void uart_datas(void *fmt,uint16 len); +extern void uart_enter(void); +extern void uart_printf(char *fmt,...); +extern void printf_str(char *buf, char *fmt,...); +extern uint16 uart_read(uint8 *buf, uint16 maxlen); +extern uint8 lrc_checksum(uint8* buf, uint8 len); +#endif \ No newline at end of file diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c new file mode 100644 index 0000000..93fd870 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.c @@ -0,0 +1,74 @@ +#include "hal_defs.h" +#include "hal_cc8051.h" +#include "hal_int.h" +#include "hal_mcu.h" +#include "hal_uart.h" +#include "hal_uart1.h" + + +/************************************************************************************** +²ÎÊý£º + 1. *dst -- Ä¿µÄÊý×éµÄÊ×µØÖ·£¬Ò²¾ÍÊÇ×îºó´æ·ÅÊý¾ÝµÄµØ·½ + 2. dststart -- ´ÓÄ¿µÄÊý×éµÄµÚ dststart λ¿ªÊ¼´æ·ÅÊý¾Ý + 3. *src -- Ô´Êý¾ÝµÄÊ×µØÖ·£¬Ò²¾ÍÊÇÊý¾ÝµÄÀ´Ô´ + 4. srcstart -- ´ÓÔ´Êý×éµÄµÚ srcstart λ¿ªÊ¼È¡Êý¾Ý + 5. len -- ÐèÒª´ÓÔ´Êý×éÈ¡ len ×Ö½ÚµÄÊý¾Ý´æ·Åµ½Ä¿µÄÊý×éÖÐ +Àý×Ó£º + MyByteCopy(buf1, 5, buf2, 3, 4)£» + ´ÓÊý×é buf2 µÄµÚ3¸ö×Ö½Ú¿ªÊ¼ÍùºóµÄ4¸ö×Ö½Ú£¨buf2[3]¡¢buf2[4]¡¢buf2[5]¡¢buf2[6]£© + ¸´ÖƵ½ buf1[5]¡¢buf1[6]¡¢buf1[7]¡¢buf1[8]ÖС£ +***************************************************************************************/ +void MyByteCopy(uint8 *dst, int dststart, uint8 *src, int srcstart, int len) +{ + int i; + for(i=0; i 0) + { + r_UartLen = halUartRead(r_UartBuf, sizeof(r_UartBuf)); + MyByteCopy(uRxData, uRxlen, r_UartBuf, 0, r_UartLen); + uRxlen += r_UartLen; + halMcuWaitMs(5); //ÕâÀïµÄÑӳٷdz£ÖØÒª£¬ÒòΪÕâÊÇ´®¿ÚÁ¬Ðø¶ÁÈ¡Êý¾ÝʱºòÐèÒªÓÐÒ»¶¨µÄʱ¼ä¼ä¸ô + r_UartLen = halUartRxLen(); + } + return uRxlen; +} + +/********************************************************** +²ÎÊý£º + 1. *uRxData -- ´®¿Ú1½ÓÊÕÊý¾ÝËù´æ·ÅµÄµØ·½ + 2. uRxlen -- ´®¿Ú1½ÓÊÕÊý¾ÝµÄ³õʼ³¤¶È£¨Ò»°ãΪ0£© +***********************************************************/ +uint16 RecvUart1Data(uint8 *uRxData, uint16 uRxlen) +{ + uint16 r_Uart1Len = 0; + uint8 r_Uart1Buf[128]; + + r_Uart1Len = halUart1RxLen(); + halMcuWaitMs(5); + while(r_Uart1Len > 0) + { + r_Uart1Len = halUart1Read(r_Uart1Buf, sizeof(r_Uart1Buf)); + MyByteCopy(uRxData, uRxlen, r_Uart1Buf, 0, r_Uart1Len); + uRxlen += r_Uart1Len; + halMcuWaitMs(5); //ÕâÀïµÄÑӳٷdz£ÖØÒª£¬ÒòΪÕâÊÇ´®¿ÚÁ¬Ðø¶ÁÈ¡Êý¾ÝʱºòÐèÒªÓÐÒ»¶¨µÄʱ¼ä¼ä¸ô + r_Uart1Len = halUart1RxLen(); + } + return uRxlen; +} \ No newline at end of file diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h new file mode 100644 index 0000000..d08350f --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/mylib/UART_SEND_RECV.h @@ -0,0 +1,4 @@ + +void MyByteCopy(uint8 *dst, int dststart, uint8 *src, int srcstart, int len); +uint16 RecvUartData(uint8 *uRxData, uint16 uRxlen); +uint16 RecvUart1Data(uint8 *uRxData, uint16 uRxlen); \ No newline at end of file diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/readme.doc b/Zigbee无线通信/Bæ�¿/CC2530_lib/readme.doc new file mode 100644 index 0000000000000000000000000000000000000000..f808f56fd9c46b4fba4d3e8601a773029368acff GIT binary patch literal 32768 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 pFirst) + { + last = *pLast; + *(pLast--) = *pFirst; + *(pFirst++) = last; + } + + return pValueToTextBuffer; +} + +//------------------------------------------------------------------- +// @fn utilReverseBuf +// @brief reverse buffer +// @param uint8 pBuf - pointer to buffer +// uint8 length - length of buffer +// @return void +//------------------------------------------------------------------- +void utilReverseBuf(uint8 *pBuf, uint8 length) +{ + uint8 temp; + uint8 *pBufLast = (pBuf + length - 1); + + while (pBufLast > pBuf) + { + temp = *pBuf; + *pBuf++ = *pBufLast; + *pBufLast-- = temp; + } +} diff --git a/Zigbee无线通信/Bæ�¿/CC2530_lib/utils/util.h b/Zigbee无线通信/Bæ�¿/CC2530_lib/utils/util.h new file mode 100644 index 0000000..dcf47d1 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/CC2530_lib/utils/util.h @@ -0,0 +1,31 @@ +//------------------------------------------------------------------- +// Filename: util.h +// Description: Utility library header file +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// TYPEDEFS +//------------------------------------------------------------------- +typedef struct +{ + const char *szDescr; // Textual description + const uint8 value; // Value +} menuItem_t; + +typedef struct +{ + const menuItem_t *pMenuItems; + const uint8 nItems; +} menu_t; + +//------------------------------------------------------------------- +// CONSTANTS AND DEFINES +//------------------------------------------------------------------- +// Number of elements in an array +#define N_ITEMS(arr) sizeof(arr)/sizeof(arr[0]) + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +char *convInt32ToText(int32 value); +const char *utilChipIdToStr(uint8 chipID); +void utilReverseBuf(uint8 *pBuf, uint8 length); diff --git a/Zigbee无线通信/Bæ�¿/Project/Debug/Exe/rf_set.d51 b/Zigbee无线通信/Bæ�¿/Project/Debug/Exe/rf_set.d51 new file mode 100644 index 0000000000000000000000000000000000000000..dcb09b6721b273971a7d3cb4768ed8ab4c7e0ba2 GIT binary patch literal 73756 zcmd>n2YgjU_Wv#KzLrYpV9A1oqL`P^VvDKpp5Z0DB#680K4J<)AjA{}Y!MU%ETCdT zY`AOhtE*zc25Z~3z(#+&i&$7eRz+7_M1}wNOuHqC?(T2@zw-H^FLP(knVB;)XU?2C zbMD+<4(Xre3om>+teO3vG@d!|tg+$1bJh#{H|~G=!0QKoci{KwZ}{Hczxlf@-~Hjc zuJ7LY?!nY|zuT&B(6qqmTBfDppRXuUI!UJ|{0kcNH-waERds2i%AM|;CQyS4)tp{c zNl2Oa89w~c{K#2Yd@?1Tgx>~Mgg+Xuo>p2MLW1+3iAZ1kD9jV#aUz@}!m~xVM1)Hb zYP`^5)Rd@BL7Wn)H7oF=O0LF_NV*-rk@&ri-vInR#Lti4P7!{NkShODgnJMkg5nub ztdijLlEUi3WV8g0)2WD5gu@V0{0I?_LZ~zJl%m4;$;m`%dEu#5haqt^AgEA}h;V`k zPY_|T2%{pb5Mhl7eCIuYI_!Ush7 zs0i1K@Hr7~5+QXcmHV~`-xc9|BHS**T_XHKgnt*|_Y|@ovl7J>C8YzwJ~R-65gvrF zAHp1j=xyV85l%*!hB);NaE<9Aq&}kb*$9UqT#RriLTY0e;T;IU*9Nt5F0%GVScZ`D zB@sS}5M}wY5Moq)G|DK?Hyk0D$VZ$x2jNW!L9*{=gcv{HpAZgbZ3x9n3lm9d2l~W! z0O>2ik5}-}f2atlZ%;(CKSekLGmyr77ByP)PgipW<(Z5nwE*Y5pMortY6&2uiHD|` zXqJYdH_t`biIBRJNCnv}JQyKxd`BV#zHcNb2Wi$Zh@&ivx|Tv>OA2#2o;6m)$BA&f z2nE|(Xtt&^k_B~9beM%k(Lh--gcOg9FhSTvx|VS~&5P0!)<-91M-E4G9z;5ZCU^?M zT7-`S8FYuXAifOb{{rES2=^gG+ft~_7{ZiC5Q05YHX%F~6;lO>r_!)yBP7}{M)(xM z8jNHggqI1#(~Ps9D@+!k_p;~4KvpuL_cS~i4g3Y zNmB;&W$vbsG8z7=vP7~lJ^|02_)&wGitrK<5;2s%T!b|5DSoL4(E%(@JW1&*MYu|Y zt3`N&2#F}dTPs3pB*kwL;hiG9M}+r^ka(Q%9unchBBait^v6Vq!DjI%MYvvs&xmk? z2%i(-^CEmvgfEG3qX=IXA;}@CXR8R`6XE+J{78f!i;xDN@OO&v3lY+wQMwHOCgNX- zaE}PT7UADT_`L}Ci;$Q~C*r^%T52-c+MYbKp|!1Pelr0g1i_eVeUi!Mj(Mjwv?k{_ zChJ?;TiX;EET|1iCg;wtt8GWNWaIqSWZnGcw)WcQcEa-2*S6PEIobGSCX)>d+8dhd z8|st5sDs$jg7r;pwWrN(sF!47wx&f5fE$tV1cBrw0;#m*y!rJFa}l@Z*0#=S zAZTCw{7F>YN?ELyxwTErlupDWR~<5_T>jH)o9FQAMg!ar;M%!!o0?}4-Dfs5Q!|jB zv4GXp+JKZ+G=_>BO6kdD)xx&+hI!>pr?u9$E<}>A7|%3s527*YTOfoLa(j*g; z2k?&&1``5$Veb61l5-o*Y?zyDYHn(m(EbDkxy7RYlC=`jhaka%^5m3?Y02p_HG@+9 z1+5KpYe9y2I@ORxX`$AJx-(f{^@2LbMlCKsxws-;Jf%dU@)Bm(x0W|F&uX77llxJ@ zDFww$gP2lSb+QDc5y02pG_OIX^re(=k}z|UrEyiVBR$efdTuZ2dA+2M?InF&FX`iZ zNuS_M4-@^m>U`evmMBJQT0>p?{8rgcj#nq6nUpQig3)VinuW(#sgpTQqr~CSCU^97 zcXWa& z8RhvoLqTJZ$vpq;+PUQo_0{ud&6=wiB}8lW;rQv)RV;P{9t>B^bj5tGm_@O4>UXQP zG1{g^h80D#+b)=5cEJ?0i#i%HR*h#yEvDl6ur|+cu4|}XfD-3Yq6cv)rSW#oYG_Zk zoz>RR+-5V12YVS|i_R`8E-WukmX*oQ@}OQus3WO?*~d3Ew>Pvl*UrsuuASG=)>2#7 zke!!3qJCa&vZ;O6$P;A=g9tkV-JNJmG}JXTo!L;)sQAy(n1pH!>#d2%W%m}vSZ{gg zS?M4>QCd}6ovf;q74vzLqzzk=ZG9wQ08x~d#J{?^bNJ#QL9SlNQ#{I(+ZxV@vt>tO z^BUS0RCxiS22ydEeCj523Tn!e)fLII@@iR@r(w5I!+2UUS{lz8FY$7S_#+Dn3P66M zVoG*&O5vo^?5gNbOS3D>3yVv$Cs&l0lqLWLj?82i6j22^(k4heE)l2XCZoA^alRh@ zj0j;PLi(ybA{6UsL>_SAGcI;@YEGW4%$=-gkbT`;?^-c?119AvJkNh@RbNX z+S_9Egx#NNfqJrsv}Y)dFK;a+SllZ*)N&|R)54OHB;SA}OQKbkImwBV7Czw$3i$3l zJCXwx)L2gi@;Q)9M&r@yWK`@_WVR7BqKEc0og&#Iil!9iCQIU@66Tno(dN217c6cd+lVkuc1%7VmpxOV-anORXl10ZEs#8L$yC#()e)3!E*PXCubMDOYfW zqC)HeW5X$mM|v6-)h%x2sWc7)k6U@-xk*WjHn->HR?n}7GASF&h??gjm|`};6zfUG z|DL+V(^YR#+QBr0{gS2At07IWH)MNY*C6w*lT$=eBAB_dcH!Ll_EIT?W0cG_E~Q8S zD!TzV=LzoZDGOt37r@huKljkI_b82vODqwE4Q(Y2b*&3q+U3IL1eG?sK&*?;MRuDf z&XF;mjX1L+QJPHT=8YXE`@=)j`#li#A*J#5f~aI|eO;2YEm^`48i_uq)wVU&B^s-+ zeW-+}Y*1iE*M*W26|;w)U~K3Gl~@I6F(@bAly#_VwpKvdn1Z2Texj4h?7F6w*$u74 zfwJd@5|vr*DW9x}E0G}jfoWH=R+ToTrd+0Rb*7~;T9rV7Z&Q_rP|^L_l732SQ#lR?3lmkUS$v(qhJ$Gus!-92+UBUz7CEQaH_d9A&vj%;AD`Hh z3$aAkB;x3^WJ$5oK6$Qa^`vCw{Q0y^let){m?6L(l_`0&k|v;{qO}w3bW&Q~DjCbo z%m;+UV$6u3Vg$2Uh+yuRE&K@6<{HAZW49t^V-n2fD2g$TQnUnJwTD#fc2_>CFYJP` zQusj3Z>!78os&FGZ4+4GR6u~TxF@4_IHhrhF5v21rLE7&%_;_qZReAby4)P4qKUc0 z&FMYqdj*w3Vv-eH4w@||V1#$);?r)->QH%{vz2;d`QSP&;)tdt|kLl-zmLuE>>Xu93p`Wo|b8~b2}RNqKLWQ zXm=f7kgCc{ODi4Qd|vCBlu6d=X+Pdju2V z$<{_&z2e26>MouqPIo5?E-i-=I1OeHWmMqufy9#sz+2?T-?T#r^{^o5BCoEoKX_t$^7Aj4*AHMKLB-SeazYWWvqEMoD5L zzC0z%a1PN;R~B-nESjjQW=5kVRQ`k<9?lGfCB+yswUzNy(Lh!3_MZk(-##10!&z!6 z$|jZ^*lhtzGW(pn8ot?4Y~ZP89#zBDRELpnY-IfS9Q>0d3B8T9_pxpX$5-BhX$m!k zC^JeumJ(q&b7}sLLL=@%9gy5!A$h$*#`Ovr-z#K-8=_`rv?AdY1+uwCvS)@-a|bgi zcuH+kdo|3eZA@)wC84O~A?FpL?oDcFPqeiugBjzrZ&3_mc{N)|WgP3$85O9ewzWOc z(AHs_Cpo_rFeQ~N0;CJt>KB)$at30jf#t6mW&1=3M zoCY1bqa~^Ay9~z<`g&UG*gC^Ymb-cFTzh$_n_Y`OQie*-5ZtOkBa1?nRYS*F6Ym06 zA;nnZI2(&WFK(QbR2|OeHTLC6&nlz}P|`}zlJqN{WTs48%~$DAxShNzR*@&@T`kA zz_W^ahHD88mnZE)TW<2vlIw;|>X9x|M@Uln+-`}UDW`?#!1842)MT-|pFK(= z5wn{}FuMaOrq&c42a>$2MRzjwUUa8g+nD!)-JKESvAdIEc3l)>bZ~Ynm|k8{SmNHU za+z$esxJ6#WU2_7bokKT=f*P z)}}y7(wiua^VumSuve1lYZ`XLQ>sdflZtbA zQKLCGf#b2x)->Y~S)F|ed7^B)`5(7cS?1{UPn1Al}stLlX%ToS{-OS zV`ao%N(ELmu++k-idQLi@hZttyeCbKFtdi|((*sDr>#*0=Q!vDY$}p%WYuYEUubWU z#Ad6KnS>!@FAc}tfOP!r1&Wc(Nh;n{DT*;wikeNF z^I&63mes_IlasDiUOrr>Jt zp;AUXjSubn!3ORY5Y-6AO zaeAvG#l^XkWj;rmvXe>)RGLWGQ{9=UCL{047T7i2<<;aA71k&Pov+k(GsV19-5oEC z%j{eTuvs9JcxOSUPBfg+(a@%9;)+tDOjX01!VE@=J^4%#3%}Fy%{!BZ0R7K&Y>b7h zl6B?{vNOdn3uh4R9hzu7I~!(5|6;e6?#b{+du9@G3l(v^_vW|Q1|^%Sv!J1LB->^; z)ptm$?Dj446j7aPkCWi;+-{=Qk;2z|S^+S`HI>zH(O_pn_UbOCDvnS2RJGOCJ7u@< zQEhT}8bR5#CZz&!rN%wyWJ{I0#%wj+JsWi9ZARV7XAB#M!WPo%m;qmw z!^ZI;Nid5&=qB)VwTOy-i*yrqk))@$DrkJf#`%Y}Da)nlMo+ zKWewRhp%J8Q9?}?yNjmx+C|enUF0fBO)^e&OQR&(g{3B*r@5IlkX%4QtD;@G%ZrxT&$*%I-s0V*MSL9KL4!B`DZn>PH}8jIMK}w zv*0Isrh6B%3nepgtV%9XgYO~sNFvrotB`FH4dwP5Pht(MbCZ>N=haGK5-^y0&I#nI zt=Au`Ca0vRM(Gp0{>t2{Ql*TDq@3dwY$G#>*Vue?r@HszDAY?{}diN}_pUlY4J2YNoMJy~fv* z>O5O7P($lYLUZjTmCrLIgrt(VXn>IBM=8uJQ&PxbbR>Y?1U1d$31EaJvlHvH7-LW_ z`1u)2A#-0=RwyIgm4#v~3o9TEF(sWDrX3@gvVR#AQ}!>T4`ND=vzRhGGE8+0%wj1t znyT64{#RR{AXfp|Y(+~tVY1j@JSYo*(GM|Y=wvZ=2+dVtQlN8^O>HoEoCf!6lfA0I z3K@iKsj5hdF_?$h*!G>LwJxZxZBq7Pp4RS4<3l_Te%z9HQCgidjn#gbs|m`1)KmM( ziax?%-7gjo?jM%pmg%fy!nB8m%$D|G5X>GZg0Z3DW*2)h@lBd-fOZX!$7h1onS+w- z0ihUUBe4SE04+DS`w<%7eavgA@95EK+ul{n&J>zlZZ|zL*VZFF9hjgFRQc3$sZzYU zWo}aGmV9~W=1S#s4B!(#S(%$u3#gr>Rzf>TEqlT}MR+eTy^$;>vY|W&I|Y_Wo_0;Q z+ePQX5{qZ7ia3%4zu5lyk+I52oWok!vWFG09gZsW`U7*{ah*lwV5e<6D!W0|P7vdU zNiJ@fEMuM~%v8Kh__o*~d=~3w3>3S5*;rOrT$avaQxIdbgiCXrZaaHN*yHOu=pe7A zEf>gY^JOGtL7dF$2#zwVWmRH5f#{7*sZ2)8lCX5vC~cc>z^ba1Er;(lmH9o|+&JI1 zw{qTt)K`WAm7>-dK8`gx#Z^iL;AGKBajP=ZvNr!r63${X5M#Z^i#VmExY|={Wz>;ivY!J*+MZ}&{K>_A+Ax{{;qj+oH3flohs%O^&(_0}My7DaAVW=cxe^B=XL+q{ z0^vF5I#N9B%T5Mhlq}%FfV{!kZch@-`kioD zzk7(dg!<8w#vJuIOSU$&$zu2kFx$;LtY&VPHdfU_7m*ZWM0zS&K^619Y)LF2S0z~y z?~>}VUd5-X+D?(YS#2vmJR6XdDx?ZhDLh+cZb?+l3Xzo4Jt^Wy;)BwGg9g_jEq@cF z7A<6BWGf62ufiZ&+SEL+w#{ShN0(y%fWvxwOUlr5|rtXX}M^&1TYS~*2RI>Ne<+L*pg^;Gp(oQJE>;Q6*W0E z#fnjQ_qR-GXzqyOJvcQlJlWZc37)ivs7TI@jdhJm$g31(!{Yf`%9>hjIl`CNIyxn) zYM2X`3^+QvTD#8GT8gpx#(IKcwz#Dj6SutPc{p{ECGnIFM+(b-2XZix%!MZgGg;m= zYj!)_k@2FB%k_i{jMHqjoA+U>QxoS&?am}#af?G;=gcqWnxv2S%slkFJ=S7Pg{wL# zv0leY&lqf?G2lhFEh=eft5dw>m_N)nXP(yu8?Bc1fzoDrX;Tu#y691qYs+NzDlJtd zm<^i;NOF4-wv!`0C+9emSp`qHDtOWrTkncJg_u3|PrG8zxMI&DX7j}cSL``gjNb9J zm*^KuIirM`{G1eEHpM=s?y`T!`xDB?}h7`ofX(aXDPvuC^j>Uz25S?ahjq4$0DasAD zXXc6)x)=);SAAvYv)AbFa>){wBc1dt-Xgd)mb@&#|3slkH>_Z z;8urg9~X%&PH#UU@#(ef*7k<_qV5g?7zx7*eTXs2xQ#bD4M6sSDX+i5 z;jrNuojCQd;9jRDFDvt)v)#KG5EoBKe8CM(YBlf_!1Ov{-S8ZjoTALILNnv~H}2k% zg{x^pUBdi>B!v3J^gH{6#aN#Ra#`!hMbo)M;nRT(kFE5|{_Oe9v(Bn*a+MlHscM|r z-6U+BN0S@Iu%6s7CUP%~dUCzC{VzD}cmYLCdE{4SKQmp@&O5N(7FV7QJc9;|uX^BG znAjb!<+5HN=S9XD90|(?+J;yAU5z3Oonjx8Vyvq?buF}~DP5!BmEH58y4h(;qj6Xa z+4|vH-pwJhW|t%?>S&r}a4Rc9v}o$DZ;G?>ewcW{x^LJN6E z+bQ!~l}O?OtO>{GcoRf28s~UQq_{5?^dR3u$eanVeNoy4PigFE zR$BpXdlDOt_9?JMSG6i2FSOaU17fW?0j1kBlwx*kC}y{&5V4+G!*)r$eB361?Vjv@ zPeUH1hIrDLTOAigjuGYD$#;8+#vXPn*p10b_~Ws0M?_8sNS9@vk+tb%cmjUBv#6U!`{Ysoery;EK&6W z*41){8!4-4j;x8V5tZ;m@|gMI2ih$O?_qec;GCpRW<^+GjU1LG5dKK00=%mj`6i#KjNxiBJ^kLt%VUsYLKF#?izWLh94i zT}kJOusjZ|n1Yu?ar*~eNsCuhR`pU8+otj?ynCem%yE^60CVRebOV{!x`Vl2Qg<+? z9dFw^uF~?fhrP7yWULDKTC&^JT#R*_i?JwXGZw`dV~M_WZ_vsrY7`%F@!Epd7G#$& zuKgtnU`v>av0X5yv~@w%?E161;j8!4&AX6Wos*kXRtAj`D~qn)W9Q_mg-k~!=iq6! z0VS3D$#)fq8<$xDOc21&WnSu|5j+Fk;GG!F&WUCQ$iYfRajn z6Ylp{_(~=WV$P|>yR&VPeapcSw7oo-c)Z)W0dy&LKZfi{E(L@yez(_R`R-SqeDeDh zWKPy7mjToyvnCT*VrD2)oGZ@;U^$lAh6P>|ukE?Ow0PTb!NatZsW-Xy0QWNPMI&qC z6woG0S8PxuabJ?|+oWuOD-2o_v2J`hsmaX+zo23L4lt_Y>;$LBhdvS~O8z zgV$%InL|x}K`y&-D{5a$$E6a#9>R7M_Oy2@wU;-H$(**??GYu{ID0go)>_fX76hf6 za+!>)x^P{IdsE1Z;ya?a$Cb!@3w7Cx55?G+c}S{J3{4np`irqw785xlo}4o%C+}|2 zr+jOGQhq`pZj3s;4fQg8*pr>T(anWB)OjhSdY(QkKgXTjp`3Jimt*}UGl()`GOniA z$XVMR@}jDty?Oz2t&k03sP9WuK2_Lq4lR?vcOWr^?}_KiMRw<-MB&uX$&2&Ynh$CL z_a1aIqv&Mj$>vP=^ipGmu2&d(g=tjyj0(%B@Ea8YUq#SY5%N`peHAIbigcsmXkWz` zU&S$cMUGK1UXRsBd}#iwv4&B8dTo~OtJSnvV@5-4)^OH~n%UUc7@Ix1KPk*XAHicy z0;I)GAKkynPM;IOw9uomxx?qs`~c>>(f#S-Op&iy#+rWbwiIW?5mr4Y*Am` zr^n9jt6O^PoW8nWkDc3B59qP;#?p|Wv=DwoGMVu3Pk;1G{=g!So#lx9W`QH}IGwSJ zfBF-PA}XN=4AjMHP6>ygWlrk@?VLL%#z>#>!alf_R{b_T zb~}hz=OE&j5=iZAjQtAWUpl~dpv2o8CElrzq)I#K7rP6|sY`zeb!ll2i7mt4^BUR4@LSZ#wEUZjljG zY1}F!sM79dDo^ndI@65Eenwx45r{peM;-+=`qbEOK*(bb!XDQ%ext{pKJp3j4X@zevngI;2G z!eX&5^yMGuQS{|Is#6}+WACC<-XWmq%>Pi01n`flB5xyCIvQyNoQ<@cjcjl<((pSP zX`Jt9q*mr=q_&$k@=vO6Pa}<2U5)%BZ{(lR$Uiw6xm9KNl3wp1U9WSJe!GKo!*Y^- zo`ZDV=Olfylk_Mj{XJE;mvqLPG(3#gw{p_Af%Nwrq`$ASdr5C{l0Mr>`mda%2c4uZ zc9I@+lD^A9x^V#~{R36Em-IqLtR($?PWp!+{R0Q-AF1qK(tqhB-Ni7o9Hi@wPSQJ_ zq`&7NUH`yAy8aO-eY>jLL%PQ2wj}){PWoR!`gRBDAFJ#h(v9&B(v1m@UN`a`q#MUN zNk7g(x^aSobmK$^=|%x3eTS;sL%Mz(BUY0BF(-W|NZ;Wg{S%d)NQV-^ehBm{<-!PT z{XQ8XEiEo1STapRMj-#pV^}1%OOJd)bzC3&E5ze2dK7Bqr+UU;_1I@(k<#=}_1Nc- zBA*e8kRrP!(D;;A#xDTg?Eru20MCj24bU$g(698-eVb5LD%Xnl=p!#DXeJdO`x?aT zp{Q65|1O}^aaL?EpnrEjzd`&{M|>aR)I8CWZxLl>i^9IsX~Se*9s3@D?;QE|%N3a# zdq75b<2nto5kPcK>;hwWDviKNT5Pc~oK!gci!Cum_g_rPk;dC}p)qniBGjbJ*hR)D z|Aib#7_p@yAJl@20U|^}?0bxdsTU9SGMNOwZ-LcpZwrmVja` zuNT9jS#y?S!G`*C1F~Q5$i4R6Wyf-`xsHP;-yOk@Vjy6C}O&8A9`d!rL0VAJpIHp#A|TJJ3ggqz%Bh zk8hHY(uv_eL`s+oz#hZYeqk{{cT3O`fbN&M=(|AXp%Rgp6QrXs{L^WhG?PVQ4;qmN zK#s9A_7L@>qsJZ=bkAgTKLV&@KK~l6WMyfwN715R^L#V_vBy+BvEKmnm;>}U3Zc0z z#^ec623hiw@Kb7=E5Y3G1l@!O~9~8PDsnXT&II#+;{(*t5WS#(}c|wLHyh zrMhCz$q}IfpBGtYvaBy~F+xpAjlGC`FF5kOWDI}WU~Sgl&|@1>%S(=0HW|Y&5zslY z-vYSF0el%naoNFn@)cRsOe*SCnU(b8*NoxgStU@ujnREybCmKs0Xj+BsHI_ys5MqH ziMIm~*Hyf&v2~-CZs-h-ufotfD;u>8lP3g{$tIEFQz@s36icPFh!nrUL@si%@4;-; z`UZFkK2syU5Ho+?MlCbQQ-dg7Af|lLZmY%}=(&*bYvpZ%r zY}B$+c|w>caI8LQDkr_pj@ab;J|ZmwzbPhh)YQaLE%N1fpaM$)4{7y^UK} z{QcR7j`%l@>>N0v(bF}5d@vpS7F84`N^ru9_o3mnk3+@EibS=hM|y&m;O!Iv9n^E) zXk63B$9n)$RsxQT4|U}%&87Rb)uPv?;|k)V|7^^75KW zP0x*II8sU~P61VUbZV8N1>?TzL`^ALPw@gR6vwdQs5=pjS4E38%^d}-3EyODYQ}x= z@yscuQz{atCJU>9T~t$Ds%cb4f306Uy_j9kS(U&YMHN-Wnw~?DG_8N!Usf0`FD()E z_0Xb3Xr|MSGn4&}u44heU@s(7T=itxe93z4MBSs?E zNaPubu|{H?kr;0zCK%IljA;>LTCOoI&zLsWm^RLsHr|*v!KkYA;aa`P^rzgypUC)3 zAAEEs)1Pt+e<+~<*MbcS@hcSYGD?Wz$;r`4lY{K3yy6sN)QFMB(W8$t#~hOr(Ka7% zVDXI>CbDz&^T$B;rXFb?q>s`LGLF^`H4pU#vI2br0|SEsg9AeXLjwl|Mg&F%MhA|1 zzJoDJk$v$+Td4oA&V!mFe7f}~k zCAbPKC-WcasiIyxYuZF(TE00gl7n9azg+zC@EeQYIQ+)rHvzwi_yI2$c)7sK1zs-j za)Fl%yjUeZz4hA9**3v*EkQ*2q827mTgn=P56(%1tcc=F{~E)EUKd0qaY`6b2z=` z!p`cn44gHgh4^QuQB3j0#c&t&>o`q(3SRQXJ6~cN)bsdPT&6r>y}Gd3hrnDBpPSD0-qN?GTK|JWm>; z#$URpneK7pDsm5a`c`+|L#Q3hl4Q4y&Q?wEk+U5PkC~s`c*dw6@R-fY#zQkS^GY|K zM)fj7myJgl<|+@~&FF)ro;1o!<^)GScT#jF{jtkqV+sAhnMS8O`iqoSuz3{(Kqdr( zzleR+={Z0C^{>**>TJz7aZDs9q5a`{!z?a7c19(?LN&XrX>LPX_J{=&$B&#r>k|Le zW7~{UeEqT>pRLS>^ZcCC8k*~7XOAC~Gh<@TxX6sA=DHdAD5D0St!SGOZ#Zi%K3y>b zZ&uF1z0Wgp#wUN;G^?ng;fdQHd2I$RH5`|hlbqXh+KjsS^XAQOo^k9ym=hG9j(1*X zRF%f7;M7)a3rZxXbOAEshB3a+i*fwUiaqO@G{qSu@Ey#Od zOr6P7U~-U2vqcg-3=KU6zck4Ibki{6S)}?o6h(aQO>?Kg6|S_p8(wjFq8lF4p4I$p z=mxT*eGHIs#cce2ke>9gX3+kl%X%f~*D@KN!FF`}0llaLI9=AY*k2BDfFOCyB^-2_ z2L$1u@8zHs9uVZ3c_9Z~EEBljEW11C394KRwYuJxaEkE^CW5P#emMwL!1eGfy%yun(SO9zE(i=sYEHj&UQ*ZpOkzdl7`qXj+rfz`fDs{UR{Su>Z1h-tF=+3Ow{pJ z^Pr^%4JgJTKjc#Y!Z8TN*k|Z{G`)`wKs>Xk5c|_)qAXcfT$Y4qu;$NMFmdAeNIb&@ zDVm}U7;&B}iQI^bri_gDaitbbNtSCv%JH%zcE6GFBRs&7@q<-LB}%~Ving6_9mVJA z;FGKk9Wf#|dvtaLKML7zBpycOjvN{9Z|5y9!PigXN&1Yh=F3?yp)B4{0jVkR3Zk!E zJGd887<^=j7nyiVi}kmXex8VRf`3uH}r#88a?> zRCZo2{?Kp4h_Tcd)&TyOHBL6jS-&EhkHFZ7qhlwRBzW%_k(~G-MOf9TQ;I6^)gW1Y zcm%5$G>mj$5rv|wSr5aIGFTNcrEofcr?QU-Flb^#BzHpg(b)>4r%`gk3u~q)i9U?R zr0U5|2pgYh@kj@gi6l**=;%Vbe=%N%^fF%53gR}atgyTac9xv@Kt-aP1Xzlm)doJR z4R}`T|Ev~zRtqu#i+wue?gh%mkkppFF@}cewM>Hqo5&2#4Jo9xP~4T99!H^V;jO_QQpmacic6>3whE z`Cbf|T#vP3##_wCuFJYOY-(Ao4R*d5^APK@esA^H2C?3;S)yt*%g z2Wda?6!~X%gxO{N0r^;$W!Oau9q+B)b-cGp$McjpmHFazS=XTf-iDve4(+?FcdQI; z$W+$-(D5jY@xNPBSs16krp{qzki~*qQ&`CG&9H!-%hJvjvG1p%rGW=Gx0%`<`m2G` zbZxldTX}T;u*3QUw;6pF3|p<6hxMn&^Vs76dOV*!9!!sCvByK`aS?kwlpYtd$7AU6 zT=tklkLR$*2tA%nk6ZAX3HC46fY3E zrtZ&J^tM0alAm2r>u(M`bW!`DTM8dND)3hQ2m3?e4l^zA*C|`|{6PEPvy8iT?tcS) z@(Rr{eHhy%9UNq?reJw9{%ckj8vpD-n#}k|h$FP4X>`{!;x4D{6->D-y4@e`+{+%;0bAe3AL-eVlgju;K-TTpy>91j8CkdPue;ZM>cn>8 zQk@KcVfcLAF#AV|8H1;6egH?}wQK#78BY|<*v9zh2bi&yA$Xawouy_I+jX$VpU~r( z>~R=9avmN|kDT8RqsM=Yhv%g0Gt;##Wd;#!=pTgj@ZpSGw}M;!$2>GC?UjJ#yYabT z>Iv&YVbeOtKXc^q{?OEY=6P0MW7xjO!{=EY+1G`_XIbaWssZb!w0{ZK{phvf6%15QN2zL}h1aMaJ(m*&6+VZpJZIE9^TEi)SkaxUgXap+3~&&h_2T$6#>+s+==ld0}Jx+pet?`5* zdF{VO@I8(bC92gh_J;MJ>x^N(BJpPVGm_UwOVchf`<+EBlQ}Z&y#RmohlaMLUGHl= zoYDup8V+8Va>eYR@5bvXKJZolnSps{hBN#lrhXg>r~7{q_>VJ8pFeH&cGLJ(LZS_* z_b&umVCm0qoD>*cA2zT4W!Nx-{_whI{Bs_xW32N)HUDnDJE5pi;F+Kk3V6+qM*l=g>7N zY3uxb^1}uf&u5>yH5yUOKk&5+9=+-M#k+%=j?DS>K~>2L>rkO%+fE~S+BSFsNiS2tdCPjNctA)o%5sl?HBAbOl7Pe$*DjiH zww|TGP7_G8hdTU=%~xX;zfr$Pm!kD}v5fOY_y?A8zF>QoalT-)Wt=bAY#HYZHe1I3 zu?2g}W01W>mf^c9RWHk8+;Bx||50I|Y54sguW$HE+JinJa)U!>28RANZJ*BL{T3;~ z>`xoons%e#viQ<&8rJ!vPDooC;5?8yK*`O4!_pqLGC$%hcEY}}KN1V%zUV)G-mtW- z7RL^S4gaa>qx~KKkqrBCZfQI&Z6dEPZ1m48NDGBeHO-b3a8XA4SI`ZJi!KdcmcsM{ z?Lyk@>XV%M0m)#cAB3-yyhMoE+K~>e6^FC7e&9xoXcHZXq#xWO)mt}Wp;qS5O>s14 zjFroNc%G~pY#d(8**HWCL-9SU*rf|D~&^Jhx9x3$=cM;oo5oDma2DvgJdQ5X$ ziwV}(F6y#wNF~;XRDLv?KVf_Dg{x;(S{DUFon}X9)hA&#?YerGJZ?&%|-MYq_lFsrS$XizYkn%^_qK1|Sn>wkw!dX6cuIKllbF1B>CY-b{Xba; zKbLJ;Pa0Ou!V`yWIn7|S8~!g+_5Rtc6Fx;J1eR`6!rkA0=ox7rTEHS$oc?JI^80=MQ-qJvo?Z>dV6`Qb=2GPtP*eZrc;Y zb}EGKHJ>4im_EQcFEQPWbEP_-GToj6U!)$a4X0To)N#_=uf`6K)bTG;kJgTHOhvM= ze6~dFG*d2h7Lu=>kY7v^U#{*i?6_&?&6Q~s-;;{veotDb@AA|u(iWs<`Lbx~|8Cv3 z@9z%ZgN6G0b|cG}y**eOnt23~zX7TpaW_3b4^1qUbd)2q^c6ezgrOyH?EzZ%ju%#k z_wHPs^36rT#TSK^Fg*jBz>%aAXuGi}c!&v5{F_b#?5wo#lt+l2`)#*uc0O6M^GJgL zM)1}&yqL{Ka%~z`?%>pYb#E&<9SSc>Ki$FG#z#<|C_{cGU+W+eocyg1*c#4HrK5cL zk2aqAu&t^2)b$#RjfN!A_HTtic`(3J;1MNKP6_gq2`c4rk#d4c*%IP7#VX|&VV;7C zF3Q;_QYusmwo$D18kO=$idIk{{RIN`^J-{;kZ7}F7GOd_eu}P>k%98R*Cmc5B2`hKCb_%#9P%vdFR;W?T~mk_i$YQ zgneB9w!~X5kL&G25`EH(GzJgiXTUi^G=I8o7oY&iiUc3gw2k`CQ?Zca;eYm@w z_Yb|>dArEYTkzUr;uJnW_rc<0rT>@bt>^+ZZ*S4HkW7>FHnZEj^%WLR9!oCd^pHpH z;`ETK>0{YL1V@InI%aS`naA+>F?XSP7RF?!PtJNU$aD_c=mF7uI+cT7@_^ubr|;vS zWrn-J?~zNm>s;dj!Lv{QJI}RTf`li}CCD}PW#T%wC(p&Gm?;Ym)=seZe>rQ%k&nrS z3j#qcjVTMZ3^87}=fL4|4!q+Jin9`hs4x4yjo2a)*Yz-)zqe;;v8?%PNH2E4lA#LJ zme_cMB;Kn^%JIoZO-3QTIm@UC=9rg%dV|l)cQG%S?b|W=gtrWvVa)605}aj_*UU2Z z_c0Os4U0V~V(VFKy@)-Eyg8S7OGxe71IC&^C8^0`U#TRqpKj={@+?&dyMKc&l z|0(CD9z8Kr$g7BzJ*G~$V)oG-iPAsw5xn_8sC9MZP&!5q>NuxElkn1P;`!Mf|M-Mxr;f@Ab_E*2;*WYwu`wK*8a+0rM)Mt>jOK|ZZNrNKkIPE zPO~F(wqsvouI#c{5%~kM^tP2&90t5B{ax&`)b55gQk)4V*iPaIwyS}n%3?oL`-(R+ zwSux+o$Sxfy;bW8-~z^5io3uT@nS2>^W5((H0X z;#j+Iz=&E=O2ql58I^?h%9sxo9H_Xf4)>m_#SHj0&5B;<4lS=6@e6RJ=3S4LbQ3^_ zanPL}&@+^igMRM;twpsz<)AwhNU0XaI=KPRHAr=?{M?9*jDzw_yy9Sf4}F^s+D$PAnX`wvN8 zi^!~bi%$A-WaSC#!snl`?&Q_|UkioL@OO;=>sI{@Y8*8K1(UoIM+IbKoxNBb6=Xgt zEkGoKo^se&GaY^n-}!|fiztHL9=Tr?vBp`%Exd>nGSg;0Cn504@%PgX${(_QV|C}= zs%O64z7}U*`|$UJlfKg0^(JPxG;vzAB0xsiKznrZo{gOrOdUI0$f#jEbc;MlV$!wk)LG3Yq)dWi(K<~t|vUXRsht(L05P{d(hUeIcSxqz)MkAl7m*tTw+&zCqVE2857;J zD}EGsd{@l7240TF2iv;i{nmrG0VTD6*d6aJ58e*oCH~SKZ!t)B)_V)^x^{NQyGNC$ z)-COw&k65A{0t34$rr9w-7Qx}*nv1sBCe4uoNWg%8y$#vp^umNs>2>h72==1!$#Dr zB;pgH0C%{xOVqV5Y#I+pJHU37$ebi?L?iAf@mN{nEhy28_?QFn5Q%sp5SbgUU7|ky zZ>nm&St4%kp~P$L5;ZV4Z}s2MJ<TbtaX8sZS*>a|>Ef=vBEVe?#E@iPxMeH&byG+C`XR#YZYz>RuB4W3)*qtJF z7mM8^V)wGxy&`rWi#;x4Pq5eq5qplsc8J(c7TY6YU$fW&9>Zo08#$AVPzZf#{I7@| z%wh+N*pZ}-`VMS<97nk;^`~%#W?p5MvXjsP;c&q{ceBW;k$dj;qet$T%iJ)yV=i;; zWsbRr4J3p!n1|#bdgP9kgXxhwVGf~3?x!)79=S)xLG;KyGMIBP_sH-%a&Z3-=E%W( zI<`zVG@{%HV*>W$D)eG(j~9#zr{v5Cg+t{BtUmsfM0(h7we2_}?3;0eG4#8Npp|mE zF@zuAX3a9svdmahctQ5sP`K3$TkZa{lMiF-9N4g}{fjK~XP70%dN#%TIdy5`n?X`t zwER-9M3-9PESBw%tmP8YWnB{Pr}fMCKmXG9Wi!vCVsX;DB5b9@>E=AGvz=0&>#{Bj zgK&q^j`zBaW&4EEZb2OKe^gO6*Gp4L))w|DRE*sa|@Y9AsyZy)td`}fibk~xCy zh|U~CIX6Ma4U_BEn13)Qc?f42cR(Hf{Hw$=obLwGKYQWo;7LoP`PTV{VLr*+2CORt z7q0(b%Z2MLBLy;DaN$k=Ke!OiU#tcPbGW(i8p#604`MsUxX?dDLb|Nm1sCqxzMOO6 z(_PjbZZ6!=W!?3ITzHEtjw*W4!G-?564GVe-3u2k7hL#4mv!%tabX&9p%1ROE-u{I zW!?W{TfBqtZHlMuL1^}>ZK1Q)_Z z<+ne^g$MV@g)ia7{vYE)S56lfu8>@4d1RrMmk)QsLuql==HStHfIXg#N9&4$K}lgV z2#|3d*72S!2JiiMTMT-!y7qL7gL;=)+6#_%82)>-48SVD6kcwD#OaQ?h?c|$d$Zo7 zBlTH8p#60(SoS8voZ~nU9gP(aT2z#+W`8^xCp9}dlAhR=B`@~A0Y5RXb_2v|O0X$AY54yj7xX@i+cId?7_>;XzMm&|d zi!71Ww!oHbg91Z)%@19Woih9umdL?>4xgLzvrzb)j3#bUd=E~CgaJ*!+}36N4i`OU z<{NK409&0jab@miWnSfHWnP67mo8Q2+bDBLt}L@3FEgvlVi;6r-!AK2l-VcWc-~p2 zK1-R+c4hLzhIE

wIIxN>?#2`OQn#xZh-4*JzPka9Lq23 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 Mm{WCY|LM~I1B;_J^Z)<= literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/basic_rf.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/basic_rf.r51 new file mode 100644 index 0000000000000000000000000000000000000000..fa114460c8316d692d34e5726e81503ed9247921 GIT binary patch literal 48119 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/dma_itg.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/dma_itg.r51 new file mode 100644 index 0000000000000000000000000000000000000000..a0a38fb36e766303ab6f57444d4f6723cd89d44c GIT binary patch literal 46022 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/get_swsensor.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/get_swsensor.r51 new file mode 100644 index 0000000000000000000000000000000000000000..2661be18b5a928a7c9233e94b158ae307afc3c30 GIT binary patch literal 3277 zcmbVO&2JmW6`z^?A}NWYL@Aaf17;Hgv1Oa#Qqo#hTL>h@RH9fdODeQuFdk6kl3I)0 zRhCp@6)mD(TA-(%da{9_@Vzd2YJmU=l89*276I(k=*6f02RWsH!M>T{Qnu9sL5AFU z@BQA#y!m>&IHW}6(BWv)>e9~p9n0ys-bW!Mp%Rj|V@O_(>xsW0gy!HGr?hm~>00f) zz2jBALxAKA@JxRho+(Oe)mF=PnzZIR?^#aQb{*z-w_fd5sb>M=Rh=%gpM_@>?A^LW z+t9T@R(Gn-o>gb+C=;35vw&0fTUFa(_*rKV_~& zH<%^{PlQtIZr5_^R-Jab)!H6lfx6wP?zF_97XX-{wB^>SEOXj$JvI@rb-EqU$!u5_ zjU_)psdLcYu{`QF_=wB`>wX%Lq}QeISzbr10oIG?pAU$X$*fcgp4;@Q?bw@k%j(1~ z-d#2>RW?$^m{{CSB@1EekY((K>+S7WPHi`4#1oa}#FAdIom%BO#CWR%p(|U~`>m=| zudG>}y{@}oNf`8&-Ar57pC0`2Zk(JCb9&~J$7r)-j^kcCso;wfb56k?o0uK9?_nx^Q> z6FIP*?lQCbM1?k;tIuOTVHxsAxm{RRoU@}CL~`#=c^KvPFHgST zDEPgRbZToeyGAqST6XhDzMyWDwo{qS%_HSCwJ>1S*VLN>R=W_`Fw5CuKK1tIQQ+0U znlF495}{}@3%b(dFNp$65Kz$TGMbmrRS6Fr@z5)Y&NtTGV)p> zpMY*XL5lF#Nij)^3#7P6ic6$ukm5B`PLQ%r%1KgQAmv3;ULs|Kl&_IeK`xXE>#WNw z(CJ1*zR3XS@(OeeScQ5p6Xa!qW^Zl>nM~I=ezYFoT;9Av<}Y3%S1(_Y;%_8$^!Nt^ zVTFAuB=HAvc$cIEfdL-Ggw z57_sx0^Laykbg8eA3g|%e)j#JJQXQ@2{8%F9_p4+ zGQKvRLH`VXzcYSe{M%SCzA?x^0 zXIEl*+p$(+3wkURE4c?=4TOB|$AuU)emXn-{t;x|@83uJ4lsdRw{G(VyLX$f)V;GqV!xS>9e4eM^zfb>19#56qe0v_O J{^vLS{{k7d1F!%9 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/hal_board.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/hal_board.r51 new file mode 100644 index 0000000000000000000000000000000000000000..04bc1bb378f907f3f269bd4c07443777d9ebb86a GIT binary patch literal 4588 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 X`?b9HF50K~_Efsf^5^rVrq=%-!YM|| literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/hal_clock.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/hal_clock.r51 new file mode 100644 index 0000000000000000000000000000000000000000..dc543a79cde27fc59417e29dbfd17003c9539d2b GIT binary patch literal 4781 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 I^os}o1`t*+r2qf` literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/hal_digio.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/hal_digio.r51 new file mode 100644 index 0000000000000000000000000000000000000000..da3bcdc763fa8062c13f0b8fe82e0e7260fbacb9 GIT binary patch literal 33365 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/hal_int.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/hal_int.r51 new file mode 100644 index 0000000000000000000000000000000000000000..99ba405474aecfb5aa3742384ceda5c27e79366c GIT binary patch literal 4911 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/hal_mcu.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/hal_mcu.r51 new file mode 100644 index 0000000000000000000000000000000000000000..0959543123811788bd4839bc64c417bd2564b1b4 GIT binary patch literal 9420 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/B�/Project/Debug/Obj/hal_rf.r51 b/Zigbee无线通信/B�/Project/Debug/Obj/hal_rf.r51 new file mode 100644 index 0000000000000000000000000000000000000000..d22652dc0d0cc364077ff88f3772c6256deb3121 GIT binary patch literal 22343 zcmdTsX>?oFnfE>EX|pXavb@Df6vtV-#F4x_+iXUb?L>+rJF?>hNUS=xoCs{$mE_f#lBOp{f+570!ykx|K1EEL z7zrN?Ak_+gIY6C`hW(M?Q4|#&GE!{tSK#*tW}|`7SYXT_iH?lk1~|i5Ffwvrf@fL{ zh%&!_Vrp~*OYR?^3S&ipHx!KkO^ey0HY|Lh-yfQpJP-)`r^YEqJ(HRw0$PB!zHH;?Yp46x)MO7QqVdf2oG+gys zfoTPUAQ+e^3Pz16m>|y4i9)UpHYN#s3UA}aw=5%7ZWD5`tJ-(f;L0@m0SX(=% zbnik^YHn>kK+zBG?eE*u?Mo%J+eu_#=fI$IFfE&Qs*e-f>e~%MLl56`=TCp0Nu_ij#c6YzKD}}wW8QHbo z-MzicxcTr@aLiU)WB2L@cDr2N0|QL3L&2Qx-tI0KB;K5zZm-|9-Rbpq_ref$c=Hp0 zf1uy#a(lNip~aiy8yIl=`+9l?x(Auq+5|P&J=o`Wx^^(FeYVk_fL%Tp!p(MXS)#)y zjOoWrn*3dzJCWYm;w{dg+Z9^ZVp_98>uK?pZFlzip?fXX3$-fFAabQp$4mm(C^ULa z&~BistIykw1+zDL^AO|P+rMK_K{nf8VtL@bz^5?D?>`WX0xYO-WIX&5Gm8Sz!B3)N zdWq$0I709D2NM{riaC(LNGfJJfzgRN%m$>$Prt-0dX52Cn(*9HlP|FX1IHRbdx9~~ zs3B1(;rIxYsL;e=BfBFJT!AK@DeM^

i;aIV5URq|jU6bJ`LLDI}K zq2->Q}IZWEz|eqQTG+|M*M@G_ESrU{RRG@1FwKJTY=4 zm1?o5GNAzIPskK6l1ZUjtz0G#+K48vgj7WdmnurbiZfi7Bnz*ailsU zBU%e+>JrI`8qpGD|%Y-dJ{}2V zt4uM<@U|rxcPN;RwIriFzQD-X&cNhU_(+!Wl%YUMg;BtFi596?l)-2qcsKy%&yqpq zq71k|C=34@^fc1o}rpSzEdq z*(;E}P+=c9G!>3I$Hua?^~S|T8l3H)x;<;>*ql+MLD(QfCbKqnEwWc(k;tvhB+Pf74B}Y>SR<*qtb}n5BYjj=T?A1dRqVWsB)=Dha$?A`FaLaf5}TX;BfVM z6(&UzJf*u^L2^E4mn(_lj%v4WuYC!eBZ=dp-QE;YUXFpmBokNW$C}GZo;g@Av0I%d zc)|Qm;!>En_8HhF z2|`3s&npu`<_sL_NXm2PIE_OKbtvMzcBAQTfb&K&$1bn*bgBnPpi&2{30p-_eU}l} zE}IdRQsFLGe<~&56_^Nw4n_|tIIbh8fTY8&=ujaMH4qv3X&a^u}-WRd%U9eQ*| zwH9fpRb&WSvj|G&RhdRZh-kbsPOCniS7A1-3br&+gpz6-(`X1KX}1ETQ7ely?LX@v zSUqF40u2H!;F#wSbP~Z6vZuISMq*F;H`)&U!RSK9N7;Iqo%4>KS}swp1T2mG6jE+02u-QrvQIX3jP71 zRwsj6fmiH)A^!ov^Po_B5o?=3-X|#b!=}S>EB4!VKdQojnC%Y|ZJ$Zom!tiW&jrv!ey8_GB0^tQAPqu~E07kUzf~X!q4Nr) zL+IBEq(|tD1hiw$yk1W`6~BAOTtP~@C?#E-k}gR}mnrF+cg&Tq%Smj1Tzy^LJLXnp zz^gOhwHffb40wG8ydeYLlmXXdz;zk$mJE1n2JFayn=;^*47fD|ZqIj*IqHVi&%oU~rmQ=u+3Y4Y*U#;MU^!vI&`M{2^R%XC!GGJQaf)2D<~AcTa=sCPC_K==9lnwkD7SY%%c__$vkQmbVDfE zmWbO0J;4sUl5i-AMkUdtB$|~(iy#hl3Y~&e1BKCc_4nH0v)wNG;GaYEHHy9_(bp{c zT11~L`dY;yyExY#-@SLxh_HXVd)sycrF#4Jh_#z*#4UC8nue`*2RnP6$OH**4jP3M4REfP zyGc_i)Urx(3tOvMtJN3jE&5V@nZ8_KpYsrNHB0bG298qZ4vINSOz=?5QT!~7PkM}_ zXrcs8iaAQrPccW)(IaqC%u)J;dWtzpSpreaQ8;O0pqNl%J;$&dj2GA%T17Dt%Jw2+ z=)*a$K^Q_FeiqnP=gX3frtOLh!+3kRIG?3@kA0RgWKfpcwk&Nk$Luo^!LtU5adl=SJj!umL{{Y*lv7YUF^h2|o+0B0J}1 z+DatUHIpysnMH$+yoN`iBWfV8l z#wlM&$|xS9om2jtq$p138cumCNzr0iA-DqYiA&!Fitqy8P!WmBDN;KCgK3($?ldbD6)(Vy zt!1!9R1{`ZDNO;5V2~~13QmIpu!#r?pokww0S#S2DgiN=aXyzXow~1PD20$%J2j}EFj|cosC2EHDW)eDULHAnyzsHh+qj;Z@#U^`POKA4h{(Bp(MF zYI(1VL8pPX&jUk(?j;SGXu1w8IfQ!NbWcJHtXY65T`Sz3MUZzIb?lQL1_cegyFLdw zL*;Wp0jwl0m2(Z{%b1;a*LQf!8KBNT&mx%Sw(_;b2?cQE0I9h2n!cQE#Gah5ElZGg ze1?;Lt+%prB8eplQvYW;>6dylE8!$(g4FmZCoRA^Th#(9hPs@BB7u#wj9pk&(Fjs} zJnO>al(_VYRLWMRQ@W24WkKP_jUh!rGg7)!&nepG2i2^z-IumvHNM(qeXF*Xic(`eLMK*Lxw zT$)CsM!t{}!&uypo{T*aBlmk2ZoIdacAB-PwVh_^F=^ba{Y9r)bM72mxxgGM%@$77 zKn>t16K7P4&pAX85!qXM!D=yRw1Vb$dTXt&aMuTs%8~f^#=xr@&8-{q%*D4Ga<6~N zXgXZ@>ILB^kR{X;dxb=<6iodx9y&ru%yuj>+lh(UPE2JM63psMmN_-bKa}r=zmq7$ zUV*=oxCA9E5#&>?BlpX%%U$v(L@FwsM>YiyVQHY@R}3vR;T)n3DBy{$JG3S47rZ?Tzd15-2M zQ2=`JYTRbCb#%~$*`ixve(?;4=W|fiix=bo>|TSl)@VB3|G@=e zQDYb2$_LKap?wc{pt1kF$OLySj|m+1w#%{st-jC(7E96w9>oT$M8J#UX{cHW+2CPr z1D&vIDJvAkC1BN(72IHj7v(`Ye+6yPXum95&_eR8R>LIgIjFg06*XUj)-R=+pGnkQ zTy^gSS_{%3FOEyV0_}c8cB{R8xthAkaaq+{2LqI0QAZ^R)`@@@rDw70lj**LrYqX@{@x2l z(;d3dzUsI{0_o-(K=Wa4N%OsESjEA;$7-H6nr0fmne3%7Oy9$WjEKX0b6f(g zWhuiPm#Kp=%&}leOTTJZ&DLRi+(O+MXa3z0rbi|n@6DJj;zUfAB(dv~*!4;5h9q{A zIv!p#dI>xN`Yw)?Q_$2)txA^3*)-ZOXBvV+ zpM%=`0pfQdeiKSAK>XiscZ{}SXOC%Ey`$UA){B})wwS654X=xZw^yAOG}Ts29;ajp zCQnduH6{;Jat$VrQgSUOXDMmJ%$Cu`>@X z&tj<2kv2mrOWMUxOqW<5VsFx5_qWF-s&2Zc*>f5^4K_%!W4@#G|Kwb_7Y0ctQ!U$y zs|-VLt&ck&DJm*g8EJ|T;+kjAyp^0|q|rX`m%{3UwIL-Qrv z#4s&;pBSbBKQTaj4`r&@#8dil|>25lcsgBtfyJ=)fxM@rpxtmTGeb9*O zlT1gvFD^Y~TscSFoVo=0t8~PdDB)j~BTg&lU#}z1Eav|YN8H@_mpfv`_0ruMZZ@k| zC3j1=D0}q=5%8kvaqx)(I78a5e*qk$M$n0qp0~bYI@ zD%uiN#3j# zjDna)4e~V2RL9FM@RK%LhL_>}YT~ddzmyiUVCiAl@Z%BFGvL%|@0ldw3Z0Yc_=?-C zO2M+6Q`*?|v@=xBsh4X<2tOiDIcopNgKE0CBV%nPV{H|4pHq$X>=MRmh)cl0Pv(*q zQH=GRaV?(#lO)Ah&l&6aytl|$&l%g<4J%@-w#z$gYJ#?9Xsp7zbDKo?ig_`kkjKyP zUjSp3J$U_lCZ-csMMlqE`+?DPWUG<)Gdk3)jZ468rqhmUn%_~MKSGy^iPui_PQ{!c z#-$&_j9;LR-%rG)pBN>UOB=H{+%SwEmY;+@T0b1y@l6_@MJ#iVYr3p!f%HYKJ4TNN z(4@w-a4#naa6-P+z1(_H(5w~BzcMQ4py$Eb<@Z%RZ#iN*R`om_JQaLD-j5iq3ER12tx7*Mu0DsBSuN(jp<3oQ z*bgsMJ#Vc_SSJ7Z6w6e`C1O=AFdCQM1PkO*pZY`6GGlPZm}0SI?^R7pZ=ACDe!f+5 z$J)s&QSphC03J76okaEesGX?p8p$thViPcFWM0(Ly? zdkQv{|04euX3PQk%kqaSH7zzZU(OltFrEW3*f(CQnkIh<)2s&5P zhIw-d!o9 zuD!pq-(smg`EApYn;MO#S=|XU9z>>G)YD?lhOe2xqUnpd0K7-RH&M)@F6JIJ)v~(u zP2o74-64~fGhs5ZDa2%%Dtg+KdUkg(EAYzQ^WL7;>@R) z=TNDsHTA|{*%fxdj~?sS(~l9CSir#n*xT|`aK7}mI{FU9r7uEltZ;bqBn-YsuqG?C z7;S33oEHGYT4*C2b@Z|dJC|ikvU91I;BdWX*&;uasfhQ%_<)Y7TS9oM@S|Ps0-Oh9-E9^Qfkq zt{cq!x`E#@6ydc1zhfv)-W$**1iv?+O9;9*s4hi@Fx@7UVKPF=a!f`kS%JwJO0L2r zztO0~B)_GgYYcu%k$H_lmmB9gM0P`ySPU=03V1X912ogo8uS4sec6mjd!XZc|7nnN zW}cSuU65tG^N;N}nj+{K!m4L@9j+2e?U|jl6nuGd~JE-5lKJ!VKL;7W# zI{a^qOaEw+^wM&BujaHR?Z@<9ufq_;6~dpvS-Ii*(5zPDwz%{?lTkD-do>(O9nF1& z6IQD6E*t~g2gdiB(f>No*w6LCMS6_;%QI+omGCI_JUpS&zlwZtqkOh*z=4AX-*m{aH{4YD{)p7e|( ziziW^+a-1ta9gsO{tt+nC31=xv5{l+YB82WX?mX@%cC?s@szi~a$-#GlqY2tqlcZc zU4<>kCpW7wJ>a~MGi*luEf-8O1E4?w1OVtUC{n~2xe7qh8&E`PV)PRr=zO$D`{+6< zj;&Mq4|WbSOU#WmuYOhMk@pd1S({Bi`c**fj3Y0fsbj6j^ z5&L}1epQsy$?$xv@v11NlhpZG^Hot!Cy(1&)O{0tF!n=?L>M zkJ@qK_z}CVo$EBFO^cf^b)3e;&6no(mEJVr)=5*}YddQ4^*Y=%PUEC?_`Z9|bz&#n z|9@s5Ge@(_k%M{*?7a53v;Y0i|1~peLN5;|j+E`|9n6gOXU4L9Paf$H7ip!|EMU+Jov9Hlj%M(mdhS!AJ{$GJ9-4N!cCCI^5yW~%uJ@QcW`iE zXm6%(c<4}eC^s-XgzXOR>CN?KMzfGJ+B=lP`g7sGVyHj7C!09{e+J=Wry};_hiO$y?y&3FSci3tatYyz3C#zn4QTC4)^sU@=X8mC_V_(9mk`C_Jjuz;451>rmIXt?5cXp_6U(#4vvtvz7Lu$vsP~VP? zSD=r+!GYa7)H#sK4vj_f^yy+eC;G-t>5=Y~gi)EJq&2KH{qX20_6i{IMO)KuG0 zSChdeeZvP13=i#CGxe6^xq-p49dRW#mKy~US-DTERm+OB;cmz|GIpT14|3|~l$Ptm zcPfd2VS3M%`_$N6%=@ppl0Y)ulkFc{xi56{4YOv3a|22o^A7Zl+gTM#j8e0mvqq`N zqwke{X8VtYCYM=#S1A!hymDWd-fO<9MATSFjcJ;u#>1ML&^5Ivs;R{>O)XK>3Ka@E z!W~=M+m-l|L&F1mlFOFXbVR$iG&Qw!cPna5N96X#*7lZWppuT_j?RvzmP~s~#|L{h zB9V3g-L`i0q+2_>TbmSxzl5>@_;dz_#s>O2$~U)c?o4mbH1?-90i#tgg7P!{?(+svHQhAFM8qHRjx9TDbiwwgPOwyNavk-yf$ zb6i6U&F7%^DVt3n4qgL1TrE_aF^A^BGmsoQQZwh$TwtIy7pI6XMAqDGsUr}bNAz;lk)1GlKI}F)`B%Fx|vvtVMo1b1$W~-4ZGF#Az!fEkOFuG+b z{E6WFlF40ye@@F} zG4#K=Z~V^Qf!vlctAy5GKbi#^gE|Rk4D38zkQWi;g#~$0L7pbaQw4c3%%e}bzOlW% zvnjK!yQi^flReW))ZvgM!VSTbQ$$bAy#{!q_sYpd4=)T@MA_8`DrI@CLO ztCdfOnDEfvT()sMx33xI27t6kKnja7Zx#YB0U~b9jx}fdMvsi-T&mxcU%h3>tNK!` zZhyVdd;4(jo(&*9qF^b4vpl~+=SX&xh?*`9R&Wi{{jEcN9m7L?z#^>S$omdgVT0@N zfoJkup&Lc}tV^pDwwjBrP*O_wlggk6v+ji~GdlQ4%p}o0%R)4hnKK|04L}=*&tCSAopnXl>e6k-@l57%Gr{r*dKQoO{ z1Sm^c9nk&;txEzpWj%~DkJQy#HE7;Q)A0C^{TTH9j^Nj8RinU$?dghijEbc*N_gdr z5?(Q*Gz_1U)fauSr2Ez(E7N>8c+bvp8wq8IBS`IAvwgW?yAS%DAF^80%l+0R9T!wW ztsL6X(C*RBe!>Rq*^)9kq7#qivXni7%r7C{%Pwk z+uOD;rIU1aX1^NhkL+vPv%D$`Ik7O-X&a;sRN7#F*I}DeNv<=NHR<+@SZ3mWDp`F9*cx+}w4ef_+MweHiQNYYTl){fb-Zl=6 z)I)8#C!K=dRiQ*_JEbnK`dz%aS^s_&dxCzTr~9Dn zex~dJY!VuVu09MU4=^Pk#S*jCN1*JZOxc6#vIx?H`3#S!sVH3B(e^OpKZ5nlf``B_HN5(wbrr&^7tO0pr{W8vL=Mc{wdquXNf$BcVkTX} zq{|l+nF3`KsNtJVRpwpK%)6eIcRf4rdT!qJwRzXq=UpfBuEUEWtwbQ(bV^?s=`xd% zg%K*IZ8{ZQ6l?9=+LCT>+`j2l?1osgeNk#XR_mryWeZ|-NLrgWeY%3)Ba?1{M%|k} zJtObBD)0K5yz4o6*YonOugklhpLe~0yMFa$O;=PUrYkpvm1QAi1=wb+CsOUlsa2Gd zmo9zxtD%)ODHw)3S2k@|^$jaGq-*F;ivHBnpE~+ePk$Qdk3oM{tC6kPaE{%P0YPs%6{gG{~=|FrAy2Q${E zTY6^4*KdHIOv|>OI9_KqwtjG9jHKE-@6?tpS*opAUL9JwswSnp`TlRswY>1 zA*J}H(6#C^`;l#D`;OCS!`Bro`crP64!M!gwH08-PC(`k&IC=UsuG zsUZb;-2u|`zegg<%(Ke1a4QeY<&!Z}oH&=@Kb`jWNW4V3_N;Q;1wEb#7ahFfoxq(DA`&XluCCH^2WD)faRq2WIwq?{!V4z@T!OVKEbt!Ls7 z)0%V&S*4hNmN+`tV$vy;l+of@_`|d&okA8$6wvw_{9%eor;t^F`Dc~c_`?*FP9cjt z(OKexVT(zpP&@;h(Pt$c!4-K5nnfBz7P@H6TBHG75wx@xX#iOSA7E zp)<(ri!^{M^vsx9qyb!^=gQ0?4d4nsIxCAbfGhZNtSr(1u7LclEYbk3<~v!W0bC}X zEYbijfr6}tqyb#r;AAB+3I7)2AM!w9(g3b*#H<&Tic6O;p}{v!UW4;4!d8DvXw7o> znijrgv}T!mO>0!DY0VP%n%2myq%})jYiic}sG&8B-D_I!x0co{a<6GoRXwd4cduzt zmO*PKTx-s@*y!qepz4JF_aKGSDTdf}u=yHV@^?;&#mLvvlCRn&Ve2cs8Lb8r`mbZ9 zN*Q^>vrDln_;(Bbp)cL~C_iu%vL^IX@lvInmRMi&I$ClGy19myB(XXCTYNA4nb4mr zDpjs~L5YE9>TX3t<3Ey0$ZfX6LXAv~s-loe@Kw@|Ez-T|1nKxpQHe6=1tkg{Z_n>| z)?@~V9n(1$m;vq3`eK&S4xgbNMxev=d+X5poR?G9|CvOIGVcXY93slUI-d%CbODQY z5CWs62(2%F1x5H3+Mx~|{wyD%U>2S{mOymaahYbZr&Xt5nBgrwoq(DC1#qcHpo0CD z=y<`nIndy}(;h4~n7WVl@OnI|%zXj8V-e-a{2o-=1OHwD0`19S&UGKAJv|wZD6?Jw zSP`Yo88(UqWWUKzWe!)FW-;)FkIO!E3(eNYW4_o?+QrOHAr^u&t9qKepgt>T^=o>D`L zsxWziBxhmrBuQR}$wMT0JtmKm{=C+zAxKSmGOkvFqdcsJ9*jvoGe|w z?(KLYI`e4PJJDx;7Jd2;A4~sUSLmo-`G2YsNA*L=r{jsyP*^`4$z{Iyx@zQ%pBt4s z3CBPEUlPd<5^0ef9?yYsG6^vxd$S1=K5=t$>VXJm2m{!y*`Sw|ebveKfuZcp$<+C$OsWC#+myY2$q3BXOb>FM7O1a96fBf@;% zc-uH*oHu@fUw`;z_)|BbledUp%iNgtx!m?3ylJG!j`*cDjVK|!VHv$4Ca&imo4dX?l z2Oh532pboT7hCNbEfe~uphlU|1U1xFAI0^EZaiY#XFO`$4}BobE zG*!J2f>SuGijmtzcqfkQrG2NL3If{3>V>9LD0ySD<}f%!z$ksn8s5du@B$$`DibjH zk_jO+R-2^2jqOFCUuJY;I7g~O_@@`FVwd)jYaDlV&vV01m@nWNna^VpHoSl()*HC> z*5sO{qW93?yayn2+3%qVUxf7@QhD#;e&c1}AQy}W;f;JOC>&+=wBac3NL@Gz5z%CE z6cJjBqx2jWQL#Yr&m@ilZy=}~g~bi;VM-k3jPY6EEq?~Q#gbai z7|%n_=OO1I_8@CyMY@9SSL)%F-KHsJ9 zwY3aWYH!=zgu1M{Ji+s#fs1f}8r#aM6FH%s)dk6>zc4tjc}1e2Bj95ajKiSEe3(yG_hZ-O=p zh9T4hEGLp;I+1LPndwB*Oed0u_eS6$!5e_5;QhV9`~C!=61qPD7fc6nx|UP@9(JHcg9UYUb-Ip&`X9z6<535$ z9xS*G)#(NfZVseX%hvj&R1&bMw-96NuaPB1(NNhip%anGF^z^H_k(B}g(*(`SKG|` zVtk=;Bi1Ut#)?_kI0Bd0ew9*>C3A>f6eBNMM`-h3GtJj2>zqnx&uud+vG=%Lx!tLR zqVy(ON!iHs)Twl0CEiAhg7!>W36ta0MvKqjfcO&HXq~3`9PMD<&1<@mG>t;87PasC zC2) zW-K1xGz_g}*JKT_l{<+$*mvcWM`?fd{2CotgCkH*jeEh#a2)SVK6(@8UJFu3!b`njf)Ns z3j6P2OQlk-JiflVkrO`Nkc^bIl3BBn<$I{-kTPQ`!E2dHiI7@uOMXmc&p;xi?lTY( zPbADhEJ~Yu@G}ss5*2-m49$XU@3;S2ObHgv@}m7!n&o!ea1B)vkLhm{%|77pSVcT{nKla*6Q6thO&rPT}y{Uv#kL6fx!kvkyX*lOoj&=x0_*It9r=ZEdf%1NDLxweQY0H+gvf&@+_0ag%?b+=ZWyAM z;awJvuN`T~$N{E=!&1F1-+6=_Q9()UtcLS!80(yuk{u@PH~bh%xI6L8kG2eW4JpwZ4#FIniU3!8&9HFUSMI z!pnzP^uTKAU%+-f<*-`%X?B%#V8+>^V17k!4sd^x#T%G$rg&3%tGZDpBWumE&BrpruWAbf%-Uv{F$PxQzd73-^0c?qPwmmz zmm*tc6(J9v%*vv)`FBAwD%V1#{o1U_(6Yqv+v9%Cc#5L}xmdfmY}mk_;=)^v zIExW{U~;kMk1M~IFEgrAqC|pfkY%LdEuvSYwL;vREHz9` zTDvM!6l_^!2RWZ;1=5=2#j`>YD42_9#ZbkIXRm4(SAbrxY8S&JJ8F!~T?2bJWV2s+ z_Qh}QXlkl$xB?@4RlCStxuMOMgRg2ASAt;kM|HAxVf$@ByYSy5CYom5Jz`6YY2j&d zc_?pB(^}&lLvFYe3)_|}r$@Mx5PAX5oFlM)@j1uDBICHEI(AD|OVWgu#Z*J$_fYY(AU<_r703iV4iq*sQ6hQn$} zI@Y)b%0a^+%^y`>g?dM}gNDQEjOt|^G|Px4WiM6>sN=)!*$Q%e+yV-fyt$j5_uk9g z&4{6J*q86_|2lTZaf_;KF_b?;>!{;E0~>mj=MTR6cqpWNI8xhEsw~t(Ppl|kR1rI`RUEwGDK)gH3X>;Dauy~} zlH_%m93jc;F?p0E=VNk|B$JpNBgqAr%#q{`m>eg`g_t}=}Yu~gYf^EQ#6StGRQ4w^YY zuiEI<4tk~0<}=L}cZ%xJGV4Yiq{@s|+D)1^*i5fXEM^0~Paee<(xCjcH&hK@iKe|C zS5q5fp|BeIUc72qNR1S0GcRr{i9Bb-ir1Z)abt8-PuAfhM5&5i=%J-4)%87%XV%g zk-4vAsnvGpM@piRW7>j?e;H4-W6jsqZz`H{z1P9+@L3gpa(pEmk51224!sm3!MP#4 z!91@Uz&B9%4Q7gO0QYo1nts+)ZZJ!HgZKRj-uD|!{~?;|^^&gy6#>P%Q_+>U!TbIM za2UD!6I_Y!V7}K4e$yd>C7BmM0D&lJV!j2b&G4UsS#x8+(-oAZIv!LN6?%8giS&O8ko{tQwZM@S`Q6;o-IQco(8u0l|$l~&?9ayp z^&joKo{yI)W!SWZJS0ME8c}rquIguLA=4BA?6Y&V&oUiWDwV+3C343G*0X2p#h2%f z=fR7^_^4&@Mh?2g8*LvoZw+F6)G~OZ7^>x?=9x|9&IAyaa{5z#Pm~-;n-nnABHf?P z_U=i0yQmqzFHnQ;2PrqOCK8Jp9KSD54&1TNKoCJeYx#Y7ioj!^C;#s}>~M{gQtbcA zS(mZK9l6Ol$?3zm&2_CvAiTi(dw@=SUy#$lZiQjdiRJI%sbrB+WLz}vV-W+b1Pd`w zDfO^<%SGdUkX$Kk6iJ{B(fHB@;S6o0f=L^q#q4ghQ5*=`@IvfO8wm-tAwoNeHfn-N z8?5GjIlfU62-@&M>`fc-)1UBN`VgVbr;W8@(vU2A7~%sT+RgAdeo~Pxdbpr1RP?Z> zmZ<+E;)0wPJ5~piL`3nlft5}TG1|gN#3GQG1OgG`<_Sb-?91Pb#`iS`2J4@;rWb1H z3*^ag9(aY(bCMU)3gHHB%M%Wzt$`P`<;lH77gWp>qFYuYEEc=!1e-m*WoP z!eU)~-@QouRQAbm@K~;aE|O1%6C;Q4Bj*4Lb~*krdbSr*PhqdZ_Z=U^4}@Vy`KLXw z&n4}|6%MZbB?tS&6*1-l)+j%ip?iwdhDhTUvB@JidPTcj>fpm&4&@Y+YC=V3v9F z8+iFX`FlVH33t-8Lq|Gqs0*7+gZ^mjOOY(c3tvj$V-C3` z$J>mB*%F#1cXqLUa1paq%#1S3H@=^UmPh4GfaKO6g6t}>SbcG}{I zXKKtP2U4Q6I6N`#LLyDxC8r-TMt+DF^F54^gP+eCDTn0tA9bSJfR6_rExQ-D3<=z0 zbcNXmMFy(i&IZ$ni^vg=fZA#-6A7 zXq#BHyp6-!^$C_@Kq#W`t7kc+wv1!$`qZ558$B|TbKfk7ia8jTtDJty?>GiA^a8A? zj15eN$!@i45JMnMb}n#TO?Kzm4Tq($3eoslnl-=SFt45ZZVeRP9TMQ(43g{HkN>@PL@d}xqYz5REZr~J9cc_6>Kt*sZk)99bWRwpn3Mh*-=n5!{ z)nd8Us0K>`WswG70nI}ja0N6Et)~JiEp~?!cx+KE*s(ie%mrwj%sd8Kk?%Wtt!8&5 zv-pA~)CB8jbq}aQ2|>16BpTV^sYNVG`&%nWEs`ycv&i!)H+bUs6wyi-$KCM?Kejg< ztF;ubg$S-C-na^lQp`{+(tM$jw^+X`d*Q2)<65KYDl|&5tmloYhhXz7L-Nj)!cm27 z6Q=#nl;Q^~d}m4$#w5YM#?p>G1qNK)6k;ww+{_te#x7$7;!qgDQ^o-ot3^@RblNuZ z&*(j6M9HpUyCCekob@9BaNl=Zso)cB(|Iu@6Si#Do7rF}utm=VHl^R6b8{mlN zuVD9m3Gf=v73=|AlT;{R)(6aoX868v#{)9VLDPCo(i9(!eJPSHtwQ91v$S$3ZN^xT zrIjIi5DI)>;lm-fc%tPaV53k_xP^aYwWHKENd+TjshAmM8EcX}Fe7W36d6OuI&ZKG zlfryolQh+5V_(Zv=2F0#ByNDG##|UXkPHVThdiIT1j_;G0ad7gKF{fLzPomXa3OBc zTiMdUi@H%TJPx@)sj{#aL{e;H!W5xh@lr? z$d}EwMLWM(GGV~jwmVcI+m6^e$gSyN;fk8WYxrQfQ_?xE zJ76Kll`Uq9;0903WKr5*Tw!7+xI>S_e@C6=kTObRM$OuBD|eQn#Yr+Jv1tgo_E^?)69Wxq8cCZNaARy^E`V!G-o#+7D4d9FvmeM! z3|!y_cM}64U~5+7gAXOoFG8g5^9wnW&;J8)IF$Bx#?LRE9WA1m4@P5x?a+J=L*O1lHJW8SQlRDg z?&jf;TQqBXqcl$k^IhJgOjJTF1Q!!c31jkPDMCeUG#f zKNU)u)?;xyw6c=sTW~aL<*o%p+C1&|_EQ{g`|Di4H#?La?agHy$8-Cddvm>Bn`cRs zJH_Y=kUQUm_;%i6;QI+aYuS@@E$(8?GYe}Dr+9-wIg1yZ-o9`1YGP~fP9K*d5>$^-NCx<6; zW#ZDz1sq(Pf`V->5MwTYZSySK|F2aPZEv$|hv4yhgn#mn(O6p`VD<}T#u%m<{{<;` z$S}=J`UdGp=M8mGWyGmH8v9aYTSr95gEyJ7C~a0)&}7OGJ=h$44>Pqi3sfIZbB zz?N#yd#ZW4)qgvzJ5u31C|iOP!4013$fC44T0yGg1I}7B8Rv|xWs&o0OpUo9jdQO% zXhACS{hYC>qLuFSa35Xa$Hpvkf-S!NcLTe_4ca#E9+UvWPt9RoLRQ$lC1phX3*lO^ z>3k>vvnP^_ZQePg`4RsCJ7rferf+S~Q@+3)KhshjCUXRJ6Bsm|Ghe$Gs$$Ln00VWTVMr6{@9UW(CQwz6tgR$ro(RkL!) ztQ>mZZvbDy|Alor6^PAunyRf4ehDT`wRH5fq+MwWhf&3?fLBfE-f9Etz3XKk7SOu;XjfMSBK@I20zom|dI%mM2Tlt4(pyBU2RgNZk6X$3V`jw&c77 zmGh{S<{{@%i7sExqY@pF^9q#cZUKp|S_^+Bp_UaBiSAE8q6?{!aORV_!HS#Ky&X@4 zW*+VMZ0Lj@i!OXTaU%IN2y`J;zjyZ+UPsm7=kf%iTH!QPus{?-foS=J4$oe$qChm4 zh&=f5c0Z^pD!!d+TlD!%Vv({0Yt13GFl@hPgjOnMDy5WKth9<$LbFQKh!Vn{OwkIH zGiV{-|7R0LN)gIw8x-!Rj!+6o?f$hp$jf=*Mt#US>2wx!P(R zChFP@yZp`x{cHk{e0b2&Iwe>gYU@~zZ_TK-)qz)#<+^6QpbEW3KQS0zfdtzF4>;df zzz;2+pYT(IvBHB{$8QV7B)lG$VmxBtJW%}ER#4)93_JBd31{)#X8gNx5=;@&czqqa z>3#c@c>S&re%a6LQpr#2xw-iJ>c4@C|B=W_i}#mP-hYs2-5$JugjC4q{i7t8@cuE9 zBsxB|2M`^f+71??Hcw}dMVO>B&0h`< zs&0YH?WDB)wSUtzd`eCKN5v{-G~M^s&f+Z+&vz+p}Lv zltdOrpZb5$EYhRRxcGc18i}XNp=nf0yk(=)LB^F1r z&Hs?lF#CAoL?k%~liuOTc5U~?2NG4G(9Xk9{h#`w`Zc6_EOLlchlvoYmkqw1h-!;| z{x8v6D%PD@_jbiiC5g75#uK~I8j|RZgqyn}$D^6oV&S%*V%Cf!i5+^l_B)Ti8c&=c z)9PbK;07UGA6fl9kDEk>v_%&muzHCnx@H`UCmKVVesAPNnwVE~CG2HhnK2df$_zzd zUeT2WS8o6xF10`jh6v=L3-aWlde$&v%h3hNLje3&0K6R8lJ9$?C{p#oK0PpHE0a3dbBP0p7;s_iH64W0pU=YsKw zT;Z1^Yl}Q=;g^p)dDMX_!R5w}H4hbBZhSCD&ZwGxM1e;>odKEh7si7i3xCYGA62Cy z)BsmZP{9P%w$ix~FsA+|q&CBU3Q_mwX=c_oQ1?)7J8G+YUr8)fZp2D+Nu{?SwH-A_ zsHMHj)T&VoQj6$)7=pj?Q9-TSloqousDc0P67|)oY<2o7g<8L3)>8H{cf4Eq5Z2m3 z?uaJ-Cb(l1(XXVnF!?Ag#pIWr+_&spZG)YwJ@4c?Pxe=dVx<`G^HEZY>h6varAT<2 zV*WPjEZPKe)eFvTB6co&^N%>W&pUPh!pSvz01w4qqZ*BnT1Y9X={rXhorh%J9D%AC zyF>LLZGyQ!rMaZTQl%6-TxAo&E>P+D4wVOJA>=YI{%-&aX-YjUAe<=~cn$e&8_8|M zeA~Z;p`C@drESq2cDJA{eT6Z;?cYJ$IWRX~3ysL)LeNhA=iaQhisvY`qGKT(v=Da} zc(m;30>2It-a64q7S8BG{9WMDg4_{iZT>(JzFX7lMfB@tq`FWe^pro(yo zt(|_vZ<{}d(w337bZ5FZrbQw%!xRGcnHeV8a*;?5*}|E|K_XirT9zpU>@!GBhV5Uuf92d@lMc0Id2u!R>Gf+^5*M;!f`167JNFNB&BO$^3Su&f>f z??L5G6loL*jFtt77M7O^oVmJ-;Q-zzn0g`_~~09I;n9L!*1DS;;h32L23 zEG3Mp@BRVds9Ld<{Gc+iloHkx@b5oAmXc$!#@$A-?Ud`C(ElN!hjey149si34|Idb zDQ69|!7;K$U;w)4Ftfm*r5~G7%`fhJ!$B%xo7`H@apl(W8TG(%nQ;vaS~{+)`EhN9 zDBy_k9N0}h2Y$KAU317p@r>WHZUcLml08wF3)kC+d-rS@9PZoi8dhe1hPx;9e*)k6 zJlWRc26p1J1d8BVk6qxpT92*Bg}1@#wvj|Hn86GqvIpJ}@xR~>ybD~{f#(i~hvk-j zFLJLn*qA7buqkJ$7p)Fu0zY8;|*oYhn z5-blmKO%>hU@=0w!4X#^NU@X9a`8C46#EWXh&ie`T1oFV3wb;9>KrZ1-I`47iotk+9d0^1e zac$rQatMfHRGq-kfS6*Ra=4rf^^p@sy0>iDfGhDVq`b1rjA>xrzlD^iR%T3PsE(dv z$}76J86iX4Mf{VnUhEQ_S@Fky>x~>*J8aX`8#_nvsDy#xp-cl=F?Kur6IdK=ajt(t ze=QMLW>|sOf9_B>e22c9_Y9E^32Wg@cFfswzTiLw@(u`8%hb=)_gls|gzuCa&l=x0 zJ_{+lQs8O{L~+m(+25*Y+{NE2qP`?s5wXF)V3DFXc}N`wzoZ@RIR7 zGci;f@0uk)g|cc`{QMT^eyC*M0_l%AGoJ*LOYItV-N+=93%~b&y1KF1#|?obqL9 zY>u^9yR*4^FE(dxnWKZL419aWS;KkWE@RAQZ6BJ@&lA=*ty$V?k^D=Q4zMBziluo# z4JJ$D00*9><)igvX^+0MLwj~KXUF#EhDUbPyw^itz?9gDTheUiNtw&B7p zwpj%_la~uzPg6{nV#p`t*465ixrYpd=IF?*-Lg*1wXczlZRzTRZK$bIeP^_ z9_Gj);PS91)_i&R`&W5FLtRZ~aNzQ1;PFIj&6QN0zseJSbBUIt+dxaS9MUODwE2-% zDAE46RyI;aM*PRxHG(}oEl({U|FOvUHTahq&$5iz3QxRzY(+izm45+Rf7Wqt$cP2v z5O2%dS)7kv8v#@An=D=#aWHP_RTEv!#}(r5Lpu7-_nw?AQ2-!}J+-`P8m+cM_5MuMuI((Leg*j-gm zPdmJ9j#F2|u2ZolQ#X!tNjk^z#v4SA!y^tp$MMF?a~#{}FYzN}>DOJM_xuQLt~orR z|0+=uE0NC^xozX8$`^5eRc9Yc+5XD96dTUE z-!SI?l<_?~GZ%aVQIOX+6uaK zA0Ssgd53cd-IRB}TU{OZFV-DNqa{oe zx4T|Cp%b2qdkfQ}jPPg@*wR?V31qRo@9{H53zS7z$vG8?>}`#;QcSItO1)D{g+j8o zb$+c|l_sYao=Qmew$87$S?O_V;Xc`9Z|nS8yOe#ld2w_?|HC3(nPvK5-ZD0z4@T~B zadq{qbUyXHjDrDLR-Q#5&y;Dr-As- z0k`H7%exXd@!tb&pu~R;r_F|^NDeZ@e-1cL4gnPZJci~sqxSn+>sLjTj?iT|RA!{CYkEK2(mofhIhi`@D~ zo$(Ed_|Kx8+V~!ULr&$1|3ci;Mf?|n54`x#*-qb!FQD~Y68N(6>JPyBe^$HElK-dO zfwFfK=Rjo_JvmnE;V-wAs@is1^5`c@O5ilvv*MZRh)s?fh;m9KB&CmUiC~PiT>nJKl(#h%P;nI2k$--S}NR zg;m@7@rZWEJKExlpMcX@k1tNg6Z=A%HtQEpq5mPKfKu-6f2f>_|DkfS|KWYV0r&{y zoljcVAPng$RKvN%9_I)v3H;u`j)!l}J5*ILs?&U+J9C^PEFuUJ)YX%Zb1awVClHfF zA&LU}yDFw5aLEo1Zp3*i&eL#^&&AMXuy{fTUb|FvbO!LkDy`r$NWxKx)wVO>xuV6& zV#k0Fb(9<)PML(n3Z~X7CFRr#Lt(dBi|gwaWxaDl^ii}4Zn#m|=u`stuhLE{DFe*? z?oiTLX_0**WYdVEB_U@nt%S+bX5obXe35yAKGLnXCf6(#Jy_*V@*X6= z0h@-_AIKi)8#&_TIs(O4Rvej_?hDWzAE)Hw`#D~9MvY);YjammnozpPaf<<<7hr2l z+=fqujrXFqBYk{A|BE7B(+zn~!)gbXVB+~S=Z*hq{0I+oV5Uuo!ti_3-#UZ!+*ruz zw3!keAj7OMmSN)-!nM{X@-zIT711(+Ts-meq4{)0^ii;%(IYMCNoBsPUmRka{dH$N zPPF{7QAhsQ1M5NGmiQ5hNcl1!;YMI7lxvjwKhqej#n1ZoY{1Fo$yB|V5h{TCXD044 z3AkCCpAdJ02)8xT<^CgH%?2q55gQ`JxEm@?Ig~;wB;fX(SCB$hi*R2sKJF-Ez@~j? zBCFXwX|3_5vr0{Mn%}uX@&xDsRX71MdKiqX@9|?oxQ-qckoY_fr9FuhhN= z7GojYMpsMQVu#zy(0nQj}Z^-qzXj56*$hPN7bi~@XSwasVlffK!p^pMVq>|o&cU1VP)QbsNR ziMz-y!*${TRp>f-$e|f29Nc|mK^fwY)|Jh{-JuFOIAaZzvHnp=2$nUFA6VJkn;lqh z?)@&ii=&Knnx3P|pRFvL8|RHGx2X)zjeo_Cs)W5f>pVx5*DI^x2%h^`yb|{E^v268 zm+Q#k)aS_w@v^05mLe>nBB0W;J5(XBWh6Q&(y|C{aHVAytvA1&CekwdKo(&KURq{B zUtU@!$J@ivV~JMw)I%vEo5+afe%9o#v$rMi_>@mVI}P zdq8avxyB!JMplXf=RUGsMgsVW?G#p^!!ENDAicH3m_D`0vtb z*Wgw)=PWlUh&Q`s2n=4!k;VNIoZPR*>fZ;{)%@# ziy|j6Sy#MsvdPP{=g6KZSG@DN6!~@U%b4T#M({!jd0uhkxOf^mUw}VXyz?aX`t15o I|MR8)4@FM*5C8xG literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_uart.r51 b/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/hal_uart.r51 new file mode 100644 index 0000000000000000000000000000000000000000..4e53776bd8c2828df06b1af23380dc8b41deacf3 GIT binary patch literal 24393 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 OaCUHVwx#`!h5rNo`UFV; literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/rf_set.pbd b/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/rf_set.pbd new file mode 100644 index 0000000..3c329d0 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/rf_set.pbd @@ -0,0 +1,19 @@ +This is an internal working file generated by the Source Browser. +22:14 49s +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\BMA020.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\basic_rf.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\dma_itg.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\get_adc.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\get_swsensor.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_board.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_clock.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_digio.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_int.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_led.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_mcu.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_rf.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_rf_security.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\hal_uart.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\rf_set.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\sensor.pbi +E:\cc2530-projects\ZigbeeÎÞÏßͨÐÅ\B°å\Project\Debug\Obj\util.pbi diff --git a/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/rf_set.r51 b/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/rf_set.r51 new file mode 100644 index 0000000000000000000000000000000000000000..222c0fa0cc208ebf903023c807a2d220efaf06c3 GIT binary patch literal 22469 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 literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/sensor.r51 b/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/sensor.r51 new file mode 100644 index 0000000000000000000000000000000000000000..54fb7aabcf3944ec05a4d09fe7831fbce27dbbce GIT binary patch literal 18548 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%0DW0suIlF*(LraSjTO z?#qB+XmK!e4()l^r$S#CecwiJ7lZpA46cKz>f)f?v2L{8q1?Y-t)6Nvp|%%a(2DQ; zw%t*qjt2HPlmlnfRa3i5n1!$8c{Wocf3P?1j+~20+;?-Ltorm39Ftdn>M&nmf}k{HWa06Z;P`-l2lPfL7vtX9ALg2?oKGbv}v-Y z&*`$xj-af*5Bj;hJhAZmh2lKt0tg36W(eQ#x^H)TPVR*#$E@lFp|h0|`tDC5^evXq z_au~G+cZhj-`6*T*#9%7FsyK9!Rzs+F`sD{nj1SZH0Iy+R-L5tDcu@;wq)^nGDDJ2 z7D$0}OETbT+$3gSGaew!!_49)w&F0~lNM~j%H*!kT(Pb>e9SSmxPCJIBVCOD#{mB? zq<;g8E)StBe04=6Z1tf%?KoW=KuF8144<@?q|DmyB$SVC0kfv3F@GzYwfubEDrPMghqsPdOXtoq3I9*C#)G#7 zG;2Bg(4KY~=vFgpIT^lTv*tsyCa;)T`!wEKo#n0FkxMVrk$y)1f^JL0Qozo^@-wgBhCNqSs^{KM)AJ&$=XWNQbDHo|&2^v0 zz6nulXA0%E zH0PY(ro8hD+nfmRfx>?qA_!dVd-c<}sXSc9`%o}nu{mAYQvp>Gp-H>em&5zY9bV6FjQolfQJN{>_iX{S@V0#Rt{T+i5fjj~D}g??VEs{i8N64muh zyW=4YAY#;zWroBca+?t~1WDzOxn-XVLl`{!%vyf~EYchLqn0YIODMpRM8N|tuqw6W z43vGcD!m2v^eyOx8HYbxDBaIw_!9#0y-WOyq$m>(>iL4A<$YPZ&L`<|n3&!rz7xe$EtmVs7DioeCVxw#_7bip-vl+O zeVZRo3_4izA>VK8j*~mUbfAv#5v;=lP3oXHf_wM~;+fE{Ng{K?VgNB&Br-8sn!=VR zt0a_{H9INF;nd85Gb3CX2F^?BK&)UBv2|D44lZTDbIbGkCY#6GFFy?@V)t(}55yee zKujEGUFSed9DQXUh>4>wejs*ZM_)bSu#5Hauj9&gM(^Lq;Aq)At$YQBTvct`YD;Xk z9gAok%5S&%eqnda*>?A$jZpC3M9N0McxJ2_&g-oixJG=!JtuIG{tG6$I7TVhD&3ZI zdARm=evT;w41WX+L%+c_I#;OWAvePr_xp44`gAHJ31>b}tO&Q6Q4l!vX`VsZ!NVhx z=Ta=vTZ2V!W1uC2#b3a=)W3;yDH)fs4GA%U&Ub7b zHnakFS}WVDu(G+aq9}#lU8h;}boSN|VSV9a|x4;bD2HY z{*~|Ee+KWBvSI1oe}+_VEgP1b&Ac`&rLAV1BqeE#hZg*Fsx4#3Votjo2;-iHU}nJs zI+@&B8}l0p==3gegLZjZBCEHW8vwi500>Y1IvW77L&)9$+?dyYMQ3#NR;IqL!EdR= zr9^P^9rE1Fq3269*9p5rMo-`KdWqeP2%Jz)JFC&(SMgGGet#csYvzv;W&8U%Zq#D~ zaC83iYXJQ7UxQ8;ctfFkaxEn{wxRf${#z6W-(PQm3!*q^=;5vAn`OLZ*)vHfs!}o6 zCv*c}*Q&`H=qlACdisr;y$R*dwF)MI1o$rn7XF}69-y9cOVytG;WqzOcYY6GUYB}N z4E$oyT?yqcG>vzI{~luDe8IYr)9Fgh5W z8}%hF?j^1}OZ+@?iO1kTpLob|!JB6wtUJV}J-2?Sp2J0bM>)b>(+f*Z9Pyh@oCljP zEb%e8>BPBZxv<3VY2S3>T*w!e_$8g2PP`I@ePM}j5N|qh?qXh8;y)$1>BPC+yU;GV Gmj4gMu!x=j literal 0 HcmV?d00001 diff --git a/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/util.r51 b/Zigbee无线通信/Bæ�¿/Project/Debug/Obj/util.r51 new file mode 100644 index 0000000000000000000000000000000000000000..e7faf07b5b8d8ce2c0c6fc67c203fd4373bb29cc GIT binary patch literal 25205 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 +#include +#include +/*****µã¶ÔµãͨѶµØÖ·ÉèÖÃ***B***/ +#define RF_CHANNEL 25 // ƵµÀ 11~26 +#define PAN_ID 0xFF //ÍøÂçid +#define MY_ADDR 0xA2 //±¾»úÄ£¿éµØÖ· +#define SEND_ADDR 0xA1 //·¢Ë͵ØÖ· +/** +* ÎÞÏßͨÐÅʵÑé-B°å +* +*/ + +//LED & SW +#define LED1 P1_0 +#define SW P1_2 + +//°´¼ü״̬ + uint8 key_down_status = 0x00; +//·¢ËÍÊý¾Ý + uint8 send_data = 0x00; +//½ÓÊÕÊý¾Ý + uint8 recv_data = 0x00; +//Ë«»÷ʱ¼ä¼ä¸ô +unsigned int time = 0; +//µ±Ç°ºôÎüÁÁ¶È +unsigned char hx = 0 ; +//ÁÁ¶È±¸·Ý +unsigned char backup_h = 0; +//ºôÎü±ê־λ +unsigned char breath_sign = 0; + + +/**************************************************/ +static basicRfCfg_t basicRfConfig; +// ÎÞÏßRF³õʼ»¯ +void ConfigRf_Init(void) +{ + basicRfConfig.panId = PAN_ID; + basicRfConfig.channel = RF_CHANNEL; + basicRfConfig.myAddr = MY_ADDR; + basicRfConfig.ackRequest = TRUE; + while(basicRfInit(&basicRfConfig) == FAILED); + basicRfReceiveOn(); +} +//³õʼ»¯GPIO +void initial_gpio(){ + + P1SEL &=~0X05; + P1DIR |=0X01; + P1DIR &=~0X04; + P1INP &=~0X04; + P2INP &=~0X40; + LED1 = 0; +} +//³õʼ»¯T1 +void initial_t1(){ + T1CTL |=0X01; + PERCFG = 0X40; + P1SEL |=0X01; + T1CCTL2 = 0X64; + T1CC2L = 0XFF; + T1CC2H = hx; +} +//ºôÎüЧ¹û +void brearh(){ + static unsigned char js = 0; + static unsigned char a = 1; + if((T1STAT & 0X04)>0){ + T1STAT &= 0XFB; + js++; + if(js>=1){ + js = 0; + if(a ==1){ + hx=hx+1; + halMcuWaitMs(10); + }else if(a == 2){ + hx=hx-1; + halMcuWaitMs(10); + } + if(hx>=254){ + a = 2; + } + if(hx == 0){ + a = 1; + } + T1CC2L = 0XFF; + T1CC2H = hx; + backup_h = hx; + + } + } +} +//Åжϰ´¼ü״̬ +uint8 key_down(){ + if(SW == 0){ + halMcuWaitMs(50); + if(SW == 0){ + halMcuWaitMs(100); + time = 500; + while(time--){ + if(SW == 0){ + while(!SW); + return 11; + } + } + } + } + return 0; +} +/********************MAIN************************/ +void main(void) +{ + halBoardInit();//Ñ¡ÊÖ²»µÃÔڴ˺¯ÊýÄÚÌí¼Ó´úÂë + ConfigRf_Init();//Ñ¡ÊÖ²»µÃÔڴ˺¯ÊýÄÚÌí¼Ó´úÂë + initial_gpio(); + initial_t1(); + while(1) + { + key_down_status = key_down(); + if(key_down_status == 11){ + send_data = 0x1D; + //·¢ËÍÊý¾Ý + basicRfSendPacket(SEND_ADDR,&send_data,1); + } + //½ÓÊÕÊý¾Ý + if(basicRfPacketIsReady()){ + basicRfReceive(&recv_data,1,NULL); + if(recv_data == 0x1F){ + brearh(); + breath_sign = 1; + }else if(recv_data == 0x2F){ + breath_sign = 0; + } + } + //ÅжÏÊÇ·ñ¿ªÆôºôÎüµÆ + if(breath_sign){ + brearh(); + hx = backup_h; + }else{ + T1CC2H = backup_h; + } + } +} \ No newline at end of file diff --git a/Zigbee无线通信/Bæ�¿/Project/rf_set.dep b/Zigbee无线通信/Bæ�¿/Project/rf_set.dep new file mode 100644 index 0000000..3c04fb4 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/rf_set.dep @@ -0,0 +1,524 @@ + + + + 2 + 2330247038 + + Debug + + $PROJ_DIR$\Debug\Obj\BMA020.r51 + $PROJ_DIR$\..\CC2530_lib\utils\util.h + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.h + $PROJ_DIR$\Debug\Obj\hal_uart.pbi + $PROJ_DIR$\Debug\Obj\hal_mcu.pbi + $PROJ_DIR$\Debug\Obj\hal_rf_security.r51 + $TOOLKIT_DIR$\inc\clib\stdarg.h + $PROJ_DIR$\Debug\Obj\hal_clock.pbi + $PROJ_DIR$\Debug\Obj\basic_rf.pbi + $PROJ_DIR$\Debug\Obj\BMA020.pbi + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.h + $PROJ_DIR$\Debug\Obj\hal_digio.r51 + $PROJ_DIR$\SENSOR_DRV\sensor.h + $PROJ_DIR$\..\CC2530_lib\utils\util.c + $PROJ_DIR$\Debug\Obj\get_adc.r51 + $PROJ_DIR$\Debug\Obj\hal_digio.pbi + $PROJ_DIR$\Debug\Obj\hal_uart.r51 + $PROJ_DIR$\Debug\Obj\hal_int.pbi + $TOOLKIT_DIR$\inc\clib\sysmac.h + $PROJ_DIR$\..\CC2530_lib\common\hal_cc8051.h + $PROJ_DIR$\Debug\Exe\rec.hex + $PROJ_DIR$\Debug\Obj\hal_rf.pbi + $TOOLKIT_DIR$\inc\ioCC2530.h + $PROJ_DIR$\..\CC2530_lib\common\hal_defs.h + $PROJ_DIR$\Debug\Obj\get_swsensor.r51 + $PROJ_DIR$\..\CC2530_lib\common\hal_int.h + $PROJ_DIR$\Debug\Obj\rf_set.r51 + $PROJ_DIR$\Debug\Obj\rf_set.pbi + $PROJ_DIR$\Debug\Obj\get_swsensor.pbi + $PROJ_DIR$\Debug\Obj\hal_rf_security.pbi + $PROJ_DIR$\Debug\Obj\hal_led.pbi + $PROJ_DIR$\Debug\Obj\hal_clock.r51 + $PROJ_DIR$\Debug\Obj\sensor.pbi + $PROJ_DIR$\Debug\Obj\util.pbi + $PROJ_DIR$\Debug\Obj\rf_set.pbd + $PROJ_DIR$\Debug\Obj\dma_itg.pbi + $PROJ_DIR$\Debug\Exe\rf_set.d51 + $TOOLKIT_DIR$\lib\clib\cl-pli-blxd-1e16x01.r51 + $TOOLKIT_DIR$\config\devices\Texas Instruments\lnk51ew_CC2530F256_banked.xcl + $PROJ_DIR$\Debug\Obj\hal_int.r51 + $PROJ_DIR$\Debug\Obj\hal_led.r51 + $PROJ_DIR$\Debug\Obj\hal_mcu.r51 + $TOOLKIT_DIR$\inc\clib\stdio.h + $PROJ_DIR$\Debug\Obj\hal_board.pbi + $PROJ_DIR$\Debug\Obj\hal_rf.r51 + $PROJ_DIR$\Debug\Obj\hal_board.r51 + $PROJ_DIR$\Debug\Obj\dma_itg.r51 + $PROJ_DIR$\Debug\Obj\get_adc.pbi + $TOOLKIT_DIR$\inc\clib\string.h + $PROJ_DIR$\Debug\Obj\sensor.r51 + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.h + $PROJ_DIR$\Debug\Obj\basic_rf.r51 + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.h + $PROJ_DIR$\Debug\Obj\util.r51 + $PROJ_DIR$\..\CC2530_lib\board\hal_board.h + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.h + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.h + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.h + $PROJ_DIR$\..\CC2530_lib\board\hal_led.h + $PROJ_DIR$\SENSOR_DRV\get_adc.c + $PROJ_DIR$\SENSOR_DRV\get_swsensor.h + $PROJ_DIR$\SENSOR_DRV\sensor.c + $PROJ_DIR$\SENSOR_DRV\dma_itg.h + $PROJ_DIR$\SENSOR_DRV\get_adc.h + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.c + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.c + $PROJ_DIR$\SENSOR_DRV\BMA020.c + $PROJ_DIR$\SENSOR_DRV\BMA020.h + $PROJ_DIR$\SENSOR_DRV\dma_itg.c + $PROJ_DIR$\SENSOR_DRV\get_swsensor.c + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.c + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.c + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.c + $PROJ_DIR$\..\CC2530_lib\board\hal_led.c + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.c + $PROJ_DIR$\..\CC2530_LIB\board\hal_board.c + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.c + $PROJ_DIR$\..\CC2530_lib\common\hal_int.c + $PROJ_DIR$\rf_set.c + + + $PROJ_DIR$\..\CC2530_lib\utils\util.c + + + ICC8051 + 53 + + + BICOMP + 33 + + + + + ICC8051 + 23 22 1 55 + + + BICOMP + 23 22 1 55 + + + + + [ROOT_NODE] + + + XLINK + 36 20 + + + + + $PROJ_DIR$\Debug\Obj\rf_set.pbd + + + BILINK + 9 8 35 47 28 43 7 15 17 30 4 21 29 3 27 32 33 + + + + + $PROJ_DIR$\Debug\Exe\rf_set.d51 + + + XLINK + 20 + + + + + XLINK + 38 0 51 46 14 24 45 31 11 39 40 41 44 5 16 26 49 53 37 + + + + + $PROJ_DIR$\SENSOR_DRV\get_adc.c + + + ICC8051 + 14 + + + BICOMP + 47 + + + + + ICC8051 + 22 23 63 + + + BICOMP + 22 23 63 + + + + + $PROJ_DIR$\SENSOR_DRV\sensor.c + + + ICC8051 + 49 + + + BICOMP + 32 + + + + + ICC8051 + 23 22 50 63 12 62 67 + + + BICOMP + 23 22 50 63 12 62 67 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.c + + + ICC8051 + 44 + + + BICOMP + 21 + + + + + ICC8051 + 23 22 50 25 1 55 + + + BICOMP + 23 22 50 25 1 55 + + + + + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.c + + + ICC8051 + 16 + + + BICOMP + 3 + + + + + ICC8051 + 23 22 54 52 + + + BICOMP + 23 22 54 52 + + + + + $PROJ_DIR$\SENSOR_DRV\BMA020.c + + + ICC8051 + 0 + + + BICOMP + 9 + + + + + ICC8051 + 22 23 67 + + + BICOMP + 22 23 67 + + + + + $PROJ_DIR$\SENSOR_DRV\dma_itg.c + + + ICC8051 + 46 + + + BICOMP + 35 + + + + + ICC8051 + 22 23 62 + + + BICOMP + 22 23 62 + + + + + $PROJ_DIR$\SENSOR_DRV\get_swsensor.c + + + ICC8051 + 24 + + + BICOMP + 28 + + + + + ICC8051 + 22 23 60 + + + BICOMP + 22 23 60 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.c + + + ICC8051 + 31 + + + BICOMP + 7 + + + + + ICC8051 + 23 22 56 + + + BICOMP + 23 22 56 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.c + + + ICC8051 + 5 + + + BICOMP + 29 + + + + + ICC8051 + 23 22 50 55 2 1 48 18 + + + BICOMP + 23 22 50 55 2 1 48 18 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.c + + + ICC8051 + 41 + + + BICOMP + 4 + + + + + ICC8051 + 23 22 56 50 54 + + + BICOMP + 23 22 56 50 54 + + + + + $PROJ_DIR$\..\CC2530_lib\board\hal_led.c + + + ICC8051 + 40 + + + BICOMP + 30 + + + + + ICC8051 + 23 22 19 50 54 58 + + + BICOMP + 23 22 19 50 54 58 + + + + + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.c + + + ICC8051 + 51 + + + BICOMP + 8 + + + + + ICC8051 + 23 22 25 50 55 10 48 18 + + + BICOMP + 23 22 25 50 55 10 48 18 + + + + + $PROJ_DIR$\..\CC2530_LIB\board\hal_board.c + + + ICC8051 + 45 + + + BICOMP + 43 + + + + + ICC8051 + 23 22 19 50 57 25 54 52 + + + BICOMP + 23 22 19 50 57 25 54 52 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.c + + + ICC8051 + 11 + + + BICOMP + 15 + + + + + ICC8051 + 23 22 25 57 + + + BICOMP + 23 22 25 57 + + + + + $PROJ_DIR$\..\CC2530_lib\common\hal_int.c + + + ICC8051 + 39 + + + BICOMP + 17 + + + + + ICC8051 + 23 22 25 + + + BICOMP + 23 22 25 + + + + + $PROJ_DIR$\rf_set.c + + + ICC8051 + 26 + + + BICOMP + 27 + + + + + ICC8051 + 23 22 19 25 50 54 58 55 10 52 12 42 6 18 48 + + + BICOMP + 23 22 19 25 50 54 58 55 10 52 12 42 6 18 48 + + + + + + Release + + + [MULTI_TOOL] + XLINK + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/rf_set.ewd b/Zigbee无线通信/Bæ�¿/Project/rf_set.ewd new file mode 100644 index 0000000..99972a8 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/rf_set.ewd @@ -0,0 +1,1281 @@ + + + + 2 + + Debug + + 8051 + + 1 + + C-SPY + 2 + + 8 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 1 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 1 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 1 + + + + + + + ROM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 1 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 1 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 1 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + Release + + 8051 + + 0 + + C-SPY + 2 + + 8 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _3RD_ID + 1 + + 0 + 1 + 0 + + + + + + + + CHIPCON_ID + 2 + + 3 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + FS2_ID + 1 + + 0 + 1 + 0 + + + + + + + + + + + + + INFINEON_ID + 1 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + NS_ID + 1 + + 0 + 1 + 0 + + + + + + + ROM_ID + 1 + + 2 + 1 + 0 + + + + + + + + + + + + + + + + + + AD2_ID + 2 + + 6 + 1 + 0 + + + + + + + + + + + + + + CYGNAL_ID + 1 + + 1 + 1 + 0 + + + + + + + + + + + + + + + + + + + SIM_ID + 1 + + 2 + 1 + 0 + + + + + + + + + $EW_DIR$\common\plugins\CodeCoverage\CodeCoverage.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\Orti\Orti.ENU.ewplugin + 0 + + + $EW_DIR$\common\plugins\Stack\Stack.ENU.ewplugin + 1 + + + $EW_DIR$\common\plugins\SymList\SymList.ENU.ewplugin + 1 + + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/rf_set.ewp b/Zigbee无线通信/Bæ�¿/Project/rf_set.ewp new file mode 100644 index 0000000..0d03d96 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/rf_set.ewp @@ -0,0 +1,2157 @@ + + + + 2 + + Debug + + 8051 + + 1 + + General + 1 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 17 + 1 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 1 + + + + + + + + BILINK + 0 + + + + + Release + + 8051 + + 0 + + General + 1 + + 5 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ICC8051 + 4 + + 9 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A8051 + 2 + + 5 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + CUSTOM + 3 + + + + + + + BICOMP + 0 + + + + BUILDACTION + 1 + + + + + + + XLINK + 3 + + 17 + 1 + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + XAR + 1 + + 0 + 1 + 0 + + + + + + + + BILINK + 0 + + + + + app + + $PROJ_DIR$\rf_set.c + + + + basicrf + + $PROJ_DIR$\..\CC2530_lib\basicrf\basic_rf.c + + + + board + + $PROJ_DIR$\..\CC2530_LIB\board\hal_board.c + + + $PROJ_DIR$\..\CC2530_lib\board\hal_led.c + + + + common + + $PROJ_DIR$\..\CC2530_lib\common\hal_clock.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_digio.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_int.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_mcu.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf.c + + + $PROJ_DIR$\..\CC2530_lib\common\hal_rf_security.c + + + $PROJ_DIR$\..\CC2530_LIB\common\hal_uart.c + + + + sensor_drv + + $PROJ_DIR$\SENSOR_DRV\BMA020.c + + + $PROJ_DIR$\SENSOR_DRV\BMA020.h + + + $PROJ_DIR$\SENSOR_DRV\dma_itg.c + + + $PROJ_DIR$\SENSOR_DRV\dma_itg.h + + + $PROJ_DIR$\SENSOR_DRV\get_adc.c + + + $PROJ_DIR$\SENSOR_DRV\get_adc.h + + + $PROJ_DIR$\SENSOR_DRV\get_swsensor.c + + + $PROJ_DIR$\SENSOR_DRV\get_swsensor.h + + + $PROJ_DIR$\SENSOR_DRV\sensor.c + + + $PROJ_DIR$\SENSOR_DRV\sensor.h + + + + utils + + $PROJ_DIR$\..\CC2530_lib\utils\util.c + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/rf_set.eww b/Zigbee无线通信/Bæ�¿/Project/rf_set.eww new file mode 100644 index 0000000..5706dae --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/rf_set.eww @@ -0,0 +1,10 @@ + + + + + $WS_DIR$\rf_set.ewp + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.c b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.c new file mode 100644 index 0000000..6f60b91 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.c @@ -0,0 +1,285 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.c +// Description: dma_bma module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +//#include "hal_types.h" +#include "hal_defs.h" +#include "BMA020.h" + + + +#define BM(n) (1 << (n)) + +#define MCU_IO_TRISTATE 1 +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +#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); ) +#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); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) + + + +#define HAL_BOARD_IO_SHT_SCK_PORT 1 +#define HAL_BOARD_IO_SHT_SCK_PIN 6 +#define HAL_BOARD_IO_SHT_SDA_PORT 1 +#define HAL_BOARD_IO_SHT_SDA_PIN 5 + +#define HAL_BOARD_IO_E2PROM_SCL_PORT HAL_BOARD_IO_SHT_SCK_PORT +#define HAL_BOARD_IO_E2PROM_SCL_PIN HAL_BOARD_IO_SHT_SCK_PIN + + +#define HAL_E2PROM_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1) +#define HAL_E2PROM_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCL_DIR_OUT HAL_E2PROM_SCK_DIR_OUT +#define HAL_E2PROM_SCL_SET HAL_E2PROM_SCK_SET +#define HAL_E2PROM_SCL_CLR HAL_E2PROM_SCK_CLR + +#define HAL_E2PROM_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0) +#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,2) +#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define halMcuWaitUs McuWaitUs +#define NOP() asm("NOP") +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void McuWaitUs2(uint16 usec); +void McuWaitUs2(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void M2_I2cStart(void); +void M2_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + McuWaitUs2(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cStop(void); +void M2_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + HAL_E2PROM_SCL_SET(); //SCL=1 + McuWaitUs2(2); + + HAL_E2PROM_SDA_CLR(); //SDA=0 + McuWaitUs2(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); //SCL=0 + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cAck(void); +void M2_I2cAck(void)//µ±SDA=0ʱ²úÉúÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + McuWaitUs2(2); + + HAL_E2PROM_SDA_CLR(); + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cNack(void); +void M2_I2cNack(void)//µ±SDA=1ʱ²úÉú·ÇÓ¦´ðÐźŠ+{ + HAL_E2PROM_SCL_SET(); + McuWaitUs2(2); + + HAL_E2PROM_SDA_SET(); + McuWaitUs2(2); + + HAL_E2PROM_SCL_CLR(); + McuWaitUs2(2); +} + +//------------------------------------------------------------------- +static void M2_I2cWrite(uint8 dat); +void M2_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCL_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + McuWaitUs2(2); + HAL_E2PROM_SCL_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + McuWaitUs2(2); + } +} + +//------------------------------------------------------------------- +static uint8 M2_I2cRead(void); +uint8 M2_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + McuWaitUs2(2); + + for (cnt = 0; cnt < 8; cnt++) + { + HAL_E2PROM_SCL_SET(); + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + McuWaitUs2(2); + HAL_E2PROM_SCL_CLR(); + McuWaitUs2(2); + } + HAL_E2PROM_SDA_DIR_OUT();//cpu»ñÈ¡ÍêÒ»¸ö×Ö½Úºó£¬ÔÙ½«SDA¶Ë¿ÚÉèÖóÉÊä³ö£¬ÇÒÖÃ¸ß´Ë¶Ë¿Ú + return res; +} + +//------------------------------------------------------------------- +// GLOBAL FUNCTIONS +//------------------------------------------------------------------- +static void M2_Init(void); +void M2_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); +} + + +//------------------------------------------------------------------- +static void M2_WriteEEPROM(uint8 addr, uint8 ch); +void M2_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M2_I2cStart(); + + M2_I2cWrite(0x70);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M2_I2cAck(); + + M2_I2cWrite(addr); + M2_I2cAck(); + + M2_I2cWrite(ch); //data + M2_I2cAck(); + + M2_I2cStop(); + // halMcuWaitMs(5); +} + +//------------------------------------------------------------------- +static uint8 M3_ReadEEPROM(uint8 addr); +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M2_I2cStart(); + + M2_I2cWrite(0x70); //Æ÷¼þÉèÖÃΪд״̬ + M2_I2cAck(); + + M2_I2cWrite(addr); + M2_I2cAck(); + + + M2_I2cStart(); + + M2_I2cWrite(0x71); //Æ÷¼þÉèÖÃΪд״̬ + M2_I2cAck(); + + res = M2_I2cRead(); + + M2_I2cNack(); + M2_I2cStop(); + + return res; +} + + +/****************************************************************************** + * Ãû³Æ BMA_Pooling + * ¹¦ÄÜ ¶ÁÈ¡bma020µÄX,Y ZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ + * Èë¿Ú²ÎÊý (int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value) + *BMA_X_Value£ºXµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Y_Value£ºYµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Z_Value£ºZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + ¼ÓËÙ¶ÈֵΪ16λÓзûºÅÊý£¬·Ö±æÂÊΪ 2/512 (g), g=9.8m/s + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +void BMA_Pooling(int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value) +{ + uint16 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + uint16 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + int16 value; + M2_Init(); + BMA_XL_Value = M3_ReadEEPROM(0x02); + BMA_XM_Value = M3_ReadEEPROM(0x03); + BMA_YL_Value = M3_ReadEEPROM(0x04); + BMA_YM_Value = M3_ReadEEPROM(0x05); + BMA_ZL_Value = M3_ReadEEPROM(0x06); + BMA_ZM_Value = M3_ReadEEPROM(0x07); + value = (BMA_XM_Value << 8) | ((BMA_XL_Value&0xc0)); + *BMA_X_Value= value/64; + value = (BMA_YM_Value << 8) | ((BMA_YL_Value&0xc0)); + *BMA_Y_Value= value/64; + value = (BMA_ZM_Value << 8) | ((BMA_ZL_Value&0xc0)); + *BMA_Z_Value= value/64; +} + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.h b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.h new file mode 100644 index 0000000..2ac8afc --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/BMA020.h @@ -0,0 +1,29 @@ +#define ACK 1 +#define noACK 0 +#define measure_temp_H 0x1B +#define measure_temp_L 0x1C +#define measure_X_H 0x1D +#define measure_X_L 0x1E +#define measure_Y_H 0x1F +#define measure_Y_L 0x20 +#define measure_Z_H 0x21 +#define measure_Z_L 0x22 + + +#define uchar unsigned char +#define uint unsigned short +#define ulong unsigned long + + +/****************************************************************************** + * Ãû³Æ BMA_Pooling + * ¹¦ÄÜ ¶ÁÈ¡bma020µÄX,Y ZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ + * Èë¿Ú²ÎÊý (int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value) + *BMA_X_Value£ºXµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Y_Value£ºYµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + *BMA_Z_Value£ºZµÄÖØÁ¦¼ÓËÙ¶ÈÖµ´æ·ÅµØÖ· + ¼ÓËÙ¶ÈֵΪ16λÓзûºÅÊý£¬·Ö±æÂÊΪ 2/512 (g), g=9.8m/s + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +extern void BMA_Pooling(int16 *BMA_X_Value,int16 *BMA_Y_Value,int16 *BMA_Z_Value); + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.c b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.c new file mode 100644 index 0000000..2c40357 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.c @@ -0,0 +1,292 @@ +//------------------------------------------------------------------- +// Filename: dma_bma.c +// Description: dma_bma module library (I2C) +//------------------------------------------------------------------- +//------------------------------------------------------------------- +// INCLUDES +//------------------------------------------------------------------- +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +//#include "hal_types.h" +#include "dma_itg.h" + + + +#define BM(n) (1 << (n)) + +#define MCU_IO_TRISTATE 1 +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +#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); ) +#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); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) + + + +/***********аå°åIOÉèÖÃ********************/ +#define HAL_BOARD_IO_SHT_SCK_PORT 1 +#define HAL_BOARD_IO_SHT_SCK_PIN 6 +#define HAL_BOARD_IO_SHT_SDA_PORT 1 +#define HAL_BOARD_IO_SHT_SDA_PIN 5 + +#define HAL_BOARD_IO_E2PROM_SCL_PORT HAL_BOARD_IO_SHT_SCK_PORT +#define HAL_BOARD_IO_E2PROM_SCL_PIN HAL_BOARD_IO_SHT_SCK_PIN + + +#define HAL_E2PROM_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1) +#define HAL_E2PROM_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_E2PROM_SCL_DIR_OUT HAL_E2PROM_SCK_DIR_OUT +#define HAL_E2PROM_SCL_SET HAL_E2PROM_SCK_SET +#define HAL_E2PROM_SCL_CLR HAL_E2PROM_SCK_CLR + +#define HAL_E2PROM_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0) +#define HAL_E2PROM_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_E2PROM_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,2) +#define HAL_E2PROM_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) +#define halMcuWaitUs ITGMcuWaitUs +#define NOP() asm("NOP") +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +static void ITGMcuWaitUs(uint16 usec); +void ITGMcuWaitUs(uint16 usec) +{ + usec >>= 1; + while (usec--) + { + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + NOP(); + //NOP(); + } +} +//------------------------------------------------------------------- +// LOCAL FUNCTIONS +//------------------------------------------------------------------- +//--------- write a byte and checks the ack signal----------------- +static void M3_I2cWrite(uint8 dat); +void M3_I2cWrite(uint8 dat)//ÔÚ´«ËÍÊý¾Ýʱ£¬Êý¾ÝÏß±£³ÖÎȶ¨²»ÄÜÓÐÌø±ä +{ + uint8 i; + + for (i = 0; i < 8; i++) + { + if (dat &0x80) + { + HAL_E2PROM_SDA_SET(); + } + else + { + HAL_E2PROM_SDA_CLR(); + } + HAL_E2PROM_SCK_SET();//µ±Ê±ÖÓÏßΪ¸ßµçƽ(SCL=1)ʱ¿ªÊ¼´«ËÍÊý¾Ý + dat = dat << 1; + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR();//´«ËÍÍêºóÊÍ·Å×ÜÏߣ¨SCL=0£© + halMcuWaitUs(2); + } + +} + +//--------- read a byte and checks the ack signal----------------- +static uint8 M3_I2cRead(void); +uint8 M3_I2cRead(void) +{ + uint8 res = 0; + uint8 cnt; + + HAL_E2PROM_SDA_SET();//ÔÚ¶ÁÊý¾Ý֮ǰ£¬°ÑÊý¾ÝÏßÀ­¸ß£¨datesheetÉÏÓнéÉÜ£©,È»ºó°ÑÊý¾ÝÏ߶˿ڶÔCPUÉèÖóÉÊäÈë¶Ë¿Ú + HAL_E2PROM_SDA_DIR_IN(); + halMcuWaitUs(2); + + for (cnt = 0; cnt < 8; cnt++) + { + res <<= 1; + if (HAL_E2PROM_SDA_VAL())//cpu»ñÈ¡SDA¶Ë¿ÚÉϵÄÖµ + { + res |= 0x01; + } + HAL_E2PROM_SCK_SET(); + halMcuWaitUs(2); + HAL_E2PROM_SCK_CLR(); + halMcuWaitUs(2); + } + // MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SDA_PORT, HAL_BOARD_IO_E2PROM_SDA_PIN,!ack); /*µ±ack£½1ʱÀ­µÍÊý¾ÝÏß*/ + // HAL_E2PROM_SDA_SET(); + + HAL_E2PROM_SCK_SET(); /*clk #9 for ack*/ + halMcuWaitUs(1); /*pulswith approx 1 us */ + HAL_E2PROM_SCK_CLR(); + HAL_E2PROM_SDA_SET(); + + return res; +} +static void M3_I2cStart(void); +void M3_I2cStart(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɸ߱äµÍ£¬ÎªÆðʼÐźŠ+{ + HAL_E2PROM_SCK_SET(); //SCL=1 + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +static void M3_I2cStop(void); +void M3_I2cStop(void)//ÔÚSCL±£³Ö¸ßµçƽÆÚ¼ä£¬SDAÓɵͱä¸ß£¬ÎªÍ£Ö¹ÐźŠ+{ + + HAL_E2PROM_SCK_SET(); //SCL=1 + + HAL_E2PROM_SDA_CLR(); //SDA=0 + halMcuWaitUs(2); + + HAL_E2PROM_SDA_SET(); //SDA=1 + halMcuWaitUs(2); + + HAL_E2PROM_SCK_CLR(); //SCL=0 +} + +//------------------------------------------------------------------- +static void M3_I2cAck(void); +void M3_I2cAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_SET(); + HAL_E2PROM_SCK_CLR(); +} + +//------------------------------------------------------------------- +static void M3_I2cNAck(void); +void M3_I2cNAck(void) +{ + HAL_E2PROM_SCK_SET(); + HAL_E2PROM_SDA_CLR(); + HAL_E2PROM_SCK_CLR(); +} + + +static void M3_WriteEEPROM(uint8 addr, uint8 ch); +void M3_WriteEEPROM(uint8 addr, uint8 ch)//ÍùEEPROMÀïдÊý¾Ý£¨ÏÈдµØÖ·£¬ÔÚдÊý¾Ý£© +{ + M3_I2cStart(); + + M3_I2cWrite(0xD2);//дÆ÷¼þµØÖ·£¬¶ÔÓÚAT24C02À´Ëµ£¬¸ßËÄλ¹Ì¶¨Îª1010,ºóÈýλûÓÐÒâÒ壬×îºóһλΪ0ʱд£¬Îª1ʱ¶Á + M3_I2cAck(); + + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cWrite(ch); //data + M3_I2cAck(); + + M3_I2cStop(); +} +static uint8 M3_ReadEEPROM(uint8 addr); +uint8 M3_ReadEEPROM(uint8 addr) +{ + uint8 res; + + M3_I2cStart(); + M3_I2cWrite(0xD2); //Æ÷¼þÉèÖÃΪд״̬ + M3_I2cAck(); + M3_I2cWrite(addr); + M3_I2cAck(); + + M3_I2cStart(); + M3_I2cWrite(0xD3); //Æ÷¼þÉèÖÃΪ¶Á״̬ + M3_I2cAck(); + + res = M3_I2cRead(); + M3_I2cNAck(); + M3_I2cStop(); + + return res; +} +static void M3_Init(void); +void M3_Init(void)//³õʼ»¯ SDA=1¡¢SCL=1 +{ + static char initflg=0; + HAL_E2PROM_SDA_DIR_OUT(); + MCU_IO_OUTPUT(HAL_BOARD_IO_E2PROM_SCL_PORT, HAL_BOARD_IO_E2PROM_SCL_PIN,1); + if(initflg==0) + { + M3_WriteEEPROM(0x16,0x18); + initflg=1 ; + } +} + +/******************************************************************* + * Ãû³Æ ITG_Pooling + * ¹¦ÄÜ ¶ÁÈ¡itg_3200µÄX,Y ZµÄ½ÇËÙ¶È + * Èë¿Ú²ÎÊý (int16* X_Value, int16* Y_Value, int16* Z_Value ) + *X_Value£ºXÖáµÄ16λ½ÇËÙ¶È´æ·ÅµØÖ· + *Y_Value£ºYÖáµÄ16λ½ÇËÙ¶È´æ·ÅµØÖ· + *Z_Value£ºZÖáµÄ16λ½ÇËÙ¶È´æ·ÅµØÖ· + ½ÇËÙ¶ÈֵΪ16λÓзûºÅÊý£¬µ¥Î»Îª ¶È/S + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************/ +void ITG_Pooling(int16* X_Value, int16* Y_Value, int16* Z_Value ) +{ + int8 BMA_XM_Value,BMA_YM_Value,BMA_ZM_Value; + int8 BMA_XL_Value,BMA_YL_Value,BMA_ZL_Value; + int16 num_x1=0,num_y1=0,num_z1=0; + int16 num_x=0,num_y=0,num_z=0; + uint8 i = 0; + M3_Init(); + for(i=0;i<10;i++) + { + while (!(M3_ReadEEPROM(0x1A) & 0x01)); + BMA_XM_Value = M3_ReadEEPROM(0x1D); + halMcuWaitUs(5); + BMA_XL_Value = M3_ReadEEPROM(0x1E); + halMcuWaitUs(5); + BMA_YM_Value = M3_ReadEEPROM(0x1F); + halMcuWaitUs(5); + BMA_YL_Value = M3_ReadEEPROM(0x20); + halMcuWaitUs(5); + BMA_ZM_Value = M3_ReadEEPROM(0x21); + halMcuWaitUs(5); + BMA_ZL_Value = M3_ReadEEPROM(0x22); + halMcuWaitUs(5); + num_x1 = (BMA_XM_Value << 8) | BMA_XL_Value; + num_y1 = (BMA_YM_Value << 8) | BMA_YL_Value; + num_z1 = (BMA_ZM_Value << 8) | BMA_ZL_Value; + num_x = num_x + num_x1; + num_y = num_y + num_y1; + num_z = num_z + num_z1; + } + // »»Ëã³É ¶È/S + *X_Value = (int16)(num_x/10/14.375); + *Y_Value = (int16)(num_y/10/14.375); + *Z_Value = (int16)(num_z/10/14.375); +} + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.h b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.h new file mode 100644 index 0000000..8c5c2aa --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/dma_itg.h @@ -0,0 +1,20 @@ +#define ACK 1 +#define noACK 0 +#define measure_temp_H 0x1B +#define measure_temp_L 0x1C +#define measure_X_H 0x1D +#define measure_X_L 0x1E +#define measure_Y_H 0x1F +#define measure_Y_L 0x20 +#define measure_Z_H 0x21 +#define measure_Z_L 0x22 + + +#define uchar unsigned char +#define uint unsigned short +#define ulong unsigned long + + + +extern void ITG_Pooling(int16* X_Value, int16* Y_Value, int16* Z_Value ); + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.c b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.c new file mode 100644 index 0000000..f9dde86 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.c @@ -0,0 +1,160 @@ +/************************************************************************************************** + Filename: sh10.c + + Description: sh10 driver + +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +//#include "hal_types.h" +#include "get_adc.h" + + +/****************************************************************************** + * GLOBAL VARIABLES + */ +void hal_adc_Init(void); + uint16 readVoltage(void); +//static volatile uint32 value; + +void hal_adc_Init(void) +{ + APCFG |=1; + P0SEL |= (1 << (0)); + P0DIR &= ~(1 << (0)); + +} +/****************************************************************************** + * Ãû³Æ get_adc + * ¹¦ÄÜ ¶ÁÈ¡A/DÖµ + * Èë¿Ú²ÎÊý ÎÞ + * ³ö¿Ú²ÎÊý 16λµçѹֵ£¬·Ö±æÂÊΪ10mV, Èç0x0102±íʾ2.58V + *****************************************************************************/ +uint16 get_adc(void) +{ + int32 value; + hal_adc_Init(); // ADC³õʼ»¯ + ADCIF = 0; //ÇåADC ÖжϱêÖ¾ + //²ÉÓûù×¼µçѹavdd5:3.3V£¬Í¨µÀ0£¬Æô¶¯ADת»¯ + ADCCON3 = (0x80 | 0x10 | 0x00); + while ( !ADCIF ) + { + ; //µÈ´ýADת»¯½áÊø + } + value = ADCH; + value = value<< 8; + value |= ADCL; + if(value&0x8000) + value=0; + // ADֵת»¯³Éµçѹֵ + // 0 ±íʾ 0V £¬32768 ±íʾ 3.3V + // µçѹֵ = (value*3.3)/32768 £¨V) + value = (value * 330); + value = value >> 15; // ³ýÒÔ32768 + // ·µ»Ø·Ö±æÂÊΪ0.01VµÄµçѹֵ + return (uint16)value; +} +#define ACH1 0 +#define ACH2 4 +#define ACH3 5 +#define ACH4 6 + +void hal_adc4_Init(void); +void hal_adc4_Init(void) +{ + APCFG |= (1 << ACH1) | (1 << ACH2)| (1 << ACH3)| (1 << ACH4); + P0SEL |= (1 << ACH1) | (1 << ACH2)| (1 << ACH3)| (1 << ACH4); + P0DIR &= ~((1 << ACH1) | (1 << ACH2)| (1 << ACH3)| (1 << ACH4)); + +} +#define AD4MA 32768*150*4/3300 +#define AD20MA 32768*150*20/3300 +//return 10ADÖµ£¬0---0v, 3ff---3.3v +uint16 adC_ch(uint8 ch); +uint16 adC_ch(uint8 ch) +{ + int32 value; + ADCIF = 0; //ÇåADC ÖжϱêÖ¾ + //²ÉÓûù×¼µçѹavdd5:3.3V£¬Í¨µÀch£¬Æô¶¯ADת»¯ + ADCCON3 = (0x80 | 0x10 | (ch&0x0f) ); + while ( !ADCIF ) + { + ; //µÈ´ýADת»¯½áÊø + } + value = ADCH; + value = value<< 8; + value |= ADCL; + if(value&0x8000) + value=0; + value= value>>5; + return (uint16)value; + /* + // ADֵת»¯³Éµçѹֵ + // 0 ±íʾ 0V £¬32768 ±íʾ 3.3V + // µçÁ÷ 0--4ma, 255--20ma, µç×è150r + value = (value - AD4MA)*255/(AD20MA - AD4MA); + if(value<0) + return 0; + if(value>255) + return 255; + return (uint8)value&0xff;*/ +} +/****************************************************************************** + * Ãû³Æ get_adc4 + * ¹¦ÄÜ ¶ÁÈ¡ËÄͨµÀA/DÖµ ch0 ch4 ch5 ch6 + * Èë¿Ú²ÎÊý ÎÞ + * ³ö¿Ú²ÎÊý + *****************************************************************************/ +void get_adc4ch(uint8 *buf) +{ + uint16 value; + hal_adc4_Init(); // ADC³õʼ»¯ + value=adC_ch(ACH1); + *buf=value; + buf++; + *buf=value>>8; + buf++; + value=adC_ch(ACH2); + *buf=value; + buf++; + *buf=value>>8; + buf++; + value=adC_ch(ACH3); + *buf=value; + buf++; + *buf=value>>8; + buf++; + value=adC_ch(ACH4); + *buf=value; + buf++; + *buf=value>>8; +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.h b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.h new file mode 100644 index 0000000..17fc182 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_adc.h @@ -0,0 +1,16 @@ +/************************************************************************************************* + Filename: adc.h + + *****/ + + +#ifndef SIMPLE_adc_H +#define SIMPLE_adc_H + + +extern void hal_adc_Init(void); +extern uint16 get_adc(void); +extern void get_adc4ch(uint8 *buf); +#endif + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.c b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.c new file mode 100644 index 0000000..7a8a559 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.c @@ -0,0 +1,57 @@ +/************************************************************************************************** + Filename: + + Description: + +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +//#include "hal_types.h" +#include "get_swsensor.h" + + +/****************************************************************************** + * GLOBAL VARIABLES + */ + +/****************************************************************************** + * Ãû³Æ get_swsensor + * ¹¦ÄÜ ¶ÁÈ¡¿ª¹ØÁ¿Öµ + * Èë¿Ú²ÎÊý ÎÞ + * ³ö¿Ú²ÎÊý 0»ò1µçƽ + *****************************************************************************/ +uint8 get_swsensor(void) +{ + P0SEL &= ~( 1 <<1); //ÉèÖÃp0.1ΪÆÕͨi/o¿Ú + P0DIR &= ~( 1 <<1); //ÉèÖÃp0.1ΪÊäÈë¿Ú + return P0_1; //·µ»Øp0.1µçƽ +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.h b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.h new file mode 100644 index 0000000..41ef756 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/get_swsensor.h @@ -0,0 +1,13 @@ +/************************************************************************************************* + Filename: + + *****/ + + +#ifndef SIMPLE_swsensor_H +#define SIMPLE_swsensor_H + +extern uint8 get_swsensor(void); +#endif + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.c b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.c new file mode 100644 index 0000000..fa93954 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.c @@ -0,0 +1,166 @@ +/************************************************************************************************** + Filename: sensor.c */ + + + +#include "hal_defs.h" +//#include "hal_types.h" +#include "hal_mcu.h" +#include "ioCC2530.h" +//#include "sh10.h" +#include "get_adc.h" +#include "sensor.h" +#include "dma_itg.h" +#include "bma020.h" +//#include "UART_PRINT.h" +//#include "OnBoard.h" + + +/****************************************************************************** + * GLOBAL VARIABLES + */ +void hal_LightSensor_Init(void); +static uint16 readVoltage(void); + +uint16 get_guangdian_ad(void); +void get_4channel_ad(uint8 *buf); +uint8 get_rentihongwai(void); +void get_wendu_shidu(int16 *temp, int16 *hum); +//static volatile uint32 value; + +void hal_LightSensor_Init(void) +{ + APCFG |=1; + P0SEL |= (1 << (0)); + P0DIR &= ~(1 << (0)); + P0INP |=1; +} +/****************************************************************************** + * @fn readVoltage + * + * @brief read voltage from ADC + * + * @param none + * + * @return voltage + *******/ +static uint16 readVoltage(void) +{ + + uint32 value; + int16 value1; + hal_LightSensor_Init(); + // Clear ADC interrupt flag + ADCIF = 0; + + ADCCON3 = (0x80 | 0x10 | 0x00); + //ADCCON3 = (0x80 | 0x10 | 0x0c); + //²ÉÓûù×¼µçѹavdd5:3.3V + // Wait for the conversion to finish + while ( !ADCIF ); + + // Get the result + value1 = ADCH; + value1 = value1<< 8; + value1 |= ADCL; + if(value1<0) + value1=0; + value=value1; + + // value now contains measurement of 3.3V + // 0 indicates 0V and 32767 indicates 3.3V + // voltage = (value*3.3)/32767 volts + // we will multiply by this by 10 to allow units of 0.01 volts + value = value >> 6; // divide first by 2^6 + value = (uint32)(value * 330); + value = value >> 9; // ...and later by 2^9...to prevent overflow during multiplication + + return (uint16)value; + +} + +/****************************************************************************** + * @fn readsensor + * + * @brief read readsensor ´«¸ÐÆ÷²ÉÑù + * + * @param sensorid + * + * @return sensor value, len + *******/ +uint8 readsensor(uint8 sensorid, char *val) +{ + if(sensorid == 0x01) + { //ÎÂʪ¶È + //call_sht11(tmp1,tmp2); + + return 4; + } + if(sensorid == 0x02) + { // G_SENSOR + BMA_Pooling((int16*)val, (int16*)(val+2),(int16*)(val+4)); + return 6; + } + if(sensorid == 0x03) + { //ÍÓÂÝÒÇ + ITG_Pooling((int16*)val, (int16*)(val+2),(int16*)(val+4)); + return 6; + } + if(sensorid == 0x4) + { //ÈËÌå p0.1 + APCFG &= ~(1<<1); + P0SEL &= ~(1 << (1)); + P0DIR &= ~(1 << (1)); + *val=0; + if( P0_1==0 ) + *val=0x01; + return 2; + } + if(sensorid == 0x5) + { //ËÄͨµÀ ad + get_adc4ch(val); + return 8; + } + if(sensorid == 0x6) + { //¹âÕÕ adc »òÆäËû + *(int16*)val=get_adc(); + return 2; + } +} +uint16 get_guangdian_ad(void) +{ + return get_adc(); +} +void get_4channel_ad(uint8 *buf) +{ + get_adc4ch(buf); +} +//1 youren +uint8 get_rentihongwai(void) +{ + uint8 val; + APCFG &= ~(1<<1); + P0SEL &= ~(1 << (1)); + P0DIR &= ~(1 << (1)); + val=0; + if( P0_1==0 ) + val=0x01; + return val; +} + +void get_wendu_shidu(int16 *temp, int16 *hum) +{ + int16 tmp1,tmp2; + call_sht11 (&tmp1,&tmp2); + *temp = tmp1; + *hum = tmp2; +} +//1 dongzuo +void set_relay(uint8 status) +{ + if(status == 1){ + HAL_TURN_ON_DC1(); + }else{ + HAL_TURN_OFF_DC1(); + } +} \ No newline at end of file diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.h b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.h new file mode 100644 index 0000000..ac08b19 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sensor.h @@ -0,0 +1,30 @@ +/************************************************************************************************** + Filename: + + +**************************************************************************************************/ + + +#ifndef SENSOR_H +#define SENSOR_H + +/****************************************************************************** + * CONSTANTS + */ + + +/****************************************************************************** + * PUBLIC FUNCTIONS + */ +extern uint8 readsensor(uint8 sensorid, char *val); + +extern uint16 get_guangdian_ad(void); +extern void get_4channel_ad(uint8 *buf); +extern uint8 get_rentihongwai(void); +extern void get_wendu_shidu(int16 *temp, int16 *hum); +extern void set_relay(uint8 status); +#endif // + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.c b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.c new file mode 100644 index 0000000..3dfd53c --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.c @@ -0,0 +1,325 @@ +/************************************************************************************************** + Filename: sh10.c + + Description: sh10 driver + +**************************************************************************************************/ + +/****************************************************************************** + * INCLUDES + */ +#include "ioCC2530.h" +#include "hal_defs.h" +#include "sh10.h" + +#define BM(n) (1 << (n)) + +#define MCU_IO_TRISTATE 1 +#define MCU_IO_PULLUP 2 +#define MCU_IO_PULLDOWN 3 + +#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); ) +#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); switch (func) { case MCU_IO_PULLUP: P##port##INP &= ~BM(pin); P2INP &= ~BM(port + 5); break; case MCU_IO_PULLDOWN: P##port##INP &= ~BM(pin); P2INP |= BM(port + 5); break; default: P##port##INP |= BM(pin); break; } ) +#define MCU_IO_GET(port, pin) MCU_IO_GET_PREP(port, pin) +#define MCU_IO_GET_PREP(port, pin) (P##port## & BM(pin)) + + +#if defined (BOARD_OLD) +/***********¾É°åIOÉèÖÃ********************/ +#define HAL_BOARD_IO_SHT_SCK_PORT 2 +#define HAL_BOARD_IO_SHT_SCK_PIN 4 +#define HAL_BOARD_IO_SHT_SDA_PORT 2 +#define HAL_BOARD_IO_SHT_SDA_PIN 3 +#else +/***********аå°åIOÉèÖÃ********************/ +#define HAL_BOARD_IO_SHT_SCK_PORT 1 +#define HAL_BOARD_IO_SHT_SCK_PIN 6 +#define HAL_BOARD_IO_SHT_SDA_PORT 1 +#define HAL_BOARD_IO_SHT_SDA_PIN 5 +#endif + + +#define HAL_SHT_SCK_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) +#define HAL_SHT_SCK_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,1) +#define HAL_SHT_SCK_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SCK_PORT, HAL_BOARD_IO_SHT_SCK_PIN,0) + +#define HAL_SHT_SDA_SET() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_SHT_SDA_CLR() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,0) +#define HAL_SHT_SDA_DIR_OUT() MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,1) +#define HAL_SHT_SDA_DIR_IN() MCU_IO_INPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,2) +#define HAL_SHT_SDA_VAL() MCU_IO_GET(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN) + + + + +#define ACK 1 +#define noACK 0 +#define measure_temp 0x03 //²âÁ¿Î¶ÈÃüÁî +#define measure_humi 0x05 //²âÁ¿Êª¶ÈÃüÁî +#define RESET 0x1e //ÈíÆô¶¯ + +#define uchar unsigned char +#define uint unsigned int +#define ulong unsigned long + +//------------------------Êý¾Ý½á¹¹Ì嶨Òå--------------------------- +typedef union //±£´æËù²âµÃµÄζȣ¦Êª¶ÈÖµ +{ + uint i; + float f; +} value; +//WENSHIDU S; + + + + + + +/****************************************************************************** + * LOCAL FUNCTIONS + */ + +void SHT11_DELAY(uint16 usec); +char write_byte(unsigned char value); +char read_byte(unsigned char ack); +void transstart(void); +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode); +void calc_sth11(float *p_humidity ,float *p_temperature); + + +#define SENSOR_SHT10 + + + + + +#if defined SENSOR_SHT10 + +void SHT11_DELAY(uint16 usec) +{ + usec >>= 1; + + while (usec--) + { + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + + asm("NOP"); + asm("NOP"); + asm("NOP"); + asm("NOP"); + } +} + + + + +char write_byte(unsigned char value) +{ + unsigned char i,error=0; + + for (i=0x80;i>0;i/=2) + { + if (i & value) + HAL_SHT_SDA_SET(); + else + HAL_SHT_SDA_CLR(); + + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + } + + HAL_SHT_SDA_SET(); + HAL_SHT_SDA_DIR_IN(); + HAL_SHT_SCK_SET(); + error=HAL_SHT_SDA_VAL(); + HAL_SHT_SCK_CLR(); + + return error; +} + +char read_byte(unsigned char ack) +{ + unsigned char i,val=0; + + HAL_SHT_SDA_SET(); + HAL_SHT_SDA_DIR_IN(); + for (i=0x80;i>0;i/=2) + { + HAL_SHT_SCK_SET(); + if (HAL_SHT_SDA_VAL()) + val=(val | i); + HAL_SHT_SCK_CLR(); + } + MCU_IO_OUTPUT(HAL_BOARD_IO_SHT_SDA_PORT, HAL_BOARD_IO_SHT_SDA_PIN,!ack); + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + HAL_SHT_SDA_SET(); + + return val; +} + +void transstart(void) +{ + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + HAL_SHT_SDA_CLR(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + SHT11_DELAY(2); + HAL_SHT_SCK_SET(); + SHT11_DELAY(1); + + HAL_SHT_SDA_SET(); + SHT11_DELAY(1); + HAL_SHT_SCK_CLR(); + SHT11_DELAY(2); + HAL_SHT_SDA_CLR(); +} + +void connectionreset(void) +{ + unsigned char i; + HAL_SHT_SDA_SET(); + HAL_SHT_SCK_CLR(); + for(i=0;i<9;i++) + { + HAL_SHT_SCK_SET(); + HAL_SHT_SCK_CLR(); + } + transstart(); +} + +char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode) +{ + unsigned char error=0; + unsigned int i; + + connectionreset(); + switch(mode) + { + case 0 : error+=write_byte(measure_temp); break; + case 1 : error+=write_byte(measure_humi); break; + default : break; + } + + HAL_SHT_SDA_DIR_IN(); + for (i=0;i<65535;i++) + { + SHT11_DELAY(10); + if(HAL_SHT_SDA_VAL()== 0) break; + } + if(HAL_SHT_SDA_VAL()) + { + error+=1; + } + + *(p_value+1) =read_byte(ACK); + *(p_value)=read_byte(ACK); + *p_checksum =read_byte(noACK); + return error; +} +/****************************************************************************** + * Ãû³Æ calc_sth11 + * ¹¦ÄÜ ¼ÆËãÎÂʪ¶ÈÖµ + * Èë¿Ú²ÎÊý float *p_humidity ,float *p_temperature + ʪ¶È ÎÂ¶È + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +void calc_sth11(float *p_humidity ,float *p_temperature) +{ + const float C1=-4.0; + const float C2=+0.0405; + const float C3=-0.0000028; + const float T1=+0.01; + const float T2=+0.00008; + float rh=*p_humidity; + float t=*p_temperature; + float rh_lin; + float rh_true; + float t_C; + t_C=t*0.01 - 40; + rh_lin=C3*rh*rh + C2*rh + C1; + rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; + if(rh_true>100)rh_true=100; + if(rh_true<0.1)rh_true=0.1; + *p_temperature=t_C; + *p_humidity=rh_true; +} + +/****************************************************************************** + * Ãû³Æ call_sht11 + * ¹¦ÄÜ ¶ÁÈ¡SH1xÎÂʪ¶ÈÖµ + * Èë¿Ú²ÎÊý void call_sht11(unsigned int *tem_val,unsigned int *hum_val) + *tem_val:ζȴæ·ÅµØÖ·£¬0.1¶È·Ö±æÂÊ + *hum_val:ʪ¶È´æ·ÅµØÖ·£¬0.1·Ö±æÂÊ + * ³ö¿Ú²ÎÊý ÎÞ + *****************************************************************************/ +void call_sht11(unsigned int *tem_val,unsigned int *hum_val) +{ + value humi_val,temp_val; + unsigned char error = 0,checksum; + *tem_val=0; + *hum_val=0; + //Æô¶¯SH1xµÄʪ¶È²âÁ¿ + error+=s_measure((unsigned char*) &humi_val.i,&checksum,1); + //Æô¶¯SH1xµÄζȲâÁ¿ + error+=s_measure((unsigned char*) &temp_val.i,&checksum,0); + if(error!=0) + { //²âÊÔ´íÎ󣬽øÐÐÈí¸´Î» + connectionreset(); + } + else + { //²âÊÔÊý¾Ý´¦Àí + humi_val.f=(float)humi_val.i; + temp_val.f=(float)temp_val.i; + //¼ÆËãÎÂʪ¶Èʵ¼ÊÖµ + calc_sth11(&humi_val.f,&temp_val.f); + //ת»¯³É0.1µÄ·Ö±æÂÊ + *tem_val=temp_val.f*10; + *hum_val=humi_val.f*10; + } +} + +#endif + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.h b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.h new file mode 100644 index 0000000..c7f6f99 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/sensor_drv/sh10.h @@ -0,0 +1,14 @@ +/************************************************************************************************* + Filename: sh10.h + + *****/ + + +#ifndef SIMPLE_SH10_H +#define SIMPLE_SH10_H + +extern void call_sht11(unsigned int *tem, unsigned int *hum); +extern void connectionreset(void); +#endif + + diff --git a/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.cspy.bat b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.cspy.bat new file mode 100644 index 0000000..4b0b9ff --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.cspy.bat @@ -0,0 +1,15 @@ +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. +@REM +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM + + +"D:\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "D:\IAR Systems\Embedded Workbench 6.0\8051\bin\8051proc.dll" "D:\IAR Systems\Embedded Workbench 6.0\8051\bin\8051emu_cc.dll" %1 --plugin "D:\IAR Systems\Embedded Workbench 6.0\8051\bin\8051bat.dll" --backend -B "--proc_core" "plain" "--proc_code_model" "banked" "--proc_nr_virtual_regs" "8" "--proc_pdata_bank_reg_addr" "0x93" "--proc_dptr_nr_of" "1" "--proc_codebank_reg" "0x9F" "--proc_codebank_start" "0x8000" "--proc_codebank_end" "0xFFFF" "--proc_codebank_mask" "0xFF" "--proc_data_model" "large" "-p" "D:\IAR Systems\Embedded Workbench 6.0\8051\config\devices\Texas Instruments\ioCC2530F256.ddf" "--proc_exclude_exit_breakpoint" "--proc_driver" "chipcon" "--retain_memory" "--verify_download" "use_crc16" "--stack_overflow" "--number_of_banks" "4" + + diff --git a/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dbgdt b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dbgdt new file mode 100644 index 0000000..6da1fa6 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dbgdt @@ -0,0 +1,205 @@ + + + + + + + 20 + 1861 + + + 20 + 1395 + 372 + 93 + + + + 124 + 27 + 27 + 27 + + + + 1 + 1 + 1 + + + + + + + TabID-30582-27334 + Debug Log + Debug-Log + + + + TabID-30060-27344 + Build + Build + + + + 0 + + + + + TabID-8563-27337 + Workspace + Workspace + + + rf_set + + + + + 0 + + + + + TabID-19311-27341 + Disassembly + Disassembly + + + + 0 + + + + + + TextEditor + $WS_DIR$\rf_set.c + 0 + 26 + 707 + 707 + + 0 + + TextEditor + $WS_DIR$\..\CC2530_lib\basicrf\basic_rf.c + 0 + 435 + 16120 + 16134 + + + TextEditor + $WS_DIR$\..\CC2530_lib\common\hal_mcu.c + 0 + 36 + 2227 + 2239 + + + 0 + + + 1000000 + 1000000 + + + 1 + + + + + + + iaridepm.enu1 + + + + + + + debuggergui.enu1 + + + + + + + + + + + + + -2 + -2 + 730 + 198 + -2 + -2 + 200 + 200 + 104167 + 200602 + 104167 + 734203 + + + + + + + + + + + -2 + -2 + 730 + 649 + -2 + -2 + 200 + 200 + 104167 + 200602 + 339063 + 734203 + + + + + + + + + + + -2 + -2 + 198 + 1922 + -2 + -2 + 1924 + 200 + 1002083 + 200602 + 104167 + 200602 + + + + + + + + + + + + + diff --git a/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dni b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dni new file mode 100644 index 0000000..44cb120 --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.dni @@ -0,0 +1,34 @@ +[DebugChecksum] +Checksum=466055467 +[DisAssemblyWindow] +NumStates=_ 1 +State 1=_ 1 +[InstructionProfiling] +Enabled=_ 0 +[CodeCoverage] +Enabled=_ 0 +[StackPlugin] +Enabled=1 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnHow=0 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[Log file] +LoggingEnabled=_ 0 +LogFile=_ "" +Category=_ 0 +[TermIOLog] +LoggingEnabled=_ 0 +LogFile=_ "" +[Breakpoints] +Count=0 +[ChipconEmu] +Stop timers on halt=0 +Leave target running=1 +[Aliases] +Count=0 +SuppressDialog=0 diff --git a/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.wsdt b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.wsdt new file mode 100644 index 0000000..c192c2e --- /dev/null +++ b/Zigbee无线通信/Bæ�¿/Project/settings/rf_set.wsdt @@ -0,0 +1,49 @@ + + + + + + rf_set/Debug + + + + + + + + + 149272727 + + 2098026165 + + + + + + TabID-1552-11148 + Workspace + Workspace + + + rf_setrf_set/Outputrf_set/apprf_set/basicrfrf_set/boardrf_set/commonrf_set/sensor_drv + + + + 0TabID-5639-8760BuildBuild0 + + + + + + TextEditor$WS_DIR$\rf_set.c01535715710TextEditor$WS_DIR$\..\CC2530_lib\basicrf\basic_rf.c04351612016134TextEditor$WS_DIR$\..\CC2530_lib\common\hal_mcu.c036222722390100000010000001 + + + + + + + iaridepm.enu1-2-2545240-2-213115085286194049157552707633-2-21831538-2-215401851002604239327111979239327 + + + + diff --git a/Zigbee无线通信/任务è¦�求.png b/Zigbee无线通信/任务è¦�求.png new file mode 100644 index 0000000000000000000000000000000000000000..7728284a29b0f7493a2d89811cd7764de156b7c9 GIT binary patch literal 156920 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 ZF@