diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 4f986025..44ffc368 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -6,6 +6,8 @@ add_executable (rgb-lcd rgb-lcd.cxx) add_executable (buzzer-sound buzzer-sound.cxx) add_executable (led-bar led-bar.cxx) add_executable (seg-lcd 4digitdisplay.cxx) +add_executable (nrf_transmitter nrf_transmitter.cxx) +add_executable (nrf_receiver nrf_receiver.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -13,6 +15,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/lcd) include_directories (${PROJECT_SOURCE_DIR}/src/buzzer) include_directories (${PROJECT_SOURCE_DIR}/src/ledbar) include_directories (${PROJECT_SOURCE_DIR}/src/4digitdisplay) +include_directories (${PROJECT_SOURCE_DIR}/src/nrf24l01) target_link_libraries (compass hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled grove ${CMAKE_THREAD_LIBS_INIT}) @@ -22,3 +25,5 @@ target_link_libraries (rgb-lcd i2clcd ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (buzzer-sound buzzer ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (led-bar ledbar ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (seg-lcd 4digitdisplay ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (nrf_transmitter nrf24l01 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (nrf_receiver nrf24l01 ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/nrf_receiver.cxx b/examples/nrf_receiver.cxx new file mode 100644 index 00000000..77ce5710 --- /dev/null +++ b/examples/nrf_receiver.cxx @@ -0,0 +1,69 @@ +/* + * Author: Yevgeniy Kiveisha + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "nrf24l01.h" +#include + +int running = 0; +upm::NRF24l01 *comm = NULL; + +void +sig_handler(int signo) +{ + printf("got signal\n"); + if (signo == SIGINT) { + printf("exiting application\n"); + running = 1; + } +} + +void nrf_handler () { + std::cout << "devi1 :: " << *((uint32_t *)&(comm->m_rxBuffer[0])) << std::endl; +} + +int +main(int argc, char **argv) +{ + comm = new upm::NRF24l01(7); + comm->nrfSetRXaddr ((uint8_t *) "devi1"); + comm->nrfSetTXaddr ((uint8_t *) "devi2"); + comm->nrfSetPayload (MAX_BUFFER); + comm->nrfConfigModule (); + comm->dataRecievedHandler = nrf_handler; + + signal(SIGINT, sig_handler); + + while (!running) { + comm->nrfListenForChannel (); + } + + std::cout << "exiting application" << std::endl; + + delete comm; + + return 0; +} diff --git a/examples/nrf_transmitter.cxx b/examples/nrf_transmitter.cxx new file mode 100644 index 00000000..0679f383 --- /dev/null +++ b/examples/nrf_transmitter.cxx @@ -0,0 +1,73 @@ +/* + * Author: Yevgeniy Kiveisha + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include "nrf24l01.h" +#include + +int running = 0; +upm::NRF24l01 *comm = NULL; + +void +sig_handler(int signo) +{ + printf("got signal\n"); + if (signo == SIGINT) { + printf("exiting application\n"); + running = 1; + } +} + +void nrf_handler () { +} + +int +main(int argc, char **argv) +{ + uint32_t dummyData = 0; + comm = new upm::NRF24l01(7); + comm->nrfSetRXaddr ((uint8_t *) "devi2"); + comm->nrfSetTXaddr ((uint8_t *) "devi1"); + comm->nrfSetPayload (MAX_BUFFER); + comm->nrfConfigModule (); + comm->dataRecievedHandler = nrf_handler; + + signal(SIGINT, sig_handler); + + while (!running) { + memcpy (comm->m_txBuffer, &dummyData, sizeof (dummyData)); + comm->nrfSend (); + std::cout << "devi2 :: sending data ...." << dummyData << std::endl; + usleep (3000000); + dummyData += 3000; + } + + std::cout << "exiting application" << std::endl; + + delete comm; + + return 0; +} diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5db9c014..87264f59 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -4,3 +4,4 @@ add_subdirectory (lcd) add_subdirectory (buzzer) add_subdirectory (ledbar) add_subdirectory (4digitdisplay) +add_subdirectory (nrf24l01) diff --git a/src/nrf24l01/CMakeLists.txt b/src/nrf24l01/CMakeLists.txt new file mode 100644 index 00000000..9fc5bb93 --- /dev/null +++ b/src/nrf24l01/CMakeLists.txt @@ -0,0 +1,4 @@ +set (libname "nrf24l01") +add_library (nrf24l01 SHARED nrf24l01.cxx) +include_directories (${MAA_INCLUDE_DIR}) +target_link_libraries (nrf24l01 ${MAA_LIBRARIES}) diff --git a/src/nrf24l01/jsupm_nrf24l01.i b/src/nrf24l01/jsupm_nrf24l01.i new file mode 100644 index 00000000..0e66e82d --- /dev/null +++ b/src/nrf24l01/jsupm_nrf24l01.i @@ -0,0 +1,7 @@ +%module jsupm_nrf24l01 + +%{ + #include "nrf24l01.h" +%} + +%include "nrf24l01.h" diff --git a/src/nrf24l01/nrf24l01.cxx b/src/nrf24l01/nrf24l01.cxx new file mode 100644 index 00000000..b1f0f2c0 --- /dev/null +++ b/src/nrf24l01/nrf24l01.cxx @@ -0,0 +1,319 @@ +/* + * Author: Yevgeniy Kiveisha + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include + +#include "nrf24l01.h" + +using namespace upm; + +NRF24l01::NRF24l01 (uint8_t cs) { + maa_init(); + nrfInitModule (cs, 8); +} + +NRF24l01::~NRF24l01 () { + maa_result_t error = MAA_SUCCESS; + error = maa_spi_stop(m_spi); + if (error != MAA_SUCCESS) { + maa_result_print(error); + } + error = maa_gpio_close (m_cePinCtx); + if (error != MAA_SUCCESS) { + maa_result_print(error); + } + error = maa_gpio_close (m_csnPinCtx); + if (error != MAA_SUCCESS) { + maa_result_print(error); + } +} + +void +NRF24l01::nrfInitModule (uint8_t chip_select, uint8_t chip_enable) { + maa_result_t error = MAA_SUCCESS; + + m_csn = chip_select; + m_ce = chip_enable; + m_channel = 1; + + m_csnPinCtx = maa_gpio_init (m_csn); + if (m_csnPinCtx == NULL) { + fprintf (stderr, "Are you sure that pin%d you requested is valid on your platform?", m_csn); + exit (1); + } + + m_cePinCtx = maa_gpio_init (m_ce); + if (m_cePinCtx == NULL) { + fprintf (stderr, "Are you sure that pin%d you requested is valid on your platform?", m_ce); + exit (1); + } + + error = maa_gpio_dir (m_csnPinCtx, MAA_GPIO_OUT); + if (error != MAA_SUCCESS) { + maa_result_print (error); + } + + error = maa_gpio_dir (m_cePinCtx, MAA_GPIO_OUT); + if (error != MAA_SUCCESS) { + maa_result_print (error); + } + + nrfCELow (); + m_spi = maa_spi_init (0); +} + +void +NRF24l01::nrfConfigModule() { + /* Set RF channel */ + nrfConfigRegister (RF_CH, m_channel); + + /* Set length of incoming payload */ + nrfConfigRegister (RX_PW_P0, m_payload); + nrfConfigRegister (RX_PW_P1, m_payload); + /* Set length of incoming payload for broadcast */ + nrfConfigRegister (RX_PW_P2, m_payload); + + /* Start receiver */ + nrfPowerUpRX (); + nrfFlushRX (); +} + +/* Clocks only one byte into the given MiRF register */ +void +NRF24l01::nrfConfigRegister(uint8_t reg, uint8_t value) { + nrfCSOn (); + maa_spi_write (m_spi, W_REGISTER | (REGISTER_MASK & reg)); + maa_spi_write (m_spi, value); + nrfCSOff (); +} + +void +NRF24l01::nrfPowerUpRX() { + m_ptx = 0; + nrfCELow(); + nrfConfigRegister(CONFIG, mirf_CONFIG | ( (1< + * Copyright (c) 2014 Intel Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +#pragma once + +#include +#include +#include +#include + +/* Memory Map */ +#define CONFIG 0x00 +#define EN_AA 0x01 +#define EN_RXADDR 0x02 +#define SETUP_AW 0x03 +#define SETUP_RETR 0x04 +#define RF_CH 0x05 +#define RF_SETUP 0x06 +#define STATUS 0x07 +#define OBSERVE_TX 0x08 +#define CD 0x09 +#define RX_ADDR_P0 0x0A +#define RX_ADDR_P1 0x0B +#define RX_ADDR_P2 0x0C +#define RX_ADDR_P3 0x0D +#define RX_ADDR_P4 0x0E +#define RX_ADDR_P5 0x0F +#define TX_ADDR 0x10 +#define RX_PW_P0 0x11 +#define RX_PW_P1 0x12 +#define RX_PW_P2 0x13 +#define RX_PW_P3 0x14 +#define RX_PW_P4 0x15 +#define RX_PW_P5 0x16 +#define FIFO_STATUS 0x17 + +/* Bit Mnemonics */ +#define MASK_RX_DR 6 +#define MASK_TX_DS 5 +#define MASK_MAX_RT 4 +#define EN_CRC 3 +#define CRCO 2 +#define PWR_UP 1 +#define PRIM_RX 0 +#define ENAA_P5 5 +#define ENAA_P4 4 +#define ENAA_P3 3 +#define ENAA_P2 2 +#define ENAA_P1 1 +#define ENAA_P0 0 +#define ERX_P5 5 +#define ERX_P4 4 +#define ERX_P3 3 +#define ERX_P2 2 +#define ERX_P1 1 +#define ERX_P0 0 +#define AW 0 +#define ARD 4 +#define ARC 0 +#define PLL_LOCK 4 +#define RF_DR 3 +#define RF_PWR 1 +#define LNA_HCURR 0 +#define RX_DR 6 +#define TX_DS 5 +#define MAX_RT 4 +#define RX_P_NO 1 +#define TX_FULL 0 +#define PLOS_CNT 4 +#define ARC_CNT 0 +#define TX_REUSE 6 +#define FIFO_FULL 5 +#define TX_EMPTY 4 +#define RX_FULL 1 +#define RX_EMPTY 0 + +/* Instruction Mnemonics */ +#define R_REGISTER 0x00 +#define W_REGISTER 0x20 +#define REGISTER_MASK 0x1F +#define R_RX_PAYLOAD 0x61 +#define W_TX_PAYLOAD 0xA0 +#define FLUSH_TX 0xE1 +#define FLUSH_RX 0xE2 +#define REUSE_TX_PL 0xE3 +#define NOP 0xFF + +/* Nrf24l settings */ +#define mirf_ADDR_LEN 5 +#define mirf_CONFIG ((1<