📄 pcancont.c51
字号:
#pragma large
#pragma debug
#pragma registerbank(3)
#pragma pagelength(80) pagewidth(110)
/***********************************************************************
************************************************************************
* *
* B A S I C - C A N C O N T R O L L E R *
* *
************************************************************************
************************************************************************
* *
* Funktion: *
* *
* Direkte HW-Steuerung des Philips SJA100 Basic-CAN Controllers. *
* Ausf乭rung aller Low-Level Funktionen. Dieses Modul ist das *
* einzige, dass direkt in die HW-Register des CAN-Controllers *
* schreiben darf. *
* *
* *
* Filename : PCANCONT.C51 *
* *
* Modulename : PCANCONT *
* *
* Zielsystem : jedes 8051 System mit einem Philips SJA100 *
* CAN-Controller *
* *
* Entwicklungssystem : Keil C-51 *
* *
************************************************************************
* Versionen: *
* *
* 0.1 25.10.1990 Th. Fischler : Erste Version *
* 1.0 21.01.1991 Th. Fischler : Sende-Fehler abgefangen *
* (Fehler wenn keine andere Station *
* auf Bus) *
* *
* 1.1 14.02.1996 K. Birsen : Prozedur c_clr_overrun : *
* can_reset_request auskommentiert *
* ( nach Fehler-Angaben des Herrn *
* Michael Eicher Zellweger ) *
************************************************************************
* Copyright 1991 .. 2001 METTLER & FUCHS AG, CH-8953 Dietikon *
************************************************************************/
/*---------------------------------------------------------------------*
* D E F I N I T I O N E N *
*---------------------------------------------------------------------*/
#include "abbrev.h"
#include "pcancont.h"
/* Maximale Anzahl der Sende-Versuche bei Bus-Problemen */
/* von PCACNCONF.A51 */
extern const unsigned char code NBR_OF_SEND_TRIALS;
/*---------------------------------------------------------------------*
* I M P O R T S *
*---------------------------------------------------------------------*/
/* RTX-51 Function-Calls */
#include <rtx51.h>
#include "pcanutil.h"
/*---------------------------------------------------------------------*
* M O D U L G L O B A L E V A R I A B L E N *
*---------------------------------------------------------------------*/
static byte rtxreturn;
/* Definition der Philips SJA100 HW-Register, diese werden an die */
/* Speicherstelle des Symbols BCAN_REG im Assembler-Modul */
/* BCANCONF.A51 alloziert. (absolute Variable) */
extern xdata volatile reg_type can_reg;
#pragma eject
/*---------------------------------------------------------------------*
* L O K A L E P R O Z E D U R E N *
*---------------------------------------------------------------------*/
/*---------------------------------------------------------------------*
* C A N _ R E S E T _ R E Q U E S T
*---------------------------------------------------------------------*
* Funktion:
* Setzt den CAN-Controller in den Reset-Zustand
*
*---------------------------------------------------------------------*
* Parameter:
* --
*
*---------------------------------------------------------------------*/
static void can_reset_request (void)
{
can_reg.bcan_reg.control.bits.RR = 1;
}
#pragma eject
/*---------------------------------------------------------------------*
* E X P O R T I E R T E P R O Z E D U R E N *
*---------------------------------------------------------------------*/
/*---------------------------------------------------------------------*
* C _ F I R S T _ I N I T
*---------------------------------------------------------------------*
* Funktion:
* Diese Routine sollte vor der ersten
* initialisierung des Controllers aufgerufen werden.
* (Sie ist vorallem aus zur Sicherstellung der Kompatibilit則 zur
* Basic-CAN Software vorhanden).
*
*---------------------------------------------------------------------*
* Parameter:
* --
*---------------------------------------------------------------------*/
void c_first_init (void)
{
can_reset_request();
}
/*---------------------------------------------------------------------*
* C _ H W _ I N I T
*---------------------------------------------------------------------*
* Funktion:
* Grundinitialisierung des SJA100 CAN-Controllers.
* Der CAN-Controller wird f乺 diese Operation angehalten.
* Er muss danach mit C_START wieder neu gestartet werden.
*
*---------------------------------------------------------------------*
* Parameter:
*
* bus_t0_reg : Bus-Timing Register 0 des SJA1000
* bus_t1_reg : Bus-Timing Register 1 des SJA1000
* out_c_reg : Output-Control Register des SJA1000
* clock_devider: = bit7 = 0 f黵 BasicCAN, =1 f黵 PeliCAN
*
* Returnwert : TRUE -> OK
* FALSE -> Fehler beim Init
*---------------------------------------------------------------------*/
byte c_hw_init (byte bus_t0_reg,
byte bus_t1_reg,
byte out_c_reg,
byte clock_devider)
{
can_reset_request();
/* test-mode ausschalten */
can_reg.bcan_reg.control.bits.TM = 0;
can_reg.bcan_reg.bus_tim_0 = bus_t0_reg;
can_reg.bcan_reg.bus_tim_1 = bus_t1_reg;
can_reg.bcan_reg.out_contr = out_c_reg;
can_reg.bcan_reg.clock_devider.bytes = clock_devider;
return TRUE;
}
/*---------------------------------------------------------------------*
* C _ I N I T _ C O N T _ R E G
*---------------------------------------------------------------------*
* Funktion:
* Initialisierung des CONTROL-REGISTERS des SJA1000
* (Festlegung der Interrupts und des Synch-Modes).
* Der CAN-Controller wird f乺 diese Operation angehalten, er muss
* danach mit C_START wieder neu gestartet werden.
*
*---------------------------------------------------------------------*
* Parameter:
*
* cont_reg : Inhalt des SJA1000 Control-Registers
*
*---------------------------------------------------------------------*/
void c_init_cont_reg (byte cont_reg)
{
/* Reset-Request Bit einschalten und sicherstellen dass Test-Mode */
/* ausgeschaltet bleibt */
can_reg.bcan_reg.control.bytes = cont_reg;
can_reg.bcan_reg.control.bits.RR = 1;
can_reg.bcan_reg.control.bits.TM = 0;
}
/*---------------------------------------------------------------------*
* C _ I N I T _ A C C E P T _ R E G
*---------------------------------------------------------------------*
* Funktion:
* Acceptance-Code und Acceptance-Mask Register initialisieren.
* Der CAN-Controller wird f乺 diese Operation angehalten, er muss
* danach mit C_START wieder neu gestartet werden.
*
*---------------------------------------------------------------------*
* Parameter:
*
* acc_code : Inhalt des Acceptanc-Code Registers
* acc_mask : Inhalt des Acceptance-Mask Registers
*
*---------------------------------------------------------------------*/
void c_init_accept_reg (byte acc_code,
byte acc_mask)
{
can_reset_request();
can_reg.bcan_reg.acc_code = acc_code;
can_reg.bcan_reg.acc_mask = acc_mask;
}
/*---------------------------------------------------------------------*
* C _ S T A R T
*---------------------------------------------------------------------*
* Funktion:
* Starten des CAN-Controllers nach Init oder nach C_STOP.
* Nach C_START k攏nen Objekte empfangen und gesendet werden.
*
*---------------------------------------------------------------------*
* Parameter:
*
* --
*
*---------------------------------------------------------------------*/
void c_start (void)
{
/* Das Reset request Bit kann durch einen externen Hardware Reset */
/* ausgeschaltet bleiben, darum solange ausschalten bis der Reset */
/* Zustand wirklich freigegeben ist */
can_reset_request();
can_reg.bcan_reg.control.bits.RR = 0;
while (can_reg.bcan_reg.control.bits.RR) {
can_reg.bcan_reg.control.bits.RR = 0;
os_wait (K_TMO, 2, 0);
}
}
/*---------------------------------------------------------------------*
* C _ S T O P
*---------------------------------------------------------------------*
* Funktion:
* Tempor剅es Anhalten des CAN-Controllers. Es kann mit C_START
* weitergefahren werden. Solange C_STOP aktiv ist, k攏nen keine
* Objekte empfangen oder gesendet werden.
*
*---------------------------------------------------------------------*
* Parameter:
*
* --
*
*---------------------------------------------------------------------*/
void c_stop (void)
{
can_reset_request();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -