亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? can_drv.c

?? T89c51cc01的CAN通信子程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
//****************************************************************************
// Module        On-Chip CAN Interface 
// Filename      Can_drv.C
// Controller    AtmelWM 89C51CC01
//****************************************************************************

#include <REG51CC01.H>        
#include <string.h>
#include "can_drv.h"   // define user CAN id

// Macros for CAN Message Object Control and DLC register (CANCONCH)
#define  CanTX       0x40      // Transmit
#define  CanRX       0x80      // Receive
#define  CanRXB      0xC0      // Receive in buffered mode
#define  CanCONCH    0xC0      // Mask for the CONCH field
#define  CanRPLV     0x20      // Remote Transmission Reply ready & valid
#define  CanIDE      0x10      // ID extended (29-bit)

// Macros for CAN General Control register (CANGCON)
#define  CanABRQ     0x80      // Abort request
#define  CanOVRQ     0x40      // Overload frame request
#define  CanTTC      0x20      // Network in Timer Trigger communication
#define  CanSYNCTTC  0x10      // Synchronisation of TTC
#define  CanAUTOBAUD 0x08      // autobaud mode
#define  CanENA      0x02      // enable CAN controller
#define  CanGRES     0x01      // general reset

// Macros for CAN General Interrupt Enable register (CANGIE)
#define  CanENRX     0x20      // Enable receive interrupt
#define  CanENTX     0x10      // Enable transmit interrupt
#define  CanENERCH   0x08      // Enable message object error interrupt
#define  CanENBUF    0x04      // Enable BUF interrupt
#define  CanENERG    0x02      // Enable general error interrupt

// Macros for CAN General Interrupt register (CANGIT)
#define  CanCANIT    0x80      // General Interrupt Flag
#define  CanOVRTIM   0x20      // Overrun CAN Timer
#define  CanOVRBUF   0x10      // Overrun Buffer
#define  CanSERG     0x08      // Stuff error General
#define  CanCERG     0x04      // CRC   error General
#define  CanFERG     0x02      // Form  error General
#define  CanAERG     0x01      // Acknowledgement error General

// Macros for CAN Message Object Status register (CANSTCH)
#define  CanDLCW     0x80      // Data length code warning 
#define  CanTXOK     0x40      // Transmit OK
#define  CanRXOK     0x20      // Receive OK
#define  CanBERR     0x10      // Bit error
#define  CanSERR     0x08      // Stuff error           
#define  CanCERR     0x04      // CRC   error           
#define  CanFERR     0x02      // Form  error
#define  CanAERR     0x01      // Acknowledgement error

// Macros for ID initilisiation in CANIDTx, CANIDMx registers
#define  CanID29(v)  (((unsigned long)(v))<<3)   
#define  CanID11(v)  (((unsigned long)(v))<<22)
#define  CanIDEMSK   0x01      // enable comparison in CANIDM register
#define  CanRTRMSK   0x04      // enable Remote Transmission request in CANIDM register

// Set value in CANIDTx registers
#define  CanSetIDT(v) CANIDT1=((unsigned char)((v)>>24));  \
                      CANIDT2=((unsigned char)((v)>>16));  \
                      CANIDT3=((unsigned char)((v)>> 8));  \
                      CANIDT4=((unsigned char)(v)) ^ conf;

// Set value in CANIDMx registers
#define  CanSetIDM(v) CANIDM1=((unsigned char)((v)>>24));  \
                      CANIDM2=((unsigned char)((v)>>16));  \
                      CANIDM3=((unsigned char)((v)>> 8));  \
                      CANIDM4=((unsigned char)(v));

// Convert Channel No. for CANPAGE register
#define  CanChannel(v)  ((v)<<4)

/****** C A N   I D   D E F I N I T I O N S  *****************************************/

// Define Channel 0 Object Identifiers (handled in polling mode)
#define  ID0     (CanID29(0x00000100))
#define  ID0MSK  (CanID29(0x1FFFFFFF) | CanIDEMSK)
#define  ID0TYP  (CanTX | CanIDE | 1)        // Transmit, ID extended (29-bit),
                                             // 1 Byte message length

