Use i2c for UART (Sercom)

Hi,
I need to use i2c pin as a UART. I used the following code but the problem was not solved.

#include “wiring_private.h” 

Uart Serial3(&sercom2, PIN_WIRE_SCL, PIN_WIRE_SDA, SERCOM_RX_PAD_1, UART_TX_PAD_0);

void setup(){
  Serial3.begin(9600);
  pinPeripheral(PIN_WIRE_SCL, PIO_SERCOM_ALT);
  pinPeripheral(PIN_WIRE_SDA, PIO_SERCOM_ALT);
}

void loop(){
}

void SERCOM2_Handler(void) {
Serial3.IrqHandler();
}

Of course, this is a summary of the my code.

Hi, blizzard
Maybe you need
#include “wiring_private.h” // pinPeripheral() function

1 Like

Thankful @msfujino
I know but I forgot, added it too, but after uploading, the device Into bootloader mode.

Blizzard,
For my XIAO, the code below works fine. Your problem may be another cause.

#include "wiring_private.h" // pinPeripheral() function
// A5(SCL SERCOM2 ALT PAD1)--->RX
// A4(SDA SERCOM2 ALT PAD0)--->TX 

Uart Serial3(&sercom2, PIN_WIRE_SCL, PIN_WIRE_SDA, SERCOM_RX_PAD_1, UART_TX_PAD_0);

void setup(){ 
  SerialUSB.begin(9600);
  while(!SerialUSB) {}
      
  Serial3.begin(9600);
  pinPeripheral(PIN_WIRE_SCL, PIO_SERCOM_ALT);
  pinPeripheral(PIN_WIRE_SDA, PIO_SERCOM_ALT);
  while(!Serial3) {}
  
  Serial3.println("HELLO form SerialUSB");
}

void loop(){
  if(Serial3.available()>0) {
    SerialUSB.write(Serial3.read());
  }
  
  if(SerialUSB.available()>0) {
    Serial3.write(SerialUSB.read());
  } 
}

void SERCOM2_Handler()
{
  Serial3.IrqHandler();
}
1 Like