⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcancont.c51

📁 Philips sja1000 can controller. it contains example on how to control this device
💻 C51
📖 第 1 页 / 共 2 页
字号:
#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 + -