// Define Channel 1 Object Identifiers (handled in polling mode)
#define  ID1     (CanID29(0x00000101))
#define  ID1MSK  (CanID29(0x1FFFFFFF) | CanIDEMSK)
#define  ID1TYP  (CanRX | CanIDE | 1)        // Receive, ID extended (29-bit),
                                             // 1 Byte message length

// Define Channel 2 Object Identifiers (handled in interrupt mode)
#define  ID2     (CanID29(0x00000102))
#define  ID2MSK  (CanID29(0x1FFFFFFF) | CanIDEMSK)
#define  ID2TYP  (CanTX | CanIDE | 8)        // Transmit, ID extended (29-bit),
                                             // 8 Byte message length
#define  ID2IntChk (CANSIT2 & 0x04)          // Interrupt Status for Message Object 2

// Define Channel 3 Object Identifiers (handled in interrupt mode)
#define  ID3     (CanID29(0x00000103))
#define  ID3MSK  (CanID29(0x1FFFFFFF) | CanIDEMSK)
#define  ID3TYP  (CanRXB | CanIDE | 8)        // Receive, ID extended (29-bit),
                                             // 8 Byte message length
#define  ID3IntChk (CANSIT2 & 0x08)          // Interrupt Status for Message Object 3

// Define Channel 4 Object Identifiers (handled in interrupt mode)
#define  ID4     (CanID29(0x00000103))
#define  ID4MSK  (CanID29(0x1FFFFFFF) | CanIDEMSK)
#define  ID4TYP  (CanRXB | CanIDE | 8)        // Receive, ID extended (29-bit),
                                              // 8 Byte message length
#define  ID4IntChk (CANSIT2 & 0x10)          // Interrupt Status for Message Object 4

// Define Channel 4 Object Identifiers ('client' for remote frame mode)
#define  ID5     (CanID29(0x00000104))
#define  ID5MSK  (CanID29(0x1FFFFFFF) | CanIDEMSK)
#define  ID5TYP  (CanTX | CanIDE | 8)                 // Transmit, ID extended (29-bit),
                                                      // 8 Byte message length

// Define Channel 5 Object Identifiers ('server' for remote frame mode)
#define  ID6     (CanID29(0x00000105))
#define  ID6MSK  (CanID29(0x1FFFFFFF) | CanIDEMSK)
#define  ID6TYP  (CanRX | CanIDE | 8)                 // Receive, ID extended (29-bit),
                                                      // 8 Byte message length


// IDxTYP table for all used message objects 
unsigned char code id_typ[] =  {
  ID0TYP,
  ID1TYP,
  ID2TYP,
  ID3TYP,
  ID4TYP,
  ID5TYP,
};


// ===== CAN Baudrate Calculation ======================
// Tscl =     (1+BRP)/(XTAL)   // for X2 Mode = ON
// Tscl =   2*(1+BRP)/(XTAL)   // for X2 Mode = OFF
// Tbit = (1 + (PRS+1) + (PHS1+1) + (PHS2+1)) * Tscl

// Examples:
// 500KHz CAN Baudrate,  X2 Mode = OFF,  XTAL=12MHz
// BRP = 0, PRS = 2, PHS1 = 3, PHS2 = 3
// Tscl = 2/12.0MHz = 0.167 礢ec
// Tbit = (1 + (2+1)+(3+1)+(3+1)) * Tscl = 12 * 0.167uSec = 2 礢ec -> 500KHz Baudrate

// Examples:
// 1MHz CAN Baudrate,  X2 Mode = ON,  XTAL=20MHz
// BRP = 1, PRS = 1, PHS1 = 3, PHS2 = 2
// Tscl = 2/20.0MHz = 0.100 礢ec
// Tbit = (1 + (1+1)+(3+1)+(2+1)) * Tscl = 10 * 0.100uSec = 1 礢ec -> 1MHz Baudrate

#define BRP    1
#define SJW    0
#define PRS    1
#define PHS1   3
#define PHS2   2


/*
 * CAN Initialization:
 *    - reset CAN controller
 *    - initialize CAN message object (ID, MSK, control)
 *    - clear message object status register
 *    - clear unused message object (ID, MSK, control, status)
 *    - enable CAN controller
 */

