Skip to content
This repository was archived by the owner on Feb 21, 2020. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 30 additions & 0 deletions boards.txt
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,34 @@ primo.build.pid=0x805a
#primo.bootloader.file=
primo.firmware.softdevice.file=primo/softdevice/s132_nrf52_2.0.0_softdevice.hex


#####################################
######## ARDUINO PRIMO CORE #########

primo_core.name=Arduino Primo Core

#primo_core.menu.upload.serial=via Serial
#primo_core.menu.upload.bluetooth=via Bluetooth
#primo_core.menu.upload.bluetooth.upload.tool=otable

primo_core.upload.tool=openocd
primo_core.upload.protocol=sam-ba
primo_core.upload.maximum_size=409600
primo_core.upload.use_1200bps_touch=false
primo_core.upload.speed=115200
primo_core.upload.wait_for_upload_port=false

primo_core.build.mcu=cortex-m4
primo_core.build.f_cpu=64000000L
primo_core.build.usb_product="Arduino Primo Core"
primo_core.build.board=NRF52_PRIMO_CORE
primo_core.build.core=arduino
primo_core.build.extra_flags=-mthumb
primo_core.build.ldscript=linker_scripts/gcc/flash.ld
primo_core.build.openocdscript=openocd_scripts/arduino_primo.cfg
primo_core.build.variant=arduino_primo_core
primo_core.build.components=components

#new defined attributes
#primo_core.bootloader.file=
primo_core.firmware.softdevice.file=primo/softdevice/s132_nrf52_2.0.0_softdevice.hex
2 changes: 2 additions & 0 deletions cores/arduino/WVariant.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ typedef enum _EAnalogChannel
ADC_A3=SAADC_CH_PSELP_PSELP_AnalogInput5,
ADC_A4=SAADC_CH_PSELP_PSELP_AnalogInput6,
ADC_A5=SAADC_CH_PSELP_PSELP_AnalogInput7,
ADC_A6=SAADC_CH_PSELP_PSELP_AnalogInput0,
ADC_A7=SAADC_CH_PSELP_PSELP_AnalogInput3
} EAnalogChannel ;

typedef enum _ETCChannel
Expand Down
7 changes: 6 additions & 1 deletion cores/arduino/wiring_analog.c
Original file line number Diff line number Diff line change
Expand Up @@ -87,11 +87,16 @@ void analogReference( uint8_t ulMode )
uint32_t analogRead( uint32_t ulPin ){
static int16_t valueRead[1];

#ifdef ARDUINO_NRF52_PRIMO
if((ulPin >= 0) && (ulPin <= 5))
ulPin = ulPin + 14;
//no analogRead for digital pin
// no analogRead for digital pin
else if(ulPin<=13)
return 0;
#elif defined ARDUINO_NRF52_PRIMO_CORE
if(ulPin > 7)
return 0;
#endif

//enable ADC
NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos;
Expand Down
34 changes: 31 additions & 3 deletions cores/arduino/wiring_digital.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ uint8_t read_char[] = {0,0};
bool transmissionBegun;
uint8_t suspended=0;


#ifdef ARDUINO_NRF52_PRIMO
void TwoWire_begin(void) {
//Master Mode
_TWIInstance=NRF_TWIM1;
Expand Down Expand Up @@ -225,11 +225,14 @@ int TwoWire_read(void)
}
}

#endif //ARDUINO_NRF52_PRIMO
///////////////////////////////////////////////////////////////////////

void pinMode( uint32_t ulPin, uint32_t ulMode )
{

#ifdef ARDUINO_NRF52_PRIMO

if ( (ulPin == 34) && (ulMode == STM32_IT) )
{
nrf_delay_ms(15);
Expand All @@ -249,6 +252,8 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )
TwoWire_endTransmission();
return ;
}

#endif //ARDUINO_NRF52_PRIMO

if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
{
Expand All @@ -274,17 +279,33 @@ void pinMode( uint32_t ulPin, uint32_t ulMode )

case OUTPUT:
// Set pin to output mode
nrf_gpio_pin_dir_set(g_APinDescription[ulPin].ulPin, NRF_GPIO_PIN_DIR_OUTPUT);
break ;
nrf_gpio_pin_dir_set(g_APinDescription[ulPin].ulPin, NRF_GPIO_PIN_DIR_OUTPUT);

#ifdef ARDUINO_NRF52_PRIMO_CORE
// LEDs on Core work with reverse logic. Turn them off if output mode is selected
if(ulPin == 10 || ulPin == 11 || ulPin == 12 || ulPin == 13)
digitalWrite(ulPin, LOW);
#endif //ARDUINO_NRF52_PRIMO_CORE
break ;

default:
// do nothing
break ;

}
}

