project_sensor
Dependencies: project mbed nRF51822
Revision 0:75d0e1bb5990, committed 2017-05-28
- Comitter:
- didierlauwerys
- Date:
- Sun May 28 16:26:53 2017 +0000
- Commit message:
- spi_ctrl
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/BLE_API.lib Sun May 28 16:26:53 2017 +0000 @@ -0,0 +1,1 @@ +https://developer.mbed.org/teams/MDS_2/code/project/#d3985c47e5c9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/adxl345.h Sun May 28 16:26:53 2017 +0000
@@ -0,0 +1,118 @@
+#define DEVID 0x00
+#define THRESH_TAP 0x1D
+#define OFSX 0x1E
+#define OFSY 0x1F
+#define OFSZ 0x20
+#define DUR 0x21
+#define Latent 0x22
+#define Window 0x23
+#define THRESH_ACT 0x24
+#define THRESH_INACT 0x25
+#define TIME_INACT 0x26
+#define ACT_INACT_CTL 0x27
+#define THRESH_FF 0x28
+#define TIME_FF 0x29
+#define TAP_AXES 0x2A
+#define ACT_TAP_STATUS 0x2B
+#define BW_RATE 0x2C
+#define POWER_CTL 0x2D
+#define INT_ENABLE 0x2E
+#define INT_MAP 0x2F
+#define INT_SOURCE 0x30
+#define DATA_FORMAT 0x31
+#define DATAX0 0x32
+#define DATAX1 0x33
+#define DATAY0 0x34
+#define DATAY1 0x35
+#define DATAZ0 0x36
+#define DATAZ1 0x37
+#define FIFO_CTL 0x38
+#define FIFO_STATUS 0x39
+
+struct data_member_t {
+ uint8_t data_x0;
+ uint8_t data_x1;
+ uint8_t data_y0;
+ uint8_t data_y1;
+ uint8_t data_z0;
+ uint8_t data_z1;
+};
+
+
+#define THRESH_TAP_INIT 0x00
+ // Not used->reset interrupt
+#define OFSX_INIT 0x00
+#define OFSY_INIT 0x00
+#define OFSZ_INIT 0x00
+ // No ofsets
+#define DUR_INIT 0x00
+ // Disable single/double tap function
+#define Latent_INIT 0x00
+ // Disable double tap function
+#define Window_INIT 0x00
+ // Disable double tap function
+#define THRESH_ACT_INIT 0x0A
+ // 62.5mg/LSB
+#define THRESH_INACT_INIT 0x09
+ // 62.5mg/LSB
+#define TIME_INACT_INIT 0x08
+ // 1s/LSB
+ // Wait 8 seconds after inactivity
+#define ACT_INACT_CTL_INIT 0xF8
+ // D7 ACT AC/DC 1
+ // D6 ACT_X_EN 1
+ // D5 ACT_Y_EN 1
+ // D4 ACT_Z_EN 1
+ // D3 INACT AC/DC 1
+ // D2 INACT_X_EN 0
+ // D1 INACT_Y_EN 0
+ // D0 INACT_Z_EN 0
+#define THRESH_FF_INIT 0x00
+ // Not used->reset interrupt
+#define TIME_FF_INIT 0x00
+ // Not used->reset interrupt
+#define TAP_AXES_INIT 0x00
+ // Disable taps
+#define BW_RATE_INIT 0x0F
+ // D7-D5 000
+ // D4 LOW_POWER 0
+ // D3-D0 RATE 1111 (1.6kHz)
+#define POWER_CTL_INIT 0x00
+ // D7-D6 00
+ // D5 Link 0
+ // D4 AUTO_SLEEP 0
+ // D3 Measure 0
+ // D2 Sleep 0
+ // D1-D0 Wakeup 00 (8Hz)
+#define INT_ENABLE_INIT 0x80
+ // D7 DATA_READY 1
+ // D6 SINGLE_TAP 0
+ // D5 DOUBLE_TAP 0
+ // D4 Activity 0
+ // D3 Inactivity 0
+ // D2 FREE_FALL 0
+ // D1 Watermark 0
+ // D0 Overrun 0
+#define INT_MAP_INIT 0x00
+ // All set to INT1 pin
+ // D7 DATA_READY 0
+ // D6 SINGLE_TAP 0
+ // D5 DOUBLE_TAP 0
+ // D4 Activity 0
+ // D3 Inactivity 0
+ // D2 FREE_FALL 0
+ // D1 Watermark 0
+ // D0 Overrun 0
+#define DATA_FORMAT_INIT 0x0F
+ // D7 SELF_TEST 0
+ // D6 SPI 0 (4-wire)
+ // D5 INT_INVERT 0 (Active high)
+ // D4 0
+ // D3 FULL_RES 1
+ // D2 Justify 1 (Left justified MSB first)
+ // D1-D0 Range 11 (16g)
+#define FIFO_CTL_INIT 0x3F
+ // D7-D6 FIFO_MODE 00 (Bypass)
+ // D5 Trigger 1
+ // D4-D0 SAMPLES 11111
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sun May 28 16:26:53 2017 +0000
@@ -0,0 +1,339 @@
+using namespace std;
+
+#include "mbed.h"
+#include "spi_master.h"
+#include "adxl345.h"
+#include "ble/BLE.h"
+#include "ble/Gap.h"
+#include "ble/UUID.h"
+#include "ble/GattCharacteristic.h"
+#include "ble/GattCallbackParamTypes.h"
+#include "ble/GattServer.h"
+
+//#define CS P0_7 //chipselect
+#define MOSI P0_9 //Master Out Slave In
+#define MISO P0_11 //Master In Slave Out
+#define SCK P0_8 //Clock
+//additional IO
+#define ON_SW P0_28 //ON/OFF switch
+#define BEPB P0_29 //Enable/disable bluetooth push button
+#define CHARACT_DATA 0
+
+#define MIN_CONN_INTERVAL 10 //250 milliseconds
+#define MAX_CONN_INTERVAL 30 //350 milliseconds
+
+DigitalOut spi_cs(P0_28);
+DigitalIn int1(P0_15);
+DigitalIn location(P0_07);
+SPIClass SPI1(NRF_SPI1);
+data_member_t data[513];
+BLEDevice ble;
+Gap::Handle_t connectionHandle = 0xFFFF;
+
+/*SET UUID*/
+const UUID GATT_SERVICE = "88888888-5555-4444-1111-777777777777";
+const UUID ADV_DATA = "11001100-2200-3300-4400-550055005500";
+const UUID RECV_DATA = "22002200-3300-4400-5500-660066006600";
+char *compbuf= new char[26];
+uint16_t compbufLen=0;
+char *sendbuf= new char[26];
+char *sendbufaddr=sendbuf;
+uint16_t sendbufLen=20*sizeof(uint8_t);
+char *readystr = "data ready";
+uint16_t readyLen = sizeof("data ready");
+char *startstr = "START";
+uint16_t startLen = sizeof("START");
+char *sendstr = "SEND";
+uint16_t sendLen = sizeof("SEND");
+bool data_ready;
+uint16_t sendindex;
+uint8_t *AdvData= new uint8_t[26];
+uint16_t AdvDataLen=0;
+uint8_t *RcvData= new uint8_t[26];
+uint16_t RcvDataLen=0;
+uint8_t devnr = 1;
+unsigned count;
+/* Device Name, simpel discovey */
+const static char DEVICE_NAME[] = "Trump";
+GattCharacteristic gattchar = GattCharacteristic(ADV_DATA, AdvData, AdvDataLen, 26, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY|GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
+GattCharacteristic rxCharacteristic = GattCharacteristic(RECV_DATA, RcvData, RcvDataLen, 26, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);// | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);
+
+GattCharacteristic *CHARACT_ARRAY[] = {&gattchar,&rxCharacteristic};
+GattService gatt_service(GATT_SERVICE,CHARACT_ARRAY,2);
+GattAttribute::Handle_t writeHandle;
+GattAttribute::Handle_t readHandle;
+
+
+
+
+bool poll_start_send_data(uint8_t *compare_str, uint8_t comp_length){
+ uint16_t bufLen = 27;
+ uint8_t *rdbuf= new uint8_t[bufLen];
+ ble.readCharacteristicValue(readHandle,rdbuf,&bufLen);
+ for (uint8_t i=0 ; i<comp_length-1 ; i++)
+ {
+ if (*(rdbuf+i*sizeof(uint8_t)) != *(compare_str+i*sizeof(uint8_t)))
+ {
+ delete rdbuf;
+ return false;
+ }
+ }
+ delete rdbuf;
+ return true;
+}
+
+void Flash_Buff_WriteBytes(uint8_t addr, uint8_t pbuf)
+{
+ spi_cs = 0;
+ wait_us(200);
+ SPI1.transfer((uint8_t)addr);
+ SPI1.transfer(pbuf);
+
+ wait_us(200);
+ spi_cs = 1;
+}
+
+void Flash_Buff_ReadBytes(uint8_t addr, uint8_t *pbuf)
+{
+ spi_cs = 0;
+ wait_us(20);
+
+ SPI1.transfer((uint8_t)addr|0x80);
+ *pbuf = SPI1.transfer(0x00);
+
+ wait_us(20);
+ spi_cs = 1;
+}
+
+void init_adxl()
+{
+ Flash_Buff_WriteBytes(INT_ENABLE, 0x00);
+ Flash_Buff_WriteBytes(THRESH_TAP, THRESH_TAP_INIT);
+ Flash_Buff_WriteBytes(OFSX, OFSX_INIT);
+ Flash_Buff_WriteBytes(OFSY, OFSY_INIT);
+ Flash_Buff_WriteBytes(OFSZ, OFSZ_INIT);
+ Flash_Buff_WriteBytes(DUR, DUR_INIT);
+ Flash_Buff_WriteBytes(Latent, Latent_INIT);
+ Flash_Buff_WriteBytes(Window, Window_INIT);
+ Flash_Buff_WriteBytes(THRESH_ACT, THRESH_ACT_INIT);
+ Flash_Buff_WriteBytes(THRESH_INACT, THRESH_INACT_INIT);
+ Flash_Buff_WriteBytes(TIME_INACT, TIME_INACT_INIT);
+ Flash_Buff_WriteBytes(ACT_INACT_CTL, ACT_INACT_CTL_INIT);
+ Flash_Buff_WriteBytes(THRESH_FF, THRESH_FF_INIT);
+ Flash_Buff_WriteBytes(TIME_FF, TIME_FF_INIT);
+ Flash_Buff_WriteBytes(TAP_AXES, TAP_AXES_INIT);
+ Flash_Buff_WriteBytes(BW_RATE, BW_RATE_INIT);
+ Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT);
+ Flash_Buff_WriteBytes(INT_MAP, INT_MAP_INIT);
+ Flash_Buff_WriteBytes(DATA_FORMAT, DATA_FORMAT_INIT);
+ Flash_Buff_WriteBytes(FIFO_CTL, FIFO_CTL_INIT);
+ Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT | 0x08);
+ Flash_Buff_WriteBytes(INT_ENABLE, INT_ENABLE_INIT);
+}
+
+void read_data(uint16_t index)
+{
+ spi_cs = 0;
+ wait_us(20);
+
+ SPI1.transfer((uint8_t)(DATAX0|0xC0));
+ data[index].data_x0 = SPI1.transfer(0x00)^0x80;
+ data[index].data_x1 = SPI1.transfer(0x00);
+ data[index].data_y0 = SPI1.transfer(0x00)^0x80;
+ data[index].data_y1 = SPI1.transfer(0x00);
+ data[index].data_z0 = SPI1.transfer(0x00)^0x80;
+ data[index].data_z1 = SPI1.transfer(0x00);
+
+ wait_us(20);
+ spi_cs = 1;
+}
+
+
+/* WHEN CONNECTION ... */
+void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
+ if (params->role == Gap::CENTRAL) {
+ connectionHandle = params->handle;
+ }
+}
+
+
+/* Restart advertising when the peer disconnects */
+void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
+{
+ BLE::Instance().gap().startAdvertising();
+}
+
+/*This function is called when the ble initialization process has failed*/
+void onBleInitError(BLE &ble, ble_error_t error)
+{
+ /* Avoid compiler warnings, library said to do this */
+ (void) ble;
+ (void) error;
+
+ /* Initialization error handling should go here */
+}
+
+void dataSentCallback(unsigned count)
+{
+ SPI1.transfer(0xCC);
+ sendindex+=1;
+ memcpy(sendbufaddr+0*sizeof(uint8_t), &sendindex, sizeof(uint16_t));
+ memcpy(sendbufaddr+2*sizeof(uint8_t), &(data[sendindex].data_x0), sizeof(uint8_t));
+ memcpy(sendbufaddr+3*sizeof(uint8_t), &(data[sendindex].data_x1), sizeof(uint8_t));
+ memcpy(sendbufaddr+4*sizeof(uint8_t), &(data[sendindex].data_y0), sizeof(uint8_t));
+ memcpy(sendbufaddr+5*sizeof(uint8_t), &(data[sendindex].data_y1), sizeof(uint8_t));
+ memcpy(sendbufaddr+6*sizeof(uint8_t), &(data[sendindex].data_z0), sizeof(uint8_t));
+ memcpy(sendbufaddr+7*sizeof(uint8_t), &(data[sendindex].data_z1), sizeof(uint8_t));
+ sendindex+=1;
+ memcpy(sendbufaddr+8*sizeof(uint8_t), &(data[sendindex].data_x0), sizeof(uint8_t));
+ memcpy(sendbufaddr+9*sizeof(uint8_t), &(data[sendindex].data_x1), sizeof(uint8_t));
+ memcpy(sendbufaddr+10*sizeof(uint8_t), &(data[sendindex].data_y0), sizeof(uint8_t));
+ memcpy(sendbufaddr+11*sizeof(uint8_t), &(data[sendindex].data_y1), sizeof(uint8_t));
+ memcpy(sendbufaddr+12*sizeof(uint8_t), &(data[sendindex].data_z0), sizeof(uint8_t));
+ memcpy(sendbufaddr+13*sizeof(uint8_t), &(data[sendindex].data_z1), sizeof(uint8_t));
+ sendindex+=1;
+ memcpy(sendbufaddr+14*sizeof(uint8_t), &(data[sendindex].data_x0), sizeof(uint8_t));
+ memcpy(sendbufaddr+15*sizeof(uint8_t), &(data[sendindex].data_x1), sizeof(uint8_t));
+ memcpy(sendbufaddr+16*sizeof(uint8_t), &(data[sendindex].data_y0), sizeof(uint8_t));
+ memcpy(sendbufaddr+17*sizeof(uint8_t), &(data[sendindex].data_y1), sizeof(uint8_t));
+ memcpy(sendbufaddr+18*sizeof(uint8_t), &(data[sendindex].data_z0), sizeof(uint8_t));
+ memcpy(sendbufaddr+19*sizeof(uint8_t), &(data[sendindex].data_z1), sizeof(uint8_t));
+ if(sendindex>=512)
+ data_ready=false;
+
+}
+
+/*Callback triggered when ble initialization process has finished*/
+void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
+{
+ BLE& ble = params->ble;
+ ble_error_t error = params->error;
+
+/* In case of error, forward the error handling to onBleInitError */
+ if (error != BLE_ERROR_NONE) {
+ onBleInitError(ble, error);
+ return;
+ }
+
+ /* Ensure that it is the default instance of BLE */
+ if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
+ return;
+ }
+
+ /* Set device name characteristic data */
+ ble.gap().setDeviceName((const uint8_t *) DEVICE_NAME);
+
+ ble.gattServer().onDataSent(dataSentCallback);
+
+
+ /* callback when disconnected */
+ ble.gap().onDisconnection(disconnectionCallback);
+
+ /* Sacrifice 3B of 31B to some Advertising Flags (see nrfconnect toolbox for flag parameters :) ) */
+ // for
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);// say this device can be discovered by other BLE supportingdevices
+ ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // say that a connection can be set ( connectable) and that it does not matter with who it connects (unidirected)
+
+
+ /* Sacrifice another 2B of 31B (actually 29B) to AdvType overhead, rest goes to AdvData array --> about 26B of actual sendable data :o */
+ //Overhead = 1B Length, 1B Type
+ //Type = AdvData
+ //Length = sizeof(AdvData)
+ //ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::SERVICE_DATA, AdvData, sizeof(AdvData));
+
+ /*fill in device name as local name*/
+ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
+
+ /* Set advertising interval. Longer interval == Less radiothingies use == longer battery life :) */
+ ble.gap().setAdvertisingInterval(20); /* 100ms */
+
+
+
+ ble.addService(gatt_service);
+
+ //ble.gap().addData(GapAdvertisingData::SERVICE_DATA, (uint8_t *)AdvData, sizeof(AdvData));
+ /* Start advertising */
+ ble.gap().startAdvertising(); //start sending advertising packets
+
+ ble.initializeSecurity();
+ //end
+}
+
+
+main() {
+ wait_ms(1);
+ data_ready=false;
+ BLE& ble = BLE::Instance();
+ ble.init(bleInitComplete);
+ spi_cs = 1;
+ if (location==1) {
+ char *waitingstr = "waiting1";
+ uint16_t waitingLen = sizeof("waiting1"); }
+ else if(location==0) {
+ char *waitingstr = "waiting0";
+ uint16_t waitingLen = sizeof("waiting0"); }
+ uint16_t index;
+ for(uint16_t i=0; i<513;i++){
+ data[i].data_x0=(uint8_t)0;
+ data[i].data_x1=(uint8_t)0;
+ data[i].data_y0=(uint8_t)0;
+ data[i].data_y1=(uint8_t)0;
+ data[i].data_z0=(uint8_t)0;
+ data[i].data_z1=(uint8_t)0;
+ }
+ SPI1.begin(SCK, MOSI, MISO);
+ init_adxl();
+ writeHandle = gattchar.getValueHandle();
+ readHandle = rxCharacteristic.getValueHandle();
+
+ while(1)
+ {
+ ble.gattServer().write(writeHandle,(uint8_t *)waitingstr, waitingLen);
+ while (poll_start_send_data((uint8_t *)startstr, startLen) != true)
+ {
+ ble.waitForEvent();
+ }
+ //SPI
+ Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT | 0x08);
+ for (index=0 ; index<513 ; index++){
+ while(!int1){wait_us(1);}
+ read_data(index);
+ }
+ Flash_Buff_WriteBytes(POWER_CTL, POWER_CTL_INIT | 0x04);
+ ble.gattServer().write(writeHandle,(uint8_t *)readystr, readyLen);
+ //condition to send data
+ while (poll_start_send_data((uint8_t *)sendstr, sendLen) != true)
+ {
+ ble.waitForEvent();
+ }
+ index=0;
+ sendindex=2;
+ data_ready=true;
+ memcpy(sendbufaddr+0*sizeof(uint8_t), &index, sizeof(uint16_t));
+ memcpy(sendbufaddr+2*sizeof(uint8_t), &(data[index].data_x0), sizeof(uint8_t));
+ memcpy(sendbufaddr+3*sizeof(uint8_t), &(data[index].data_x1), sizeof(uint8_t));
+ memcpy(sendbufaddr+4*sizeof(uint8_t), &(data[index].data_y0), sizeof(uint8_t));
+ memcpy(sendbufaddr+5*sizeof(uint8_t), &(data[index].data_y1), sizeof(uint8_t));
+ memcpy(sendbufaddr+6*sizeof(uint8_t), &(data[index].data_z0), sizeof(uint8_t));
+ memcpy(sendbufaddr+7*sizeof(uint8_t), &(data[index].data_z1), sizeof(uint8_t));
+ memcpy(sendbufaddr+8*sizeof(uint8_t), &(data[index+1].data_x0), sizeof(uint8_t));
+ memcpy(sendbufaddr+9*sizeof(uint8_t), &(data[index+1].data_x1), sizeof(uint8_t));
+ memcpy(sendbufaddr+10*sizeof(uint8_t), &(data[index+1].data_y0), sizeof(uint8_t));
+ memcpy(sendbufaddr+11*sizeof(uint8_t), &(data[index+1].data_y1), sizeof(uint8_t));
+ memcpy(sendbufaddr+12*sizeof(uint8_t), &(data[index+1].data_z0), sizeof(uint8_t));
+ memcpy(sendbufaddr+13*sizeof(uint8_t), &(data[index+1].data_z1), sizeof(uint8_t));
+ memcpy(sendbufaddr+14*sizeof(uint8_t), &(data[index+2].data_x0), sizeof(uint8_t));
+ memcpy(sendbufaddr+15*sizeof(uint8_t), &(data[index+2].data_x1), sizeof(uint8_t));
+ memcpy(sendbufaddr+16*sizeof(uint8_t), &(data[index+2].data_y0), sizeof(uint8_t));
+ memcpy(sendbufaddr+17*sizeof(uint8_t), &(data[index+2].data_y1), sizeof(uint8_t));
+ memcpy(sendbufaddr+18*sizeof(uint8_t), &(data[index+2].data_z0), sizeof(uint8_t));
+ memcpy(sendbufaddr+19*sizeof(uint8_t), &(data[index+2].data_z1), sizeof(uint8_t));
+ wait(2);
+ while (data_ready == true)
+ {
+ ble.gattServer().write(writeHandle, (uint8_t *)sendbufaddr, sendbufLen);
+ ble.waitForEvent();
+
+ }
+ }
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Sun May 28 16:26:53 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/4336505e4b1c \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nRF51822.lib Sun May 28 16:26:53 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/teams/Nordic-Semiconductor/code/nRF51822/#3cc0718d98d0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/spi_master.cpp Sun May 28 16:26:53 2017 +0000
@@ -0,0 +1,236 @@
+/*
+
+Copyright (c) 2012-2014 RedBearLab
+
+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 "spi_master.h"
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+SPIClass::SPIClass(NRF_SPI_Type *_spi) : spi(_spi)
+{
+ //do nothing
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+void SPIClass::setCPOL( bool active_low)
+{
+ if(active_low)
+ {
+ spi->CONFIG |= (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
+ }
+ else
+ {
+ spi->CONFIG |= (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
+ }
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+void SPIClass::setCPHA( bool trailing)
+{
+ if(trailing)
+ {
+ spi->CONFIG |= (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos);
+ }
+ else
+ {
+ spi->CONFIG |= (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos);
+ }
+
+}
+
+/**********************************************************************
+name :
+function : MSBFIRST, LSBFIRST
+**********************************************************************/
+void SPIClass::setBitORDER( BitOrder bit)
+{
+ if(bit == MSBFIRST)
+ {
+ spi->CONFIG |= (SPI_CONFIG_ORDER_MsbFirst << SPI_CONFIG_ORDER_Pos);
+ }
+ else
+ {
+ spi->CONFIG |= (SPI_CONFIG_ORDER_LsbFirst << SPI_CONFIG_ORDER_Pos);
+ }
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+void SPIClass::setFrequency(uint8_t speed)
+{
+ if (speed == 0)
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_125K;
+ }
+ else if (speed == 1)
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_250K;
+ }
+ else if (speed == 2)
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_500K;
+ }
+ else if (speed == 3)
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_1M;
+ }
+ else if (speed == 4)
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_2M;
+ }
+ else if (speed == 5)
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_4M;
+ }
+ else if (speed == 6)
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_8M;
+ }
+ else
+ {
+ spi->FREQUENCY = SPI_FREQUENCY_4M;
+ }
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+void SPIClass::setSPIMode( uint8_t mode )
+{
+ if (SPI_MODE0 == mode)
+ {
+ setCPOL(0);
+ setCPHA(0);
+ }
+ else if (mode == SPI_MODE1)
+ {
+ setCPOL(0);
+ setCPHA(1);
+ }
+ else if (mode == SPI_MODE2)
+ {
+ setCPOL(1);
+ setCPHA(0);
+ }
+ else if (mode == SPI_MODE3)
+ {
+ setCPOL(1);
+ setCPHA(1);
+ }
+ else
+ {
+ setCPOL(0);
+ setCPHA(0);
+ }
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+void SPIClass::begin(uint32_t sck, uint32_t mosi, uint32_t miso)
+{
+
+ SCK_Pin = sck;
+ MOSI_Pin = mosi;
+ MISO_Pin = miso;
+
+ NRF_GPIO->PIN_CNF[SCK_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
+
+ NRF_GPIO->PIN_CNF[MOSI_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
+
+ NRF_GPIO->PIN_CNF[MISO_Pin] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
+ spi->PSELSCK = SCK_Pin;
+ spi->PSELMOSI = MOSI_Pin;
+ spi->PSELMISO = MISO_Pin;
+
+ setFrequency(3);
+ setSPIMode(SPI_MODE3);
+ setBitORDER(MSBFIRST);
+
+ spi->EVENTS_READY = 0;
+ spi->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
+
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+void SPIClass::begin()
+{
+ begin(SCK, MOSI, MISO);
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+uint8_t SPIClass::transfer(uint8_t data)
+{
+ while( spi->EVENTS_READY != 0U );
+
+ spi->TXD = (uint32_t)data;
+
+ while(spi->EVENTS_READY == 0);
+
+ data = (uint8_t)spi->RXD;
+
+ spi->EVENTS_READY = 0;
+
+ return data;
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+void SPIClass::endTransfer()
+{
+ spi->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos);
+}
+
+/**********************************************************************
+name :
+function :
+**********************************************************************/
+
+//SPIClass SPI(NRF_SPI1);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/spi_master.h Sun May 28 16:26:53 2017 +0000
@@ -0,0 +1,84 @@
+/*
+
+Copyright (c) 2012-2014 RedBearLab
+
+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.
+
+*/
+
+#ifndef _SPI_MASTER_H_
+#define _SPI_MASTER_H_
+
+#include "mbed.h"
+
+#define SPI_FREQUENCY_125K 0x02000000UL
+#define SPI_FREQUENCY_250K 0x04000000UL
+#define SPI_FREQUENCY_500K 0x08000000UL
+#define SPI_FREQUENCY_1M 0x10000000UL
+#define SPI_FREQUENCY_2M 0x20000000UL
+#define SPI_FREQUENCY_4M 0x40000000UL
+#define SPI_FREQUENCY_8M 0x80000000UL
+
+#define SPI_125K 0
+#define SPI_250K 1
+#define SPI_500K 2
+#define SPI_1M 3
+#define SPI_2M 4
+#define SPI_4M 5
+#define SPI_8M 6
+
+#define SPI_MODE0 0
+#define SPI_MODE1 1
+#define SPI_MODE2 2
+#define SPI_MODE3 3
+
+#define CS P0_28 //chipselect
+#define MOSI P0_9 //Master Out Slave In
+#define MISO P0_11 //Master In Slave Out
+#define SCK P0_8
+
+typedef enum{
+
+ MSBFIRST = 0,
+ LSBFIRST = 1
+
+}BitOrder;
+
+class SPIClass
+{
+ public:
+ SPIClass(NRF_SPI_Type *_spi);
+
+ void begin();
+ void begin(uint32_t sck, uint32_t mosi, uint32_t miso);
+ uint8_t transfer(uint8_t data);
+ void endTransfer();
+
+ void setSPIMode( uint8_t mode );
+ void setFrequency(uint8_t speed );
+ void setBitORDER( BitOrder bit);
+ void setCPHA( bool trailing);
+ void setCPOL( bool active_low);
+
+
+ private:
+ NRF_SPI_Type *spi;
+
+ uint32_t SCK_Pin;
+ uint32_t MOSI_Pin;
+ uint32_t MISO_Pin;
+
+};
+
+#endif