Logo Robotech Nancy Wiki Robotech Nancy

Pour importer la librairie CAN dans un projet STM32, il faut :

Pour mettre à jour la librairie, git pull dans le dossier cloné.

Configuration du bus

La configuration du bus se fait dans le fichier ioc du projet STM32 :

Les pins CAN1_RX et CAN1_TX sont configurées automatiquement (ici, PA11 et PA12). Pour le baudrate, il est automatiquement calculé en fonction des paramètres dans Bit Timings Parameters. Ici, 22727 bit/s.

Initialisation

La fonction CAN_AWAKENING permet d'attribuer une adresse et d'initialiser le bus CAN :

/* USER CODE BEGIN 2 */
CANBUS_AWAKENING(&hcan1, CANBUS_ODOMETRIE);
/* USER CODE END 2 */

Il faut placer cette fonction dans le main avant la boucle infinie et dans une section USER CODE pour ne pas qu'elle soit écrasée lors de la génération

Envoyer des données

La fonction CAN_YEET permet d'envoyer des données sur le bus CAN, par exemple :

uint8_t data[1] = { 0x01 };

HAL_StatusTypeDef status = CAN_YEET(
    &hcan1,                  // Structure créée par CubeMX pour gérer le bus CAN
    CANBUS_PRIO_STD,         // Priorité du message
    CAN_ADDR_RASPBERRY,      // Adresse du destinataire
    FCT_ACCUSER_RECEPTION,   // Fonction à appeler sur le destinataire
    1,                       // Identifiant de la trame applicative
    false,                   // Demande => false
    data,                    // Données à envoyer 
    1                        // Taille des données
);

if (status != HAL_OK) {
    // Erreur dans l'envoi
}

Recevoir des données

Pour recevoir des données, il faut créer la fonction HAL_CAN_RxFifo0MsgPendingCallback qui sera automatiquement appelée à chaque trame reçue et utiliser CAN_YOINK pour récupérer les données :

void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan) {
    can_frame_t frame;
    if (CAN_YOINK(&hcan1, &frame) != HAL_OK) {
        // Erreur dans la réception
    }

    // Utiliser frame
}