void CanInit (unsigned char conf) { 
  unsigned char i;

  CANGCON |= CanGRES;                // Reset CAN controller
  ECAN = 0;                          // disable CAN interupt
  ETIM = 0;                          // disable CAN timer overrun interrupt

// Init CAN Message Object 0  (Transmit)
  CANPAGE = CanChannel (0);
  CanSetIDT(ID0);  
  CanSetIDM(ID0MSK);
  CANCONCH = 0;                      // mark no information for transmit objects
  CANSTCH  = 0;
  
// Init CAN Message Object 1  (Receive)
  CANPAGE = CanChannel (1);
  CanSetIDT(ID1);  
  CanSetIDM(ID1MSK);
  CANCONCH = ID1TYP;                 // Object waits for data
  CANSTCH  = 0;

// Init CAN Message Object 2  (Transmit)
  CANPAGE = CanChannel (2);
  CanSetIDT(ID2);  
  CanSetIDM(ID2MSK);
  CANCONCH = 0;                      // mark no information for transmit objects
  CANSTCH  = 0;
  
// Init CAN Message Object 3  (Receive)
  CANPAGE = CanChannel (3);
  CanSetIDT(ID3);  
  CanSetIDM(ID3MSK);
  CANCONCH = ID3TYP;                 // Object waits for data
  CANSTCH  = 0;

// Init CAN Message Object 4  (Receive)
  CANPAGE = CanChannel (4);
  CanSetIDT(ID4);  
  CanSetIDM(ID4MSK);
  CANCONCH = ID4TYP;                 // Object waits for data
  CANSTCH  = 0;
  
// Init CAN Message Object 5  (for Remote Requests)
  CANPAGE = CanChannel (5);
  CanSetIDT(ID5);  
  CanSetIDM(ID5MSK);
  CANCONCH = 0;                      // mark no information for remote request objects
  CANSTCH  = 0;
    
// Init CAN Message Object 6  (for Remote Transmits)
  CANPAGE = CanChannel (6);
  CanSetIDT(ID6);  
  CanSetIDM(ID6MSK);
  CANCONCH = ID6TYP;                // mark no information for remote transmit objects
  CANSTCH  = 0;

// Clear unused Message Object Buffers
  for (i = CanChannel (7); i <= CanChannel(14); i += CanChannel(1))  {
    CANPAGE = i;
    CanSetIDT(0);                    // Clear Object Buffer  
    CanSetIDM(0);
    CANCONCH = 0;
    CANSTCH  = 0;
  }

// Set CAN Baudrate
  CANBT1 = ((BRP)<<1);               // set CANBT1 register (BRP timing)
  CANBT2 = ((PRS)<<1) | ((SJW)<<5);  // set CANBT2 register (PRS & SJW timing)
  CANBT3 = ((PHS1)<<1)| ((PHS2)<<4); // set CANBT3 register (PHS1 & PHS1 timing)
  
  CANGCON |= CanENA;                 // enable CAN controller

// If you are using interrupt driven CAN I/O enable interrupts
  ECAN = 1;                          // enable general CAN interupt
  CANGIE |= CanENRX | CanENTX;       // enable TX and RX interrupt
  CANIE2 |= 0x0C;                    // enable TX and RX interrupt
}          


/***** CAN I/O Routines for Polling Mode ******************************************/

/*
 * CanSend:
 *   Input Parameter:  ch :=  message object channel (0 .. 14)
 *                      p :=  Pointer to data
 *
 *   Return Value:      0     message transferred to buffer, transmission started
 *                     -1     message object not defined for transmission
 *                     -2     previous message not yet transferred
 *               
 *    - check if CAN message object is defined for transmit
 *    - check if a previous message is transmitted OK
 *    - copy new message to message object buffer
 *    - set message object for transmission
 */
char CanSend (unsigned char ch,  unsigned char *p)  {
  unsigned char i;
  static unsigned char typ;

// check if CAN message object is defined for transmit
  if (ch >= sizeof (id_typ))      return (-1);
  typ = id_typ[ch];
  if ((typ & CanCONCH) != CanTX)  return (-1);

  i = typ & 0xF;                 // message length
  CANPAGE = CanChannel(ch);      // select CAN message object

  if ((CANCONCH & CanCONCH))  {  // CAN channel used before?
    if (!(CANSTCH & CanTXOK)) {
      return (-2);               // previous message not yet send!
    }
  }

  CANCONCH = 0;                  // reset previous status
  CANSTCH  = 0;
  while (i)  {                   // copy information to message buffer
    CANMSG = *p++;
    i--;
  }
  CANCONCH = typ;                // send information
  return (0);                    // message object copied to buffer
}



/*
 * CanRead:
 *   Input Parameter:  ch :=  message object channel (0 .. 14)
 *                      p :=  pointer to data buffer
 *
 *   Return Value:      0     n bytes of message transferred to data buffer
 *                     -1     message object not defined for receiving
 *                     -2     no message available
 *                     -3     messsage data length differs from definition
 *               
 *    - check if CAN message object is defined for receiving
 *    - check if a message is received
 *    - copy received message to data buffer
 *    - set message object for receiving
 */
char CanRead (unsigned char ch,  unsigned char *p)  {
  unsigned char i, typ;

// check if CAN message object is defined for reception
  if (ch >= sizeof (id_typ))      return (-1);
  typ = id_typ[ch];
  if ((typ & CanCONCH) != CanRX)  return (-1);

  i = typ & 0xF;                 // message length

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91亚洲精品久久久蜜桃网站 | 高清久久久久久| 欧美日韩一级二级| 亚洲成在人线免费| 成人黄色在线看| 精品久久久久久无| 亚洲成人在线观看视频| 欧美日韩免费视频| 亚洲成a人片在线观看中文| 欧美性色黄大片| 亚洲影院在线观看| 欧美日韩免费电影| 亚洲成人激情综合网| 欧美影院午夜播放| 首页国产丝袜综合| 欧美一区二区不卡视频| 日韩精品亚洲一区| 精品久久久久久无| 国产69精品一区二区亚洲孕妇| 国产欧美精品区一区二区三区| 成人做爰69片免费看网站| 日韩免费观看高清完整版| 国产一区欧美一区| 国产精品热久久久久夜色精品三区| 不卡一区二区三区四区| 亚洲欧洲av另类| 色爱区综合激月婷婷| 香蕉成人啪国产精品视频综合网 | 91同城在线观看| 亚洲尤物在线视频观看| 7777精品伊人久久久大香线蕉完整版 | 一本到高清视频免费精品| 亚洲精品一二三四区| 欧美精品黑人性xxxx| 久久不见久久见免费视频7| 国产女主播一区| 色视频成人在线观看免| 男女视频一区二区| 国产亚洲欧美一区在线观看| 国产99久久久久久免费看农村| 亚洲丶国产丶欧美一区二区三区| 欧美日本一区二区三区| 国内精品久久久久影院薰衣草| 日本一区二区三区dvd视频在线| 91在线观看下载| 琪琪一区二区三区| 亚洲欧美一区二区视频| 欧美四级电影在线观看| 韩国精品主播一区二区在线观看| 成人免费一区二区三区视频| 91麻豆精品国产91久久久使用方法 | 成人av在线电影| 日韩av高清在线观看| 国产精品女同互慰在线看| 欧美在线视频不卡| 国产成人免费在线| 日韩高清不卡一区| 国产精品私人自拍| 精品日韩成人av| 欧美日韩视频第一区| 国产成人免费视| 久久精品国产亚洲高清剧情介绍 | 亚洲综合成人网| 久久久一区二区三区| 欧美色综合久久| av中文字幕在线不卡| 日本免费在线视频不卡一不卡二| 亚洲视频一区在线| 久久九九久精品国产免费直播| 欧美日本一道本在线视频| 国产在线一区观看| 日韩国产在线观看| 亚洲动漫第一页| 最新日韩在线视频| 欧美国产一区二区在线观看| 精品国产乱码久久久久久夜甘婷婷 | 国产自产高清不卡| 蜜臀a∨国产成人精品| 亚洲高清视频中文字幕| 亚洲欧美色图小说| 国产精品久久久久久久裸模| 5566中文字幕一区二区电影| 欧美性猛交xxxxxxxx| 91视频.com| www.日本不卡| 欧美一级高清片| 欧美日韩国产另类一区| av亚洲精华国产精华精华| 天天影视涩香欲综合网| 樱桃国产成人精品视频| 精品剧情v国产在线观看在线| 欧美在线看片a免费观看| av成人动漫在线观看| 成人深夜视频在线观看| 日本伊人午夜精品| 蜜桃一区二区三区在线| 免费的成人av| 精品一区二区三区影院在线午夜 | 91麻豆精品秘密| 一本久道久久综合中文字幕| 色偷偷久久一区二区三区| 色综合天天综合在线视频| 91片黄在线观看| 色94色欧美sute亚洲13| 精品视频在线免费观看| 91麻豆精品国产91久久久资源速度| 欧美日韩国产一级| 欧美偷拍一区二区| 日韩欧美亚洲国产另类| 91美女福利视频| 91麻豆精品国产91| 精品免费国产一区二区三区四区| 久久久www免费人成精品| 国产午夜精品一区二区三区嫩草 | 一级特黄大欧美久久久| 依依成人综合视频| 蜜臀91精品一区二区三区| 国产精一品亚洲二区在线视频| 国产精品一品视频| 色域天天综合网| 欧美一二三区精品| 欧美韩日一区二区三区四区| 亚洲三级免费观看| 五月天激情小说综合| 成人综合在线观看| 亚洲精品成人悠悠色影视| 曰韩精品一区二区| 免费的国产精品| 99re66热这里只有精品3直播| 色999日韩国产欧美一区二区| 精品日韩一区二区三区| 亚洲欧洲韩国日本视频| 天堂一区二区在线| caoporn国产精品| 欧美va亚洲va| 亚洲福利视频三区| 成人av网站在线观看| 精品久久久久久久人人人人传媒| 亚洲精品国久久99热| 粉嫩av一区二区三区在线播放 | 91免费看片在线观看| 欧美成人a在线| 午夜精品久久久久久久久 | 欧美在线你懂的| 国产精品色一区二区三区| 国产一区二区三区久久悠悠色av| 欧美色图在线观看| 亚洲男人的天堂一区二区| 成人美女在线观看| 国产亚洲一区二区三区在线观看| 麻豆精品一区二区综合av| 欧美色综合久久| 亚洲成人一区在线| 欧美午夜电影一区| 亚洲最大的成人av| 色偷偷88欧美精品久久久| 成人免费在线视频| 99re热视频精品| 亚洲欧美视频在线观看| 91日韩一区二区三区| 亚洲欧美日韩在线不卡| 91免费国产在线| 一区二区三区中文字幕| 91福利在线看| 亚洲码国产岛国毛片在线| 99久久精品国产网站| 亚洲日本在线看| 色综合色狠狠天天综合色| 亚洲精品日产精品乱码不卡| 一本久久a久久精品亚洲| 亚洲精品国产第一综合99久久| 91女厕偷拍女厕偷拍高清| 亚洲精品日日夜夜| 欧美日本一区二区三区| 轻轻草成人在线| 精品国产91洋老外米糕| 久久狠狠亚洲综合| 久久精品一区二区三区四区| 国产a级毛片一区| 亚洲欧美偷拍卡通变态| 欧美色图天堂网| 免费不卡在线视频| 国产欧美一区二区三区鸳鸯浴| 成人av电影观看| 亚洲第一成年网| 精品欧美一区二区在线观看| 国产成人免费9x9x人网站视频| 国产精品久久久久久久久免费桃花 | 91麻豆精品国产91久久久久| 欧美aaaaaa午夜精品| www久久精品| 不卡一区二区三区四区| 亚洲综合色成人| 欧美www视频| 99在线精品观看| 日本午夜精品一区二区三区电影| 2024国产精品| 色婷婷综合久久久| 免费国产亚洲视频| 亚洲欧美怡红院|