//---------------------------------------------------------------------------------- // Titre : Librairie USART Asynchrone //---------------------------------------------------------------------------------- // Fonction : Header //---------------------------------------------------------------------------------- // Langage : C // Date : 16.01.2009 // Version : 1.0 // Auteur : Devtronic SARL //---------------------------------------------------------------------------------- //---------------------------------------------------------------------------------- #ifndef MYAVRUSART #define MYAVRUSART 1 // Définition taille max de la FIFO d'émission // Mettre 0 si vous ne souhaitez jamais utiliser le mode IT et donc éviter de gâcher de la mémoire #define TXBUFF_TAILLE_MAX 128 // Définition taille max de la FIFO de réception // Mettre 0 si vous ne souhaitez jamais utiliser le mode IT et donc éviter de gâcher de la mémoire #define RXBUFF_TAILLE_MAX 128 // Define utiles pour le codage // == Parité #define PARITE_SANS 0 #define PARITE_PAIRE 2 #define PARITE_IMPAIRE 3 // == Bits de stop #define STOP_BITS_1 0 #define STOP_BITS_2 1 // == Nombres de bits caractères #define DATA_5BITS 0 #define DATA_6BITS 1 #define DATA_7BITS 2 #define DATA_8BITS 3 // == Mode USART #define RX_SEUL 0 #define TX_SEUL 1 #define RX_ET_TX 2 #define MODE_POLLING 0 #define MODE_IT 4 // Valeurs Status #define TX_FIFO_OVERFLOW 2 #define TX_ERREUR_NBDONNEES 1 #define TX_OK 0 #define TX_EN_COURS 1 #define PAS_DE_TX 0 #define RX_OK 0 #define RX_ERREUR_NBDONNEES 1 #define RX_FIFO_VIDE 2 #define RX_EN_COURS 1 #define PAS_DE_RX 0 // Configuration de l'USART et lancement des IT si mode IT // valeur_ubrr : Valeur du registre de sélection du débit // Le calcul se fait avec la formule suivante : // valeur_ubrr = [Fréquence fonctionnement / (16 x Débit choisit)] - 1 // Assurez vous ensuite par le calcul inverse si cette valeur est la plus proche // ou si il est nécessaire de l'incrémenter/décrémenter pour avoir une meilleure précision. // Calcul inverse : // Débit = Fréquence de fonctionnement / [16 x (valeur_ubrr + 1)] // // Exemple à 20MHz : // valeur_ubrr = 9,85... // Si 9 : Débit = 125000 bauds // Si 10 : Débit = 113636 bauds // Il est donc préférable de prendre la valeur 10. // // parite : Choix parité sur le lien (PARITE_SANS, PARITE_PAIRE, PARITE_IMPAIRE) // bits_stop : Nombre de bits de stop (STOP_BITS_1,STOP_BITS_2) // data_nbbits : Nombre de bits des mots transmits (DATA_5BITS, DATA_6BITS, DATA_7BITS, DATA_8BITS). L'option 9bits n'est pas implémentée dans ce driver // mode : Mode de l'USART // - Choix émission/réception : RX_SEUL, TX_SEUL, RX_ET_TX // - Mode de fonctionnement du driver : MODE_POLLING (sortie de la fonction après réception/émission complête) ou MODE_IT (gestion émission par FIFO émission/réception et IT) void MYAVRUSART_init(unsigned int valeur_ubrr, unsigned char parite, unsigned char bits_stop, unsigned char data_nbbits, unsigned char mode); // Arrêt de l'UART et désactivation des IT void MYAVRUSART_arret(void); // Transmission de données par l'UART // donnees_tx : Pointeur sur tableau des données à émettre // nb_donnees : Nombre de données à émettre // En mode POLLING : Les données sont émises et la fonction sort après émission // En mode IT : Les données sont ajoutées dans la FIFO d'émission // Renvoie : TX_ERREUR_NBDONNEES si le paramètre nb_donnees est égal à 0, TX_OK si tout s'est bien passé // Dans le mode IT, elle renvoie TX_FIFO_OVERFLOW si le nombre de données voulant être envoyé fait dépasser la FIFO int MYAVRUSART_envoyer(unsigned char *donnees_tx, unsigned int nb_donnees); // Réception de données par l'UART // donnees_rx : Pointeur sur le tableau de stockage des données // nb_donnees : Nombre de données à recevoir // En mode POLLING : Les données sont attendues et la fonction sort après réception complête // En mode IT : Les données sont lues dans la FIFO de réception // Renvoie : RX_ERREUR_NBDONNEES si le paramètre nb_donnees est égal à 0, RX_OK si tout s'est bien passé // Dans le mode IT, elle renvoie RX_FIFO_vide si la FIFO est vide alors que le nombre de données voulant être envoyé n'est pas atteint int MYAVRUSART_recevoir(unsigned char *donnees_rx, unsigned int nb_donnees); // Indique si une émission est en cours // Renvoie : TX_EN_COURS si une émission est en cours, PAS_DE_TX sinon unsigned char MYAVRUSART_statusEmission(void); // Indique si des données sont disponibles // Renvoie : RX_EN_COURS si une émission est en cours, PAS_DE_RX sinon unsigned char MYAVRUSART_statusReception(void); #endif