Hallo, ich bin auf der Suche nach einer Bibliothek, mit der ich einen LIN-Master mit einem Xmega / ATmega realisieren kann. Umgesetzt werden soll das ganze im AVR-Studio. Von Atmel gibts da ja 2 AN's, allerdings gehen die nur auf nen LIN-Slave oder auf Prozessoren, die auch die LIN-Unterstützung haben, ein. Auch klar ist, dass es mit jedem normalen UART funktionieren sollte (in Kombination mit einem geeigneten Treiber-IC), allerdings will ich das Rad hier nicht neu erfinden. Falls jemand sowas schon ma gemacht hat, wäre es toll, wenn er mir das zukommen lassen könnte. Alternativ könnte man auch über einen externen IC nachdenken, der diese Funktionalität übernimmt und z.B. über SPI angesprochen wird (gibt es sowas überhaupt?).
Also in der AVR322 ist das mit dem Master beschrieben und man kann auch Source Code dazu bekommen. Hab zwar bisher nur nen LIN Slave programmiert, aber mit der AppNote war das recht simpel. Vorrausgesetzt du hast passende Hardware zum testen da.
Habe sowas mal mit einem Arduino (also ATmega168) gemacht, war aber nur für einen Slave und ohne Schedule Table. Sah dann so aus:
1 | //#define LIN13 // for classic checksum
|
2 | #define LIN20 // for enhanced checksum
|
3 | |
4 | #define baudrate 19200
|
5 | //#define baudrate 9600
|
6 | //#define baudrate 4800
|
7 | |
8 | void txLINframe(byte nodeID, byte num, byte data[]){ |
9 | byte P0, P1, IDfield; |
10 | int checksum = 0; |
11 | P0 = ((nodeID>>0) + (nodeID>>1) + (nodeID>>2) + (nodeID>>4)) & 1; |
12 | P1 = (~((nodeID>>1) + (nodeID>>3) + (nodeID>>4) + (nodeID>>5))) & 1; |
13 | IDfield = nodeID & 0x3F | P0<<6 | P1<<7; |
14 | // sync break (13 bit lengths zero)
|
15 | UCSR0B &= ~(1<<TXEN0); // disable UART |
16 | digitalWrite(1, LOW); // output low for 13 bit times (minimum) |
17 | delayMicroseconds(13*1e6/baudrate); |
18 | digitalWrite(1, HIGH); |
19 | delayMicroseconds(1e6/baudrate); // sync delimiter (1 to 4 bits) |
20 | UCSR0B |= 1<<TXEN0; // enable UART |
21 | |
22 | // sync field (0x55)
|
23 | Serial.print(0x55, BYTE); |
24 | |
25 | // ident field (ID0:5, P0:1)
|
26 | Serial.print(IDfield, BYTE); |
27 | |
28 | #ifdef LIN20
|
29 | // LIN 2.0 includes ID field in checksum calculation
|
30 | // identifiers 60 (0x3c) to 63 (0x3f) shall always use classic checksum.
|
31 | if(nodeID < 60) { |
32 | checksum = IDfield; |
33 | }
|
34 | #endif
|
35 | |
36 | for(byte i=0; i<num; i++) { |
37 | Serial.print(data[i], BYTE); |
38 | checksum += byte(data[i]); // convert to unsigned number |
39 | if(checksum > 255) { |
40 | checksum -= 255; |
41 | }
|
42 | }
|
43 | checksum = ~checksum; |
44 | |
45 | // send checksum
|
46 | Serial.print(byte(checksum), BYTE); |
47 | }
|
UART muss natürlich noch initialisiert werden.
Also Slave Code mit verarbeitung einer Schedule Table hab ich auch noch rumfliegen. Ist aber auch echt nicht schwer. Einzige Problem war bei mir damals erst die Erkennung des Sync Feldes aber das hab ich dann dank Atmel AppNote einfach mit einer verringerung der Baudrate erreicht. Für den Master gilt ja das selbe. Umgesetzt wurde das ganze damals auf einem ATMega 168 bzw ATA22XX, Name fällt mir grad nicht mehr ein aber der Chip hatte LIN Transceiver und 5V Spannungsversorgung mit an Board, da gibts auch son kleines Eval Board von Atmel von.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.