void digitalWrite( uint32_t ulPin, uint32_t ulVal )
{

// in Primo Core leds have an inverted logic. Reverse ulVal in order to restore the normal logic
#ifdef ARDUINO_NRF52_PRIMO_CORE
if(ulPin == 10 || ulPin == 11 || ulPin == 12 || ulPin == 13)
ulVal = !ulVal;
#endif //ARDUINO_NRF52_PRIMO_CORE

#ifdef ARDUINO_NRF52_PRIMO

switch ( ulPin )
{
case 38:
Expand Down Expand Up @@ -382,6 +403,8 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal )
break ;
}

#endif //ARDUINO_NRF52_PRIMO

if ( ulPin >= 38 && ulPin <= 42)
{
return ;
Expand All @@ -403,6 +426,9 @@ void digitalWrite( uint32_t ulPin, uint32_t ulVal )

int digitalRead( uint32_t ulPin )
{

#ifdef ARDUINO_NRF52_PRIMO

switch ( ulPin )
{
case 44:
Expand All @@ -428,6 +454,8 @@ int digitalRead( uint32_t ulPin )
break ;
}

#endif //ARDUINO_NRF52_PRIMO

/* Handle the case the pin isn't usable as PIO */
if ( g_APinDescription[ulPin].ulPinType == PIO_NOT_A_PIN )
{
Expand Down
4 changes: 4 additions & 0 deletions libraries/CIR/cir.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@
#ifndef __CIR_H__
#define __CIR_H__

#ifdef ARDUINO_NRF52_PRIMO_CORE
#error "CIR library is not compatible with Arduino Primo Core"
#endif //ARDUINO_NRF52_PRIMO_CORE

#include <Wire.h>
#include <stdint.h>
#include "Arduino.h"
Expand Down
91 changes: 78 additions & 13 deletions libraries/SPI/SPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,21 @@ SPIClass::SPIClass(NRF_SPI_Type *SPIInstance, uint8_t uc_pinMISO, uint8_t uc_pin
{
_SPIInstance = SPIInstance;

_uc_pinMiso = g_APinDescription[uc_pinMISO].ulPin;
_uc_pinSCK = g_APinDescription[uc_pinSCK].ulPin;
_uc_pinMosi = g_APinDescription[uc_pinMOSI].ulPin;
_uc_pinMiso = uc_pinMISO;
_uc_pinSCK = uc_pinSCK;
_uc_pinMosi = uc_pinMOSI;
}


void SPIClass::begin()
{
pinMode(_uc_pinSCK, OUTPUT);
pinMode(_uc_pinMosi, OUTPUT);
pinMode(_uc_pinMiso, INPUT);

_SPIInstance->PSELSCK = _uc_pinSCK;
_SPIInstance->PSELMOSI = _uc_pinMosi;
_SPIInstance->PSELMISO = _uc_pinMiso;
_SPIInstance->PSELSCK = g_APinDescription[_uc_pinSCK].ulPin;
_SPIInstance->PSELMOSI = g_APinDescription[_uc_pinMosi].ulPin;
_SPIInstance->PSELMISO = g_APinDescription[_uc_pinMiso].ulPin;

// Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first.
_SPIInstance->FREQUENCY = (SPI_FREQUENCY_FREQUENCY_M4 << SPI_FREQUENCY_FREQUENCY_Pos);
Expand All @@ -54,9 +55,10 @@ void SPIClass::beginSlave()
pinMode(_uc_pinMiso, INPUT);


_SPIInstance->PSELSCK = _uc_pinSCK;
_SPIInstance->PSELMOSI = _uc_pinMosi;
_SPIInstance->PSELMISO = _uc_pinMiso;
_SPIInstance->PSELSCK = g_APinDescription[_uc_pinSCK].ulPin;
_SPIInstance->PSELMOSI = g_APinDescription[_uc_pinMosi].ulPin;
_SPIInstance->PSELMISO = g_APinDescription[_uc_pinMiso].ulPin;


setDataMode(SPI_MODE0);
setBitOrder(MSBFIRST);
Expand All @@ -71,6 +73,56 @@ void SPIClass::end()
_SPIInstance->ENABLE &= ~(SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
}

#ifdef ARDUINO_NRF52_PRIMO_CORE

void SPIClass::begin(int uc_pinMISO, int uc_pinMOSI, int uc_pinSCK)
{
_uc_pinMiso = uc_pinMISO;
_uc_pinSCK = uc_pinSCK;
_uc_pinMosi = uc_pinMOSI;

pinMode(_uc_pinSCK, OUTPUT);
pinMode(_uc_pinMosi, OUTPUT);
pinMode(_uc_pinMiso, INPUT);

_SPIInstance->PSELSCK = g_APinDescription[_uc_pinSCK].ulPin;
_SPIInstance->PSELMOSI = g_APinDescription[_uc_pinMosi].ulPin;
_SPIInstance->PSELMISO = g_APinDescription[_uc_pinMiso].ulPin;

// Default speed set to 4Mhz, SPI mode set to MODE 0 and Bit order set to MSB first.
_SPIInstance->FREQUENCY = (SPI_FREQUENCY_FREQUENCY_M4 << SPI_FREQUENCY_FREQUENCY_Pos);
setDataMode(SPI_MODE0);
setBitOrder(MSBFIRST);
_order=MSBFIRST;

_SPIInstance->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
}


void SPIClass::beginSlave(int uc_pinMISO, int uc_pinMOSI, int uc_pinSCK)
{
_uc_pinMiso = uc_pinMISO;
_uc_pinSCK = uc_pinSCK;
_uc_pinMosi = uc_pinMOSI;

pinMode(_uc_pinSCK, INPUT);
pinMode(_uc_pinMosi, OUTPUT);
pinMode(_uc_pinMiso, INPUT);


_SPIInstance->PSELSCK = g_APinDescription[_uc_pinSCK].ulPin;
_SPIInstance->PSELMOSI = g_APinDescription[_uc_pinMosi].ulPin;
_SPIInstance->PSELMISO = g_APinDescription[_uc_pinMiso].ulPin;


setDataMode(SPI_MODE0);
setBitOrder(MSBFIRST);
_order=MSBFIRST;

_SPIInstance->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
}
#endif //ARDUINO_NRF52_PRIMO_CORE

void SPIClass::beginTransaction(SPISettings settings)
{
uint8_t bitOrder;
Expand All @@ -80,14 +132,27 @@ void SPIClass::beginTransaction(SPISettings settings)
noInterrupts();

end();

pinMode(_uc_pinSCK, OUTPUT);
pinMode(_uc_pinMosi, OUTPUT);
pinMode(_uc_pinMiso, INPUT);

_SPIInstance->PSELSCK = _uc_pinSCK;
_SPIInstance->PSELMOSI = _uc_pinMosi;
_SPIInstance->PSELMISO = _uc_pinMiso;
_SPIInstance->PSELSCK = g_APinDescription[_uc_pinSCK].ulPin;
_SPIInstance->PSELMOSI = g_APinDescription[_uc_pinMosi].ulPin;
_SPIInstance->PSELMISO = g_APinDescription[_uc_pinMiso].ulPin;

#ifdef ARDUINO_NRF52_PRIMO_CORE
if(settings._uc_pinMiso != 0 && settings._uc_pinMosi != 0 && settings._uc_pinSCK != 0){
// override configuration with pins selected by user
pinMode(settings._uc_pinSCK, OUTPUT);
pinMode(settings._uc_pinMosi, OUTPUT);
pinMode(settings._uc_pinMiso, INPUT);

_SPIInstance->PSELSCK = g_APinDescription[settings._uc_pinSCK].ulPin;
_SPIInstance->PSELMOSI = g_APinDescription[settings._uc_pinMosi].ulPin;
_SPIInstance->PSELMISO = g_APinDescription[settings._uc_pinMiso].ulPin;
}
#endif //ARDUINO_NRF52_PRIMO_CORE

if(settings.interface_clock < 182000)
setClockDivider(SPI_CLOCK_DIV128);
Expand Down
24 changes: 23 additions & 1 deletion libraries/SPI/SPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,18 @@ class SPISettings {
data_mode = dataMode;
}

#ifdef ARDUINO_NRF52_PRIMO_CORE
SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode, int uc_pinMISO, int uc_pinMOSI, int uc_pinSCK)
{
interface_clock = clock;
bit_order = bitOrder;
data_mode = dataMode;
_uc_pinMiso = uc_pinMISO;
_uc_pinSCK = uc_pinSCK;
_uc_pinMosi = uc_pinMOSI;
}
#endif //ARDUINO_NRF52_PRIMO_CORE

SPISettings(void)
{
interface_clock = 4000000;
Expand All @@ -75,6 +87,11 @@ class SPISettings {
uint32_t interface_clock;
uint8_t bit_order;
uint8_t data_mode;
#ifdef ARDUINO_NRF52_PRIMO_CORE
uint8_t _uc_pinMiso = 0;
uint8_t _uc_pinMosi = 0;
uint8_t _uc_pinSCK = 0;
#endif //ARDUINO_NRF52_PRIMO_CORE

friend class SPIClass;
};
Expand All @@ -101,6 +118,11 @@ class SPIClass {
void beginSlave();
void end(void);

#ifdef ARDUINO_NRF52_PRIMO_CORE
void begin(int uc_pinMISO, int uc_pinMOSI, int uc_pinSCK);
void beginSlave(int uc_pinMISO, int uc_pinMOSI, int uc_pinSCK);
#endif

void setBitOrder(BitOrder order);
void setDataMode(uint8_t uc_mode);
void setClockDivider(uint16_t uc_div);
Expand All @@ -119,4 +141,4 @@ class SPIClass {

extern SPIClass SPI;

#endif
#endif //_SPI_H_INCLUDED
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,8 @@
// inslude the SPI library:
#include <SPI.h>


// set pin 10 as the slave select for the digital pot:
const int slaveSelectPin = 10;
// set pin 7 as the slave select for the digital pot:
const int slaveSelectPin = 7;

void setup() {
// set the slaveSelectPin as an output:
Expand Down
Loading