Wer die UART vom STM32F4 als LIN-Bus (Slave) benutzen will, kann diese Library hier benutzen. (es gibt noch eine andere Library für den Master-Mode)
Der LIN-Bus ist eine Eindrahtverbindung mit einem Master und bis zu 16 Slaves.
Für die Hardware wird ein Lin-Transceiver IC benötigt. Ich habe ein MAX13020 benutzt (hier ein Dank an Armin für die ICs und Sockel)
Zur Software :
Der Slave muss die Funktion “UB_LIN_checkID” pollen um zu erkennen ob ein LIN-Frame vom Master gesendet wurde. Mit der empfangenen ID muss entschieden werden ob der Slave Daten senden/empfangen muss oder ob ihn die ID nicht betrifft.
Bilder :
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, UART, MISC Benutzte Librarys : keine |
Enumerationen :
1 2 3 4 5 6 7 | typedef enum { LIN_OK = 0, // kein Fehler LIN_WRONG_LEN, // falsche Datenanzahl LIN_RX_EMPTY, // kein Frame empfangen LIN_WRONG_CRC, // Checksumme falsch LIN_NO_ID // es wurde keine ID empfangen }LIN_ERR_t; |
Funktionen :
1 2 3 4 | void UB_LIN_Slave_Init(void); // zum init der CPU als LIN-Slave LIN_ERR_t UB_LIN_checkID(LIN_FRAME_t *frame); // check ob LIN-ID empfangen wurde LIN_ERR_t UB_LIN_SendData(LIN_FRAME_t *frame); // zum senden von LIN-Daten LIN_ERR_t UB_LIN_ReceiveData(LIN_FRAME_t *frame); // zum empfangen von LIN-Daten |
Beispiel :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | //-------------------------------------------------------------- // File : main.c // Datum : 11.04.2014 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der LIN-Slave Library // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_lin_slave.h" #include "stm32_ub_led.h" int main(void) { LIN_FRAME_t myFrame; LIN_ERR_t check; SystemInit(); // Quarz Einstellungen aktivieren // init der LEDs UB_Led_Init(); // init der UART als LIN-Slave UB_LIN_Slave_Init(); while(1) { // check ob ID per LIN empfangen check=UB_LIN_checkID(&myFrame); if(check==LIN_OK) { UB_Led_Toggle(LED_ORANGE); if(myFrame.frame_id==0x01) { //--------------------------------------- // 2Bytes per LIN vom Master empfangen //--------------------------------------- myFrame.data_len=2; check=UB_LIN_ReceiveData(&myFrame); if(check==LIN_OK) { // Daten pruefen if((myFrame.data[0]==0xA1) && (myFrame.data[1]==0xB2)) { UB_Led_Toggle(LED_GREEN); } else { UB_Led_Toggle(LED_RED); } } } else if(myFrame.frame_id==0x02) { //--------------------------------------- // 1Byte per LIN zum Master senden //--------------------------------------- myFrame.data_len=1; myFrame.data[0]=0xF9; check=UB_LIN_SendData(&myFrame); if(check==LIN_OK) UB_Led_Toggle(LED_BLUE); } } } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :