LIN-Master-Bibliothek

Gast #1741309
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?).
Gast #1741828
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.
#1742713
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.