Hi @GabrielNotman
I followed your suggestions, I only changed the variant.h and variant.cpp where I added the new I2C , my files are these
variant.h
#ifndef _VARIANT_SODAQ_ONE_
#define _VARIANT_SODAQ_ONE_
// The definitions here needs a SAMD core >=1.6.3
#define ARDUINO_SAMD_VARIANT_COMPLIANCE 10603
/*----------------------------------------------------------------------------
* Definitions
*----------------------------------------------------------------------------*/
/** Frequency of the board main oscillator */
#define VARIANT_MAINOSC (32768ul)
/** Master clock frequency */
#define VARIANT_MCK (48000000ul)
/*----------------------------------------------------------------------------
* Headers
*----------------------------------------------------------------------------*/
#include "WVariant.h"
#ifdef __cplusplus
#include "SERCOM.h"
#include "Uart.h"
#endif // __cplusplus
#ifdef __cplusplus
extern "C"
{
#endif // __cplusplus
/*----------------------------------------------------------------------------
* Pins
*----------------------------------------------------------------------------*/
// Number of pins defined in PinDescription array
#ifdef SECOND_I2C
#define PINS_COUNT (51u)
#define NUM_DIGITAL_PINS (12u) // Without the "other" Digital Pins
#define NUM_ANALOG_INPUTS (12u) // Without the "other" Analog Pins
#else
#define PINS_COUNT (49u)
#define NUM_DIGITAL_PINS (12u) // Without the "other" Digital Pins
#define NUM_ANALOG_INPUTS (12u) // Without the "other" Analog Pins
#endif
#define NUM_ANALOG_OUTPUTS (1u)
#define digitalPinToPort(P) ( &(PORT->Group[g_APinDescription[P].ulPort]) )
#define digitalPinToBitMask(P) ( 1 << g_APinDescription[P].ulPin )
//#define analogInPinToBit(P) ( )
#define portOutputRegister(port) ( &(port->OUT.reg) )
#define portInputRegister(port) ( &(port->IN.reg) )
#define portModeRegister(port) ( &(port->DIR.reg) )
#define digitalPinHasPWM(P) ( g_APinDescription[P].ulPWMChannel != NOT_ON_PWM || g_APinDescription[P].ulTCChannel != NOT_ON_TIMER )
/*
* digitalPinToTimer(..) is AVR-specific and is not defined for SAMD
* architecture. If you need to check if a pin supports PWM you must
* use digitalPinHasPWM(..).
*
* https://github.com/arduino/Arduino/issues/1833
*/
// #define digitalPinToTimer(P)
// Interrupts
#define digitalPinToInterrupt(P) ( g_APinDescription[P].ulExtInt )
// LEDs
#define PIN_LED_RED (14u)
#define PIN_LED_GREEN (15u)
#define PIN_LED_BLUE (16u)
/*
* Analog pins
*/
#define PIN_A0 (22u)
#define PIN_A1 (PIN_A0 + 1)
#define PIN_A2 (PIN_A0 + 2)
#define PIN_A3 (PIN_A0 + 3)
#define PIN_A6 (PIN_A0 + 4)
#define PIN_A7 (PIN_A0 + 5)
#define PIN_A8 (PIN_A0 + 6)
#define PIN_A9 (PIN_A0 + 7)
#define PIN_A10 (PIN_A0 + 8)
#define PIN_A11 (PIN_A0 + 9)
#define PIN_A12 (PIN_A0 + 10)
#define PIN_A13 (PIN_A0 + 11)
static const uint8_t A0 = PIN_A0 ;
static const uint8_t A1 = PIN_A1 ;
static const uint8_t A2 = PIN_A2 ;
static const uint8_t A3 = PIN_A3 ;
static const uint8_t A6 = PIN_A6 ;
static const uint8_t A7 = PIN_A7 ;
static const uint8_t A8 = PIN_A8 ;
static const uint8_t A9 = PIN_A9 ;
static const uint8_t A10 = PIN_A10;
static const uint8_t A11 = PIN_A11;
static const uint8_t A12 = PIN_A12;
static const uint8_t A13 = PIN_A13;
#define ADC_RESOLUTION 12
/*
* Serial interfaces
*/
// Serial
#define PIN_SERIAL_RX (39u)
#define PIN_SERIAL_TX (40u)
#define PAD_SERIAL_TX (UART_TX_PAD_0)
#define PAD_SERIAL_RX (SERCOM_RX_PAD_1)
// Serial1
#define PIN_SERIAL1_RX (41u)
#define PIN_SERIAL1_TX (42u)
#define PAD_SERIAL1_TX (UART_TX_PAD_0)
#define PAD_SERIAL1_RX (SERCOM_RX_PAD_1)
// Other Digital Pins
static const uint8_t LED_RED = PIN_LED_RED;
static const uint8_t LED_GREEN = PIN_LED_GREEN;
static const uint8_t LED_BLUE = PIN_LED_BLUE;
static const uint8_t GPS_TIMEPULSE = (17u);
static const uint8_t GPS_ENABLE = (18u);
static const uint8_t BUTTON = (19u);
static const uint8_t ACCEL_INT1 = (4u);
static const uint8_t ACCEL_INT2 = (5u);
static const uint8_t ENABLE_PIN_IO = (20u);
static const uint8_t SWITCH_SENSE = (21u);
// Other Analog Pins
static const uint8_t DAC0 = PIN_A0; // or (24u) implications for cores/arduino/wiring_analog.c analogWrite()
static const uint8_t AREF = (35u);
static const uint8_t BAT_VOLT = (36u);
/*
* SPI Interfaces
*/
#define SPI_INTERFACES_COUNT 1
#define PIN_SPI_MISO (43u)
#define PIN_SPI_SS (44u)
#define PIN_SPI_MOSI (45u)
#define PIN_SPI_SCK (46u)
#define PERIPH_SPI sercom0
#define PAD_SPI_TX SPI_PAD_2_SCK_3
#define PAD_SPI_RX SERCOM_RX_PAD_0
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SS = PIN_SPI_SS ;
static const uint8_t MOSI = PIN_SPI_MOSI ;
static const uint8_t SCK = PIN_SPI_SCK ;
/*
* Wire Interfaces
*/
#ifdef SECOND_I2C
#define WIRE_INTERFACES_COUNT 2
#define PIN_WIRE_SDA (47u)
#define PIN_WIRE_SCL (48u)
#define PERIPH_WIRE sercom3
#define WIRE_IT_HANDLER SERCOM3_Handler
#define PIN_WIRE1_SDA (49u)
#define PIN_WIRE1_SCL (50u)
#define PERIPH_WIRE1 sercom0
#define WIRE1_IT_HANDLER SERCOM0_Handler
#define WIRE_INTERFACES_COUNT 2
#else
#define WIRE_INTERFACES_COUNT 1
#define PIN_WIRE_SDA (47u)
#define PIN_WIRE_SCL (48u)
#define PERIPH_WIRE sercom3
#define WIRE_IT_HANDLER SERCOM3_Handler
#endif
/*
* USB
*/
#define PIN_USB_DM (38ul)
#define PIN_USB_DP (39ul)
#ifdef __cplusplus
}
#endif
/*----------------------------------------------------------------------------
* Arduino objects - C++ only
*----------------------------------------------------------------------------*/
#ifdef __cplusplus
/* =========================
* ===== SERCOM DEFINITION
* =========================
*/
extern SERCOM sercom0;
extern SERCOM sercom1;
extern SERCOM sercom2;
extern SERCOM sercom3;
extern SERCOM sercom4;
extern SERCOM sercom5;
extern Uart Serial;
extern Uart Serial1;
#endif
// These serial port names are intended to allow libraries and architecture-neutral
// sketches to automatically default to the correct port name for a particular type
// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN,
// the first hardware serial port whose RX/TX pins are not dedicated to another use.
//
// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor
//
// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial
//
// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library
//
// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins.
//
// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX
// pins are NOT connected to anything by default.
#define SERIAL_PORT_USBVIRTUAL SerialUSB
#define SERIAL_PORT_MONITOR SerialUSB
// Serial has no physical pins broken out, so it's not listed as HARDWARE port
#define SERIAL_PORT_HARDWARE Serial
#define SERIAL_PORT_HARDWARE_OPEN Serial
#define SERIAL_PORT_HARDWARE1 Serial1
#define SERIAL_PORT_HARDWARE_OPEN1 Serial1
#endif /* _VARIANT_SODAQ_ONE_ */
variant.cpp
#include "variant.h"
/*
* Pins descriptions
*/
const PinDescription g_APinDescription[]=
{
// 0..3 Main IO Pins (D0-D3) Digital Properties
{ PORTA, 2, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 },
{ PORTA, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 },
{ PORTB, 8, PIO_TIMER, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM4_CH0, TC4_CH0, EXTERNAL_INT_8 }, // TC4/WO[0]
{ PORTB, 9, PIO_TIMER, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM4_CH1, TC4_CH1, EXTERNAL_INT_9 }, // TC4/WO[1]
// 4..5 Other Digital Pins
{ PORTA, 21, PIO_INPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5 }, // ACCEL_INT1
{ PORTA, 20, PIO_INPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4 }, // ACCEL_INT2
// 6..13 Main IO Pins (D6-D13) Digital Properties
{ PORTA, 6, PIO_TIMER, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH0, TCC1_CH0, EXTERNAL_INT_6 }, // TCC1/WO[0]
{ PORTA, 7, PIO_TIMER, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM1_CH1, TCC1_CH1, EXTERNAL_INT_7 }, // TCC1/WO[1]
{ PORTA, 8, PIO_TIMER, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_NMI }, // TCC0/WO[0]
{ PORTA, 9, PIO_TIMER, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_9 }, // TCC0/WO[1]
{ PORTA, 10, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH2, TCC0_CH2, EXTERNAL_INT_10 }, // TCC0/WO[2]
{ PORTA, 11, PIO_TIMER_ALT, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER_ALT), No_ADC_Channel, PWM0_CH3, TCC0_CH3, EXTERNAL_INT_11 }, // TCC0/WO[3]
{ PORTB, 2, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 },
{ PORTB, 3, PIO_DIGITAL, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 },
// 14..21 Other Digital Pins
{ PORTA, 15, PIO_INPUT, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM3_CH1, TC3_CH1, EXTERNAL_INT_NONE }, // LED_RED
{ PORTB, 10, PIO_INPUT, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM5_CH0, TC5_CH0, EXTERNAL_INT_NONE }, // LED_GREEN
{ PORTB, 11, PIO_INPUT, (PIN_ATTR_DIGITAL | PIN_ATTR_PWM | PIN_ATTR_TIMER), No_ADC_Channel, PWM5_CH1, TC5_CH1, EXTERNAL_INT_NONE }, // LED_BLUE
{ PORTA, 14, PIO_INPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_14 }, // GPS_TIMEPULSE
{ PORTA, 18, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // GPS_ENABLE
{ PORTA, 16, PIO_INPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_0 }, // BUTTON
{ PORTB, 22, PIO_OUTPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // ENABLE_PIN_IO
{ PORTA, 17, PIO_INPUT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_1 }, // SWITCH_SENSE
// 22..33 Main IO Pins Analog Properties
{ PORTA, 2, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 },
{ PORTA, 3, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel1, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 },
{ PORTB, 8, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel2, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_8 },
{ PORTB, 9, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel3, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 },
{ PORTA, 6, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel6, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 },
{ PORTA, 7, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel7, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 },
{ PORTA, 8, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel16, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NMI },
{ PORTA, 9, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel17, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 },
{ PORTA, 10, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel18, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 },
{ PORTA, 11, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel19, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 },
{ PORTB, 2, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel10, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 },
{ PORTB, 3, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel11, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 },
// 34..36 Other Analog Pins
{ PORTA, 2, PIO_ANALOG, (PIN_ATTR_ANALOG), DAC_Channel0, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // DAC/VOUT
{ PORTA, 3, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel1, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // AREF
{ PORTA, 5, PIO_ANALOG, (PIN_ATTR_ANALOG), ADC_Channel5, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // BAT_VOLT
// 37..38 USB Pins
{ PORTA, 24, PIO_COM, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB_N
{ PORTA, 25, PIO_COM, (PIN_ATTR_NONE), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // USB_P
// 39..40 Serial
{ PORTB, 3, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_3 }, // SERIAL_RX
{ PORTB, 2, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_2 }, // SERIAL_TX
// 41..42 Serial1
{ PORTA, 13, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_13 }, // SERIAL1_RX
{ PORTA, 12, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_12 }, // SERIAL1_TX
// 43..46 SPI
{ PORTA, 8, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NMI }, // SPI_MISO
{ PORTA, 9, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 }, // SPI_SS
{ PORTA, 10, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 }, // SPI_MOSI
#ifdef ENABLE_BASE_SPI
{ PORTA, 7, PIO_SERCOM_ALT, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // SPI_SCK
#else
{ PORTA, 11, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 }, // SPI_SCK
#endif
// 47..48 I2C
{ PORTA, 22, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_6 }, // I2C_SDA
{ PORTA, 23, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_7 }, // I2C_SCL
#ifdef SECOND_I2C
// 49...50 SECOND I2C
{ PORTA, 8, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NMI }, //I2C_SCL
{ PORTA, 9, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_9 }, //I2C_SDA
#endif
} ;
const void* g_apTCInstances[TCC_INST_NUM+TC_INST_NUM]={ TCC0, TCC1, TCC2, TC3, TC4, TC5 } ;
// Multi-serial objects instantiation
SERCOM sercom0( SERCOM0 ) ; // SPI + Second I2C
SERCOM sercom1( SERCOM1 ) ;
SERCOM sercom2( SERCOM2 ) ; // Serial1
SERCOM sercom3( SERCOM3 ) ; // I2C
SERCOM sercom4( SERCOM4 ) ;
SERCOM sercom5( SERCOM5 ) ; // Serial
Uart Serial(&sercom5, PIN_SERIAL_RX, PIN_SERIAL_TX, PAD_SERIAL_RX, PAD_SERIAL_TX ) ;
Uart Serial1(&sercom2, PIN_SERIAL1_RX, PIN_SERIAL1_TX, PAD_SERIAL1_RX, PAD_SERIAL1_TX);
void SERCOM2_Handler()
{
Serial1.IrqHandler();
}
void SERCOM5_Handler()
{
Serial.IrqHandler();
}
And finanally to compile it, I have added the definition SECOND_I2C to the compiler in the boards.txt file for sodaq one
# SODAQ ONE
# ---------------------------------------
sodaq_one.name=SODAQ ONE
sodaq_one.vid.0=0x2341
sodaq_one.pid.0=0x804d
sodaq_one.vid.1=0x2341
sodaq_one.pid.1=0x004d
sodaq_one.upload.tool=bossac
sodaq_one.upload.protocol=sam-ba
sodaq_one.upload.maximum_size=262144
sodaq_one.upload.use_1200bps_touch=true
sodaq_one.upload.wait_for_upload_port=true
sodaq_one.upload.native_usb=true
sodaq_one.build.mcu=cortex-m0plus
sodaq_one.build.f_cpu=48000000L
sodaq_one.build.usb_product="SODAQ ONE"
sodaq_one.build.usb_manufacturer="SODAQ"
sodaq_one.build.board=SODAQ_ONE
sodaq_one.build.core=arduino
sodaq_one.build.extra_flags=-D__SAMD21G18A__ {build.usb_flags} -DSECOND_I2C
sodaq_one.build.ldscript=linker_scripts/gcc/flash_with_bootloader.ld
sodaq_one.build.openocdscript=openocd_scripts/sodaq_one.cfg
sodaq_one.build.variant=sodaq_one
sodaq_one.build.variant_system_lib=
sodaq_one.build.vid=0x2341
sodaq_one.build.pid=0x804d
sodaq_one.bootloader.tool=openocd
sodaq_one.bootloader.file=zero/samd21_sam_ba.bin
That’s it, where am I doing a mistake?
Thanks