Mise en œuvre de la communication avec l’I²C¶
Une fois le protocole de communication de l'I²C étudié, il nous faut l'adapter pour notre microcontrôleur tout en tenant compte de la portabilité de notre code. En effet, le microcontrôleur de test étant différent de celui destiné à l'utilisation finale, nous devons tenir compte des différences entre les deux outils. Pour cela, nous disposons d'une bibliothèque de fonction prête à l'emploi fournie avec le microcontrôleur. Le principal avantage de cette bibliothèque est, en plus d’être adaptée pour nos deux dispositifs, sa facilité d'utilisation et de compréhension grâce à une documentation claire et explicite et à une définition de tous les ports présents sur les microcontrôleurs. Le problème de compatibilité au niveau du code ne se posant plus nous pouvons donc passer à l'explication détaillée des fonctions utilisées dans notre programme.
En ce qui concerne la lecture des données venant de l’accéléromètre, nous avons dû mettre en place un système d’interruption afin de lire les informations suivant une période donnée. Des fonctions spécifiques à la communication via ce port sont disponibles dans la bibliothèque. Nous vous proposons d'étudier celles que nous avons utilisées plus en détail.
Comme dit précédemment, nous utilisons une interruption pour lire sur le port I²C. Cela nécessite, dans un premier temps, de créer cette interruption par l'intermédiaire d'une fonction fournie par le constructeur. En voici sa déclaration ainsi que sa description :
bool R_CMT_Create (
uint8_t data1,
uint16_t data2,
float data3,
void* func,
uint8_t data4
);
Arguments:
data1 est le timer associé à cette interruption.
data2 représente des options de configuration fournies dans la bibliothèque.
data3 est la fréquence d'interruption.
func est la fonction d’interruption appelé.
data4 est la priorité d'interruption de la fonction func.
La valeur de retour de cette fonction est un booléen confirmant ou non la création de l'interruption.
Une fois l'interruption initialisée, il nous faut maintenant créer la fonction associée. Dans notre cas, le rôle de l'interruption sera de lire les données sur un registre précis de l’accéléromètre via le port I²C. Cependant, avant de pouvoir lire sur le port, il est nécessaire d'initialiser ce dernier. Une nouvelle fonction de la bibliothèque est disponible pour ceci :
bool R_IIC_Create (
uint8_t data1,
uint32_t data2,
uint32_t data3,
uint16_t data4,
uint16_t data5,
uint16_t data6,
uint32_t data7
)
Arguments :
data1 est le canal I²C utilisé, les microcontrôleurs de type Renesas en disposant de deux par défaut.
data2 représente des options de configuration par rapport au channel. (Gestion d'un timeout par exemple)
data3 sont des options de configuration en rapport avec le principe de communication (non acquittement, activation ou désactivation de détection d'esclaves …)
data4 et data5 sont des adresses d'esclave.
data6 est le taux maximum de transfert des informations en bytes par secondes.
data7 est l'ajustement du taux de transfert. Ces valeurs sont obtenues suivant un tableau fourni dans la documentation des fonctions de la bibliothèque du constructeur.
La valeur de retour de cette fonction est un booléen de contrôle traduisant la réussite ou l’échec de la fonction.
Maintenant que tout est initialisé correctement, nous devons lire par l'intermédiaire de l'I²C. Nous utilisons pour cela une dernière fonction de la bibliothèque permettant la lecture en respectant le protocole suivant les options renseignées durant l'initialisation. Cette fonction est située dans notre fonction d’interruption et sera appelée périodiquement suivant son initialisation.
Bool R_IIC_MasterSend(
uint8_t data1,
uint16_t data2,
uint16_t data3,
uint8_t* data4,
uint16_t data5,
void* func,
uint8_t data6
)
Arguments :
data1 est le canal I²C utilisé.
data2 représente des options de configuration pour la lecture.
data3 est l'adresse de l'esclave sur lequel on souhaite lire.
data4 est l'adresse du registre auquel on souhaite avoir accès.
data5 est la taille de l’information reçue.
func est une fonction d'interruption pouvant être appelée une fois la lecture terminée.
data6 est la priorité de la fonction func.
Comme toujours, cette fonction renvoie un booléen confirmant la réussite de la fonction utilisée.
Ainsi, nous venons de voir l'application de la réception des informations via l'I²C tout en ayant résolu les problèmes de portabilité dus à la différence entre le dispositif de test et celui utilisé par le client grâce à une bibliothèque constructeur générique et simple. La prochaine étape sera de traiter les différentes informations obtenues avant de les restituer afin de les rendre exploitables par l'IHM.
Nous avons donc vu dans cette partie l'acquisition des données grâce aux différents capteurs, biologiques et de mouvement, ainsi que l'initialisation du port I2C afin d'être capable de communiquer avec la carte décrite ci-dessus.
Mis à jour par Anonyme il y a environ 12 ans · 2 révisions