Forum: Mikrocontroller und Digitale Elektronik LIN-Master-Bibliothek


von Fabian (Gast)


Lesenswert?

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?).

von Frederik K. (n0ll4k)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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.

von Frederik K. (n0ll4k)


Lesenswert?

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
Noch kein Account? Hier anmelden.