Arduino_Apollo3
Arduino_Apollo3 copied to clipboard
Serial1 does not work on Artemis Nano
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