ATSAM3X8E abilitare USART

Buonasera a tutti,
ultimamente sto lavorando con un prototipo di scheda custom realizzata da me.
Fino ad ora tutto ok, sono riuscito a far funzionare correttamente le uscite digitali, far comunicare correttamente la MCU con una SD card con interfaccia SPI, a visualizzare dati su display LCD HD44780 con expander I2C e a far funzionare l'RTC.

Purtroppo da qualche giorno sono incappato in un grosso problema con l'utilizzo della USART.
Premetto che la USART0 (TX1 e RX1) viene utilizzata per comunicare con un modulo LoRa Ebyte E220 LLCC68. Ho provato ad inizializzare la seriale tramite il comando apposito "Serial1.begin(9600);" e a comunicare tramite "while(Serial1.available()){ ... }" ma purtroppo non funziona niente, ciò che scrivo da un Arduino MKR WiFi 1010 connesso ad un altro modulo LoRa non viene recepito dal ATSAM3X8E della mia scheda custom.

I moduli LoRa sono correttamente impostati dato che su altre schede funzionano, ho provato anche con il modulo che sto cercando di far funzionare proprio sulla mia scheda custom e funziona su altre schede (ho provato con Arduino NANO ed un Arduino MKR WiFi 1010).

Su internet ho letto che bisogna abilitare i pin USART e modificare del codice nella libreria variant.h ma purtroppo non è una cosa così scontata e poi non riesco a capire come mai su una scheda Arduino Due non bisogna eseguire questi passaggi.

Qua il codice così potete vederlo e dirmi se qualcosa non va:

#include <Arduino.h>
#include <Wire.h>
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h>
#include "variant.h"

const int8_t M0 = 41;    //pin M0 modulo LoRa
const int8_t M1 = 40;    //pin M1 modulo LoRa
const int8_t LORA_POWER= 47;    //accensione controllata modulo LoRa

const int LCD_COLS = 20;
const int LCD_ROWS = 4;

hd44780_I2Cexp lcd(0x20);
String msg_in = "";

void setup() {
  pinMode(47, OUTPUT);
  pinMode(41, OUTPUT);
  pinMode(40, OUTPUT);

  delay(1000);

// controllo alimentazione e programmazione modulo LoRa da MCU
  digitalWrite(41, LOW);
  digitalWrite(40, LOW);
  delay(1000);
  digitalWrite(LORA_POWER, HIGH);
  
  Serial1.begin(9600);
  while(!Serial1){}
  
  int status = lcd.begin(LCD_COLS, LCD_ROWS);
  if(status){ hd44780::fatalError(status); }

  lcd.setCursor(0, 0);
  lcd.print("ok");
}

void loop() {
  while(Serial1.available()){
    char char_in = Serial1.read();
    if(char_in != '\n' && char_in != '\r'){
      msg_in += char_in;
    }else{
      lcd.setCursor(0, 2);
      lcd.print(msg_in);
    }
  }
}

La scheda viene programmata tramite Atmel-ICE con interfaccia JTAG e software Atmel Studio 7.

Spero che qualcuno mi possa dare una mano. Ringrazio tutti anticipatamente!!

  1. Sicuro che USART0 non sia Serial invece di Serial1 ?
  2. qui mi pare danno dei suggerimenti (per atmel studio 6)
    "UART Arduino Due SAM3X8E"

Salve, prima di tutto ti ringrazio per l'attenzione.
Ho controllato sia sul web che sullo schematico di Arduino Due e la USART 0 corrisponde ai pin Tx1 ed Rx1.
Purtroppo quel thread che mi hai linkato lo avevo già visto ma, confrontandolo con altri thread simili, non mi pare ci sia chiarezza sull'argomento.
Stamattina ho provato a scrivere il codice mostrato in questo video: Asynchronous UART / USART Serial Communications on Atmel SAM D21 Xplained Pro - Tutorial - YouTube

Nel video viene mostrata la procedura per un SAMD21, ma non penso che su ATSAM3X8E sia diverso, stasera provo il codice, in caso faccio sapere se funziona oppure no.

Ma scusate, se parliamo di Arduino DUE, il core gestisce 4 porte seriali ...

Serial: 0 (RX) and 1 (TX)
Serial 1: 19 (RX) and 18 (TX)
Serial 2: 17 (RX) and 16 (TX)
Serial 3: 15 (RX) and 14 (TX)
Used to receive (RX) and transmit (TX) TTL serial data (with 3.3 V level). Pins 0 and 1 are
connected to the corresponding pins of the ATmega16U2 USB-to-TTL Serial chip.

... cosa mi sfugge ? :thinking:

Guglielmo

