HTW Dresden (FH)
FB ET
AT-Laboratorium

Projekt: 80c517-CAN-Treiber für CAN-Controller SAE81c90


System: Keil MCB517A (98)
Ankopplung: XDATA ab 0xf700 und CAN-INT am Port P3.2(INT0) im Level3
Ressourcen: CODE-Länge ca. 450Byte  und   RG3/DPSEL_7 für CAN-ISR genutzt.

Nutzerschnittstelle: Funktionsbibliothek
Funktionsumfang:

Initialisierung des CAN-Controllers  init_can
Konfiguration eines Nachrichtenobjektes def_mo
Schreibe Objektdaten    ld_modata
Lese Objektdaten    rd_modata
Sende ein Nachrichtenobjekt   send_mo
CAN-Interruptserviceroutine
Die Interruptserviceroutine ruft bei Datenempfang die Funktion user_dataaccess welche vom Anwender bezüglich des Empfangsdatenhandlings auszuprogrammieren ist.

Was ist zu beachten?  Die RG3 und DPSEL_7 dürfen im Anwendungsprogramm nicht genutzt werden.


Kurzüberblick zu den Funktionen

Initialisieren des CAN-Modules

Durch Aufrufparameter können vier Standard-Datenraten eingestellt werden.
Wie können weitere Baudraten eingestellt werden?
Durch Änderung der Ladewerte für die Register BL1,BL2 und BRP im Treiber.
Tool: 'Bit_timing_calculator' Cp_81c90 (Windows-Programm)
Durch Vorgabe der Osz.frequenz, der Baudrate und des Abtastpunktes wird die Belegung der Register berechnet.


Definition eines Messages Objektes

Ein CAN-Objekt ist gekennzeichnet durch:
1. Eine Objekt-Nummer (0...15)   Übergabe im Accu
2. die Datenlänge und die Senderichtung (DBIT) Übergabe in B
3. und einen 11bit-Identifier    Übergabe im DPTR.
Anmerkung:
Datenlänge 0...8 Byte
Senderichtungsbit (DBIT) ist b7 von B
DBIT = 1 Nutzer kann aktiv mit der Fkt. send_mo Daten versenden und passiv 'Remote_Frame' mit Daten beantworten.
DBIT = 0 Nutzer kann aktiv mit der Fkt. send_mo 'Remote_Frame' zur Datenabfrage bei anderen Stationen aktivieren und passiv Daten von anderen empfangen.
Oder anders ausgedrückt: Ist das Message Objekt mit RTR = 0 (entspricht DIR = 1) konfiguriert, wird ein Daten Frame gesendet. Bei RTR = 1 (entspricht DIR = 0) wird ein Remote Frame übertragen.


Laden des Message Objektes

Mit dieser Fkt. hat der Nutzer die Möglichkeit, Daten eines Objektes zu schreiben. Es werden stets 8Byte an den CAN-Controller ab Datenadresse übergeben.
Es erfolgt keine Datensendung, das muß der Nutzer mit der Fkt. send_mo separat beauftragen.
Während des Datentransfers besteht globale INT-Sperre.


Lesen eines Message Objektes

Eingeleitet durch den CAN-Receive-INT wird die Fkt. user_dataaccess gestartet, in der der Nutzer dafür zu sorgen hat, daß die Empfangsdaten seiner Objekte (DBIT=0) vom CAN-Controller mit der Fkt. rd_modata gelesen werden. Dadurch wird auch das Data_request_bit rückgesetzt.
Es werden stets 8Byte vom CAN-Controller nach Datenadresse übergeben. Während des Datentransfers besteht globale INT-Sperre.
RR 1 und RR 2 (im Receive – Ready – Register), die beim Empfang der Nachricht gesetzt wurden, werden wieder zurückgesetzt.

Bsp. für user_dataaccess:
Im Accu und in B wird bitweise verschlüsselt die Neudatenzuordnung zu den Objekten realisiert.
Acc.0   Daten von MO_0,
Acc.7   Daten von MO_7,
B.0       Daten von MO_8,
B.7       Daten von MO_15,
sind neu empfangen.
 
 
 
 
 
 
 


Senden eines Message Objektes

Mit dieser Funktion werden die Daten des angegebenen Message-Objektes auf den Bus gesendet.
Der Nutzer kann aktiv die Sendung eines Datenpaketes oder einer Datenanforderung auslösen.
Ein Teil dieser Funktion läuft unter globaler INT-Sperre.

 


Interrupt Service Routine (ISR)

Die  Interrupt Service Routine ruft die USER_DATA_ACCESS Funktion der Applikation bei einem Receive Interrupt (RI im Interrupt Register). Diese nutzt die in der ISR in A und B geladenen Receive – Ready Register (RR1, RR2).
RR – Register 1 und 2 werden in der Funktion RD_MODATA zurückgesetzt.