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

📄 bcancont.c51

📁 RTX51 example for Intel 82526. it contains example use of CAN.
💻 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 82C200 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           :  BCANCONT.C51                                  *
*                                                                      *
*  Modulename         :  BCANCONT                                      *
*                                                                      *
*  Zielsystem         :  jedes 8051 System mit einem Philips 82C200    *
*                        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 "bcancont.h"

/* Maximale Anzahl der Sende-Versuche bei Bus-Problemen */
/* von BCACNCONF.A51                                    */
extern const unsigned char code NBR_OF_SEND_TRIALS;


/* Definition der einzelnen Bits im STATUS-REGISTER    */
/* des CAN-Controllers                                 */
union can_status_typ {
   struct {
      byte rec_buffer_stat  : 1;
      byte data_overrun     : 1;
      byte trans_buf_access : 1;
      byte trans_complete   : 1;
      byte rec_status       : 1;
      byte trans_status     : 1;
      byte err_status       : 1;
      byte bus_status       : 1;
   } status_bits;
   byte status_byte;
};



/*---------------------------------------------------------------------*
 *     I M P O R T S                                                   *
 *---------------------------------------------------------------------*/


/* RTX-51 Function-Calls */
#include <rtx51.h>

#include "canutil.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 82C200 HW-Register, diese werden an die */
   /* Speicherstelle des Symbols BCAN_REG im Assembler-Modul         */
   /* BCANCONF.A51 alloziert. (absolute Variable)                    */
   extern xdata volatile struct {
                            byte control;
                            byte command;
                            byte status;
                            byte intr;
                            byte acc_code;
                            byte acc_mask;
                            byte bus_tim_0;
                            byte bus_tim_1;
                            byte out_contr;
                            byte test;
                            byte trans_buf[10];
                            byte rec_buf[10];
                         } bcan_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)
{
   bcan_reg.control = bcan_reg.control | 0x01;
}



#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 82C200 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 82C200
 *     bus_t1_reg   : Bus-Timing Register 1 des 82C200
 *     out_c_reg    : Output-Control Register des 82C200
 *
 *     Returnwert   : TRUE   -> OK
 *                    FALSE  -> Fehler beim Init
 *---------------------------------------------------------------------*/

byte c_hw_init (byte bus_t0_reg,
                byte bus_t1_reg,
                byte out_c_reg)
{
   can_reset_request();
   /* test-mode ausschalten */
   bcan_reg.control = bcan_reg.control & 0x7f;
   bcan_reg.bus_tim_0 = bus_t0_reg;
   bcan_reg.bus_tim_1 = bus_t1_reg;
   bcan_reg.out_contr = out_c_reg;
   return TRUE;
}



/*---------------------------------------------------------------------*
 *     C _ I N I T _ C O N T _ R E G
 *---------------------------------------------------------------------*
 *  Funktion:
 *     Initialisierung des CONTROL-REGISTERS des 82C200
 *     (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 82C200 Control-Registers
 *
 *---------------------------------------------------------------------*/

void c_init_cont_reg (byte cont_reg)
{
   /* Reset-Request Bit einschalten und sicherstellen dass Test-Mode */
   /* ausgeschaltet bleibt                                           */
   bcan_reg.control = (cont_reg | 0x01) & 0x7f;
}



/*---------------------------------------------------------------------*
 *     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();
   bcan_reg.acc_code = acc_code;
   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();
   bcan_reg.control = bcan_reg.control & 0x0fe;
   while (bcan_reg.control & 0x01) {
      bcan_reg.control = bcan_reg.control & 0x0fe;
      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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -