Arduino_Apollo3 icon indicating copy to clipboard operation
Arduino_Apollo3 copied to clipboard

Serial1 does not work on Artemis Nano

Open paulvha opened this issue 1 year ago • 0 comments

Problem description On an Artemis Nano the Serial1 and Serial do not work independent. They are ONE and the same.

  • Changing the speed on Serial1 also changes the speed on Serial. Also the other way round.
  • Data that is mended for Serial, is also send to Serial1.
  • Data that is mended for Serial1 is also send to Serial.

As A result the SERIAL1 CAN NOT BE USED ON AN ARTEMIS NANO Also see topic https://forum.sparkfun.com/viewtopic.php?f=169&t=58621

Root cause An Apollo3 chip has 2 uarts : UART0 and UART1. When a Serial instance is created ( in serial_api.c/ serial_init() ) based on the provided TX and RX pads, a lookup is performed to decide which UART to use. The lookup table is in PeripheralPins.c, part of the Mbed TARGET_Ambiq_Micro.

First, the Serial-instance is created (TX = 48 / RX= 49) and based on the lookup UART0 is assigned. Then the Serial1-instance is created (TX=39, RX =40), but now DUE TO AN ERROR IN THE LOOKUP TABLE, it is ALSO assigned to UART0. As a result BOTH Serial and Serial1 are assigned to UART0.

This ONLY happens on an Artemis Nano as that is using (TX=39, RX =40). The other boards with a Serial1 are using (TX=24, RX =25), which in the table can only be assigned to UART1

Solution

In the same lookup table (PeripheralPins.c) there are already entries to assign (TX=39, RX =40) to UART1. So by commenting out the lines in the TX and RX table for UART0.

	//{AP3_PER_UART0_TX_39, UART_0, (uint32_t)&g_AP3_PER_UART0_TX_39},
        //{AP3_PER_UART0_RX_40, UART_0, (uint32_t)&g_AP3_PER_UART0_RX_40},

Serial1 is now assigned to UART1 and then works as expected. Tested with a simple sketch, where I connected Putty on 9600 to Serial1 and used the Arduino IDE monitor on 115200.


void setup() {
  Serial.begin(115200);
  Serial1.begin(9600);
  delay(1000); // wait for UART to settle
}

void loop() {
  while(Serial.available()){
    Serial1.write(Serial.read());
  }

  while(Serial1.available()){
    Serial.write(Serial1.read());
  }
}

The challenge As the lookup table in PeripheralPins.c as part of the mbed pre-compiled archive a new archive needs to be created for the Artemis NANO. I have done that (based on 2.2.1) and have added that as a zip-file +instructions in the forum (https://forum.sparkfun.com/viewtopic.php?f=169&t=58621)

Edit: this is NOT a problem in V1.2.3 as there the UART to use is provided with the first parameter : Uart Serial1(1, 10, 9);

regards, Paulvha

paulvha avatar Nov 23 '22 13:11 paulvha