Buonasera @gpb01, prima di tutto ti ringrazio per il tuo interesse.
Purtroppo, nel mio caso, non si tratta di un vero Arduino Due ma di una mia scheda custom basata sul medesimo MCU.

Il problema è che non riesco a far lavorare le seriali, ed in particolare mi interessa far funzionare la USART0 (Serial1, con pin Tx1 ed Rx1). Con lo schema che mi hai inviato, mi viene il dubbio che la MCU debba essere programmata per gestire i pin tramite l'interrupt handler (USART0.handler() ) e, se non settata correttamente, la MCU riconosca i pin come semplici I/O digitali.

Ho già letto qualcosa ma non sono ancora venuto a capo di che cosa esattamente si debba fare per settare i registri USART.

Qualche settimana fa, ho creato un thread "SAM3X8E problema uscite":
https://forum.arduino.cc/t/sam3x8e-problema-uscite/1026551

In cui ho risolto settando i registri I/O come nella procedura che ho mostrato.
Con quel metodo sono riuscito a far funzionare tutto (SPI, I2C e pin digitali) ma ancora non capisco come mai la USART non funzioni.

Scusa, mi sembri piuttosto un utente esperto ... prendi i sorgenti del "core" Arduino per Arduino DUE e ... guarda come fanno loro :wink:

Guglielmo

Grazie mille @gpb01, in questi giorni provo a lavorarci sopra, aggiorno tutti il prima possibile e, in caso in cui riesca a trovare la soluzione, la pubblicherò su questo thread.

Buonasera, purtroppo ad ora non sono riuscito ad abilitare la USART.
Mi sono accorto che la seriale viene inizializzata ed il comando Serial1.begin(9600); viene letto ed eseguito con successo ma nulla accade.

Ho provato con una scheda Arduino Due originale, stessa impostazione hardware e funziona tutto perfettamente, non riesco veramente a capire dove sia il problema.

Il discorso sui registri mi pare un po' strano, perché sia comunicazione I2C che SPI (come tutti i pin digitali) funzionano correttamente con i comandi di Arduino e non ho dovuto toccare alcun registro ne libreria.

Ho anche ricontrollato l'hardware e sembra davvero essere tutto ok.

Non mi capacito di come funzioni tutto in maniera perfetta tramite le librerie ed i comandi Arduino mentre la USART non ne vuole assolutamente sentir parlare....

Chiedo aiuto perché di questo argomento sembrerebbe che nessuno ne parli.

Risolto... dopo giorni passati a cercare di capire cosa non potesse funzionare nel software mi sono reso conto che il problema era hardware...
Di fatto avevo scambiato i pin Rx con Tx, ed essendo piste molto molto piccole (0.25mm), non ci avevo fatto caso :sweat_smile:.
Alla disperazione, sono ricorso all'uso di un multimetro e, purtroppo, ho verificato che i collegamenti hardware erano sbagliati.

Questo insegna quanto è importante l'attenzione sull' hardware che stiamo cercando di utilizzare.

Mi scuso per aver creato il thread un po' inutilmente ma ero convinto che il problema fosse software.

Ringrazio tutti per il vostro interesse.

Fortunatamente vedo che hai risolto ... :slight_smile:

Per il futuro considera però che hai scelto una MCU ... morta e sepolta ... era già obsoleta quando usci la DUE, figurati oggi ... anche per questo siamo potuti essere di poco aiuto ... :roll_eyes:

Se devi fare nuovi progetti ... dai retta, cerca di utilizzare qualche cosa di nuovo :wink:

Guglielmo

Buongiorno @gpb01, grazie per i tuoi consigli.
Il progetto ha avuto inizio sulla base dell' ATmega 2560 che già conoscevo abbastanza bene.

Purtroppo, per problemi di prezzi e disponibilità sul mercato ho dovuto cercare qualcosa che avesse un numero simile di I/O digitali ed analogiche ed avesse anche un certo numero di canali di comunicazione.

Avevo visto numerosi processori tra cui i ben conosciuti SAMD21 su cui si basano le moderne schede Arduino ma ho dovuto scartare quei modelli poiché le mie esigenze richiedono una scheda logica che possa essere montata su diversi circuiti e che si possa adattare in maniera elastica a qualsiasi tipo di progetto.
Ho quindi bisogno di un MCU con moltissimi I/O in modo da poter garantire l'applicabilità anche a tutti i progetti futuri e il primo che ho visto è stato proprio ATSAM3X8E su cui si basa anche la scheda Arduino Due senza però valutare il fatto che ci sia molta meno attenzione sui vari forum rispetto alle controparti più moderne.

Ti ringrazio molto per il consiglio che terrò sicuramente in considerazione per i prossimi progetti.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.