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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren