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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? can_drv.c

?? T89c51cc01的CAN通信子程序
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
//****************************************************************************
// 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

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品ww久久久久久p站| 精品国产免费久久| 九色porny丨国产精品| 久久一区二区视频| 7777精品久久久大香线蕉| 97精品国产露脸对白| 国产福利一区在线观看| 青青国产91久久久久久| 日韩中文字幕91| 亚洲成av人片一区二区梦乃| 中文字幕av一区 二区| 欧美电影免费观看高清完整版在线观看| 一本色道久久综合狠狠躁的推荐| 狠狠狠色丁香婷婷综合激情| 看电视剧不卡顿的网站| 首页综合国产亚洲丝袜| 一区二区在线免费观看| 国产精品乱人伦| 亚洲国产高清不卡| 亚洲国产精品精华液ab| 国产区在线观看成人精品| 欧美大片日本大片免费观看| 欧美一区二区黄色| 91精品国产色综合久久久蜜香臀| 欧美色男人天堂| 欧美一区二区三区在线观看| 制服丝袜成人动漫| 日韩一区二区精品在线观看| 欧美精品一级二级三级| 91精品国产高清一区二区三区| 欧美三级电影在线看| 欧美性xxxxxx少妇| 欧美高清你懂得| 精品国产三级电影在线观看| 久久尤物电影视频在线观看| 国产亚洲精品久| 国产精品高潮呻吟| 一区二区高清免费观看影视大全| 亚洲成人免费影院| 免费高清成人在线| 成人综合婷婷国产精品久久蜜臀| 高清成人免费视频| 色婷婷久久久久swag精品| 欧美日韩一区三区四区| 日韩精品专区在线影院观看| 91精品一区二区三区久久久久久| 欧美一级片免费看| 日本一区二区动态图| 亚洲综合视频网| 麻豆成人91精品二区三区| 粉嫩av亚洲一区二区图片| 一本一道久久a久久精品| 91国在线观看| 日韩午夜在线影院| 久久久久久黄色| 国产精品伦理在线| 免费不卡在线视频| 91免费国产视频网站| 欧美精品乱码久久久久久按摩| 精品国产免费人成电影在线观看四季| 国产精品大尺度| 青青草成人在线观看| 成人少妇影院yyyy| 91麻豆精品国产91久久久久久久久| 久久久蜜臀国产一区二区| 亚洲国产日韩一区二区| 激情欧美一区二区| 欧美精品vⅰdeose4hd| 亚洲国产高清在线| 午夜精品视频在线观看| 成人免费三级在线| 欧美精品一区二区三区视频| 亚洲一级片在线观看| 国产99精品国产| 欧美一级二级三级蜜桃| 亚洲桃色在线一区| 国产91对白在线观看九色| 欧美不卡123| 日韩va亚洲va欧美va久久| 国产一区二区免费在线| 欧美日韩高清不卡| 一区二区三区精密机械公司| 成人在线视频一区| 2020日本不卡一区二区视频| 日日噜噜夜夜狠狠视频欧美人 | 日韩va欧美va亚洲va久久| 成人激情图片网| 国产欧美日韩久久| 韩国av一区二区三区| 日韩一区二区三区四区| 五月综合激情网| 国产凹凸在线观看一区二区| 国产日韩成人精品| 国产成人亚洲综合a∨猫咪| 精品福利一区二区三区| 久久99日本精品| 色噜噜狠狠成人网p站| 中文字幕一区二区日韩精品绯色| 国产盗摄一区二区| 久久久不卡网国产精品二区| 精品制服美女久久| 国产亚洲制服色| 免费看欧美女人艹b| 久久综合色8888| 国产精品一区二区久激情瑜伽| 国产午夜精品久久久久久免费视 | 午夜一区二区三区视频| 在线视频欧美精品| 亚洲大型综合色站| 日韩视频在线观看一区二区| 毛片不卡一区二区| 久久久久久久久伊人| 国产不卡在线一区| 久久久久久久综合狠狠综合| 成人毛片视频在线观看| 亚洲另类春色国产| 555www色欧美视频| 国产精品自产自拍| 日韩美女视频一区| 欧美性猛交xxxx乱大交退制版| 午夜精品久久久久久久久久久| 日韩一级高清毛片| 国产成人日日夜夜| 亚洲狠狠丁香婷婷综合久久久| 国产麻豆成人精品| 亚洲男人都懂的| 欧美大片免费久久精品三p| 色哟哟日韩精品| 国产成人亚洲综合a∨婷婷| 日韩精彩视频在线观看| 一区在线中文字幕| 久久精品一区二区三区不卡| 欧美一级专区免费大片| 欧美午夜精品一区| 99精品偷自拍| 国产成人av自拍| 久久99精品国产91久久来源| 亚洲第一福利视频在线| 亚洲一区在线视频观看| 成人免费在线播放视频| 久久精品视频在线看| 日韩欧美一卡二卡| 91精品国产高清一区二区三区 | 国产欧美日韩在线观看| 欧美一区二区三区免费大片 | 99re成人在线| 国产v日产∨综合v精品视频| 国产乱码精品一区二区三| 男男视频亚洲欧美| 日韩精品一区第一页| 亚洲成av人片在线| 水野朝阳av一区二区三区| 亚洲成人一区在线| 日日摸夜夜添夜夜添亚洲女人| 亚洲电影一级片| 无码av免费一区二区三区试看| 亚洲国产一区视频| 婷婷国产在线综合| 日本成人在线网站| 九九视频精品免费| 国产精品亚洲午夜一区二区三区 | 欧美日韩免费高清一区色橹橹| 色综合色综合色综合色综合色综合| 成人激情黄色小说| 色综合久久88色综合天天| 色综合久久精品| 欧美日韩国产首页在线观看| 91精品国产综合久久久久久漫画| 欧美一级免费观看| 久久久久久免费| 国产精品三级在线观看| 亚洲免费在线电影| 丝袜美腿亚洲色图| 久88久久88久久久| 91在线国产福利| 欧美日韩小视频| 欧美成人综合网站| 国产精品视频看| 亚洲电影第三页| 久草精品在线观看| 色婷婷综合久久久中文字幕| 69久久夜色精品国产69蝌蚪网| 欧美tickle裸体挠脚心vk| 国产精品麻豆一区二区| 亚洲一二三专区| 国产在线国偷精品产拍免费yy | 天天影视网天天综合色在线播放| 青青草原综合久久大伊人精品优势| 国产一区二区毛片| 色噜噜狠狠一区二区三区果冻| 日韩精品一区二区三区在线| 欧美激情自拍偷拍| 天堂影院一区二区| 国产不卡免费视频| 91精品国产91综合久久蜜臀| 亚洲欧美一区二区久久| 美国十次综合导航| 欧美亚洲国产一区二区三区va| 久久免费美女视频| 亚洲图片欧美视频|