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

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

?? lpc_canall.c

?? The following Philips LPC2k CAN examples in this directory were provided by ESAcademy. LPC2_CANA
?? C
字號:
/**************************************************************************
MODULE:    LPC_CANAll
CONTAINS:  Philips LPC2000 CAN interface driver.
           This driver shows how the CAN interface of the Philips LPC2000
           can be used to receive ALL messages on the CANbus.
           All incoming messages are copied into a receive queue.
           NOTE: This example does not implement any queue overrun handling
		       Compiled and Tested with Keil Tools www.keil.com
COPYRIGHT: Embedded Systems Academy, Inc. 2004.
LICENSE:   THIS VERSION CREATED FOR FREE DISTRIBUTION
		       FOR PHILIPS SEMICONDUCTORS www.philipsmcu.com
           FOR KEIL SOFTWARE www.keil.com
VERSION:   1.10, Pf 05-JAN-05, Updates in accordance with errata sheets
---------------------------------------------------------------------------
HISTORY:   1.00, Pf 14-JUL-04, First published release
***************************************************************************/ 

#include <LPC21XX.H> // LPC21XX Peripheral Registers
#include "LPC_CANAll.h"


/**************************************************************************
GLOBAL VARIABLES
***************************************************************************/ 

// Receive Queue: one queue for each CAN port
CANALL_MSG mRxCAN[MAX_CANPORTS][MAX_QUEUE];

// Receive Queue IN pointer
short mRxIN[MAX_CANPORTS];

// Receive Queue OUT pointer
short mRxOUT[MAX_CANPORTS];

/**************************************************************************
PUBLIC FUNCTIONS
***************************************************************************/ 

/**************************************************************************
Initialization of a CAN interface
as described in LPC_CANAll.h
***************************************************************************/ 
short CANAll_Init (
  unsigned short can_port,    // CAN interface to use
  unsigned short can_isrvect, // interrupt vector number to use for Rx ISR (0-15)
  unsigned int can_btr        // CAN BTR value used to set CAN baud rate
  )
{
unsigned int *pSFR; // pointer into SFR space
unsigned int *pSFR2; // pointer into SFR space
unsigned int offset; // offset added to pSFR

  // Double check can_isrvect value
  if (can_isrvect > 15)
  { // Illegal value for can_isrvect
    return 0;
  }

  // Double check can_port value
  if ((can_port < 1) || (can_port > MAX_CANPORTS))
  { // Illegal value for can_port
    return 0;
  }

  // Reset IN and OUT pointer
  mRxIN[can_port-1] = 0;
  mRxOUT[can_port-1] = 0;
  
  // Enable pins for selected CAN interface
  switch (can_port)
  {
  case 1:
    PINSEL1 |= 0x00040000L; // Set bit 18
    offset = 0x00000000L; // Use 1st set of CAN registers
    break;
#if (MAX_CANPORTS > 1)
  case 2:
    PINSEL1 |= 0x00014000L; // Set bits 14 and 16
    offset = 0x00001000L; // Use 2nd set of CAN registers
    break;
#endif
#if (MAX_CANPORTS > 2)
  case 3:
    PINSEL1 |= 0x00001800L; // Set bits 11 and 12
    offset = 0x00002000L; // Use 3rd set of CAN registers
    break;
#endif
#if (MAX_CANPORTS > 3)
  case 4:
    PINSEL0 |= 0x0F000000L; // Set bits 24 to 27
    offset = 0x00003000L; // Use 4th set of CAN registers
    break;
#endif
  default:
    return 0; // illegal value used
  }

  // Acceptance Filter Mode Register = filter off, receive all
  AFMR = 0x00000002L;

  pSFR = (unsigned int *) &C1MOD + offset; // Select Mode register
  *pSFR = 1; // Go into Reset mode

  pSFR = (unsigned int *) &C1IER + offset; // Select Interrupt Enable Register
  *pSFR = 0;// Disable All Interrupts

  pSFR = (unsigned int *) &C1GSR + offset; // Select Status Register
  *pSFR = 0; // Clear Status register

  pSFR = (unsigned int *) &C1BTR + offset; // Select BTR Register
  *pSFR = can_btr; // Set bit timing

  // Set and enable receive interrupt
  pSFR = (unsigned int *) &VICVectAddr0;
  pSFR += can_isrvect; // Set to desired interrupt vector
  
  pSFR2 = (unsigned int *) &VICVectCntl0;
  pSFR2 += can_isrvect; // Set to desired interrupt control

  switch (can_port)
  {
  case 1:
    // Set interrupt vector
    *pSFR = (unsigned long) CANAll_CANISR_Rx1; 
    // Use this Interrupt for CAN Rx1 Interrupt
    *pSFR2 = 0x20 | 26;
    // Enable CAN Rx1 Interrupt
    VICIntEnable = 0x04000000L;  
    break;
#if (MAX_CANPORTS > 1)
  case 2:
    // Set interrupt vector
    *pSFR = (unsigned long) CANAll_CANISR_Rx2; 
    // Use this Interrupt for CAN Rx2 Interrupt
    *pSFR2 = 0x20 | 27;
    // Enable CAN Rx2 Interrupt
    VICIntEnable = 0x08000000L;  
    break;
#endif
#if (MAX_CANPORTS > 2)
  case 3:
    // Set interrupt vector
    *pSFR = (unsigned long) CANAll_CANISR_Rx3; 
    // Use this Interrupt for CAN Rx3 Interrupt
    *pSFR2 = 0x20 | 28;
    // Enable CAN Rx3 Interrupt
    VICIntEnable = 0x10000000L;  
    break;
#endif
#if (MAX_CANPORTS > 3)
  case 4:
    // Set interrupt vector
    *pSFR = (unsigned long) CANAll_CANISR_Rx4; 
    // Use this Interrupt for CAN Rx4 Interrupt
    *pSFR2 = 0x20 | 29;
    // Enable CAN Rx4 Interrupt
    VICIntEnable = 0x20000000L;  
    break;
#endif
  default:
    return 0; // illegal value used
  }

  pSFR = (unsigned int *) &C1IER + offset; // Select Interrupt register
  *pSFR = 1; // Enable Receive Interrupt

  // Enter Normal Operating Mode
  pSFR = (unsigned int *) &C1MOD + offset; // Select Mode register
  *pSFR = 0; // Operating Mode 

  return 1;
}


/**************************************************************************
Installing the CAN Err ISR
as described in LPC_CANAll.h
***************************************************************************/ 
short CANAll_SetErrIRQ (
  unsigned short can_isrvect // interrupt vector number to use for Err ISR (0-15)
  )
{
unsigned int *pSFR; // pointer into SFR space

  // Double check can_isrvect value
  if (can_isrvect > 15)
  { // Illegal value for can_isrvect
    return 0;
  }

  // Set and enable err interrupt
  pSFR = (unsigned int *) &VICVectAddr0;
  pSFR += can_isrvect; // Set to desired interrupt vector
  // Set interrupt vector
  *pSFR = (unsigned long) CANAll_CANISR_Err; 
  
  pSFR = (unsigned int *) &VICVectCntl0;
  pSFR += can_isrvect; // Set to desired interrupt control
  *pSFR = 0x20 | 19;

  // Enable Interrupt source
  VICIntEnable = 0x00080000L;  

  return 1;
}


/**************************************************************************
Transmitting a CAN message on a selected CAN interface
as described in LPC_CANAll.h
***************************************************************************/ 
short CANAll_PushMessage (
  unsigned short can_port,
  CANALL_MSG *pTransmitBuf
  )
{
unsigned int *pAddr;  
unsigned int *pCandata;
unsigned int offset;
  
  // Double check can_port value
  if ((can_port < 1) || (can_port > MAX_CANPORTS))
  { // Illegal value for can_port
    return 0;
  }

  switch (can_port)
  {
  case 1:
    offset = 0x00000000L; // Use 1st set of CAN registers
    break;
#if (MAX_CANPORTS > 1)
  case 2:
    offset = 0x00001000L; // Use 2nd set of CAN registers
    break;
#endif
#if (MAX_CANPORTS > 2)
  case 3:
    offset = 0x00002000L; // Use 3rd set of CAN registers
    break;
#endif
#if (MAX_CANPORTS > 3)
  case 4:
    offset = 0x00003000L; // Use 4th set of CAN registers
    break;
#endif
  default:
    return 0; // illegal value used
  }

  pAddr = (unsigned int *) &C1SR + offset; // CANSR
  if (!(*pAddr & 0x00000004L))
  { // Transmit Channel is not available
    return 0; // No channel available
  }

  // Write DLC, RTR and FF
  pAddr = (unsigned int *) &C1TFI1 + offset;
  *pAddr = pTransmitBuf->Frame & 0xC00F0000L;  
  
  // Write CAN ID
  pAddr++;
  *pAddr = pTransmitBuf->MsgID;
 
  // Write first 4 data bytes 
  pCandata = (unsigned int *) &(pTransmitBuf->DatA);
  pAddr++;
  *pAddr = *pCandata;

  // Write second 4 data bytes 
  pCandata++;
  pAddr++;
  *pAddr = *pCandata;
  
  // Write self transmission request
  pAddr = (unsigned int *) &C1CMR + offset;
  *pAddr = 0x30; // Self Transmission Request Buf 1

  return 1;
}


/**************************************************************************
Receiving a CAN message
as described in LPC_CANAll.h
***************************************************************************/ 
short CANAll_PullMessage (
  unsigned short can_port,
  CANALL_MSG *pReceiveBuf
  )
{
unsigned int *pSrc; // Source pointer
unsigned int *pDst; // Destination pointer

  // Double check can_port value
  if ((can_port < 1) || (can_port > MAX_CANPORTS))
  { // Illegal value for can_port
    return 0;
  }
  can_port--; // Adjust to 0 - MAX_CANPORTS-1

  // Check if something is in RxQueue
  if ((mRxIN[can_port]) == (mRxOUT[can_port]))
  { // Queue is empty
    return 0;
  }
  // Pointers are different, so something is in queue

  // Initialize pointers
  pSrc = (unsigned int *) &(mRxCAN[can_port][mRxOUT[can_port]]);
  pDst = (unsigned int *) &(pReceiveBuf->Frame);
  *pDst = *pSrc; // Copy Frame

  pSrc++;
  pDst++;
  *pDst = *pSrc; // Copy MsgID

  pSrc++;
  pDst++;
  *pDst = *pSrc; // Copy DatA

  pSrc++;
  pDst++;
  *pDst = *pSrc; // Copy DatB

  // Adjust OUT pointer
  mRxOUT[can_port]++;
  if (mRxOUT[can_port] >= MAX_QUEUE)
  {
    mRxOUT[can_port] = 0;
  }

  return 1;
}


/**************************************************************************
PRIVATE FUNCTIONS
***************************************************************************/ 

/**************************************************************************
DOES:    Interrupt Service Routine for CAN Errors
GLOBALS: none
RETURNS: nothing
***************************************************************************/ 
void CANAll_CANISR_Err (
  void
  ) 
{
  // DEBUG VERSION: do not return from Errors
  // Replace this with application specific error handling
  while (1)
  { 
  }
  VICVectAddr = 0xFFFFFFFFL; // acknowledge Interrupt
}


/**************************************************************************
DOES:    Interrupt Service Routine for CAN receive on CAN interface 1
GLOBALS: Copies the received message into the gRxCAN[0][] array
RETURNS: nothing
***************************************************************************/ 
void CANAll_CANISR_Rx1 (
  void
  ) 
{
unsigned int *pDest;

  // initialize destination pointer
  pDest = (unsigned int *) &(mRxCAN[0][mRxIN[0]]);
  *pDest = C1RFS;  // Frame

  pDest++;
  *pDest = C1RID; // ID

  pDest++;
  *pDest = C1RDA; // Data A

  pDest++;
  *pDest = C1RDB; // Data B

  // Adjust IN pointer
  mRxIN[0]++;
  if (mRxIN[0] >= MAX_QUEUE)
  {
    mRxIN[0] = 0;
  }

  C1CMR = 0x04; // release receive buffer
  VICVectAddr = 0xFFFFFFFFL; // acknowledge Interrupt
}


#if (MAX_CANPORTS > 1)
/**************************************************************************
DOES:    Interrupt Service Routine for CAN receive on CAN interface 2
GLOBALS: Copies the received message into the gRxCAN[1][] array
RETURNS: nothing
***************************************************************************/ 
void CANAll_CANISR_Rx2 (
  void
  ) 
{
unsigned int *pDest;

  // initialize destination pointer
  pDest = (unsigned int *) &(mRxCAN[1][mRxIN[1]]);
  *pDest = C2RFS;  // Frame

  pDest++;
  *pDest = C2RID; // ID

  pDest++;
  *pDest = C2RDA; // Data A

  pDest++;
  *pDest = C2RDB; // Data B

  // Adjust IN pointer
  mRxIN[1]++;
  if (mRxIN[1] >= MAX_QUEUE)
  {
    mRxIN[1] = 0;
  }

  C2CMR = 0x04; // release receive buffer
  VICVectAddr = 0xFFFFFFFFL; // acknowledge Interrupt
}
#endif // MAX_CANPORTS > 1


#if (MAX_CANPORTS > 2)
/**************************************************************************
DOES:    Interrupt Service Routine for CAN receive on CAN interface 3
GLOBALS: Copies the received message into the gRxCAN[2][] array
RETURNS: nothing
***************************************************************************/ 
void CANAll_CANISR_Rx3 (
  void
  ) 
{
unsigned int *pDest;

  // initialize destination pointer
  pDest = (unsigned int *) &(mRxCAN[2][mRxIN[2]]);
  *pDest = C3RFS;  // Frame

  pDest++;
  *pDest = C3RID; // ID

  pDest++;
  *pDest = C3RDA; // Data A

  pDest++;
  *pDest = C3RDB; // Data B

  // Adjust IN pointer
  mRxIN[2]++;
  if (mRxIN[2] >= MAX_QUEUE)
  {
    mRxIN[2] = 0;
  }

  C3CMR = 0x04; // release receive buffer
  VICVectAddr = 0xFFFFFFFFL; // acknowledge Interrupt
}
#endif // MAX_CANPORTS > 2


#if (MAX_CANPORTS > 3)
/**************************************************************************
DOES:    Interrupt Service Routine for CAN receive on CAN interface 4
GLOBALS: Copies the received message into the gRxCAN[3][] array
RETURNS: nothing
***************************************************************************/ 
void CANAll_CANISR_Rx4 (
  void
  ) 
{
unsigned int *pDest;

  // initialize destination pointer
  pDest = (unsigned int *) &(mRxCAN[3][mRxIN[3]]);
  *pDest = C4RFS;  // Frame

  pDest++;
  *pDest = C4RID; // ID

  pDest++;
  *pDest = C4RDA; // Data A

  pDest++;
  *pDest = C4RDB; // Data B

  // Adjust IN pointer
  mRxIN[3]++;
  if (mRxIN[3] >= MAX_QUEUE)
  {
    mRxIN[3] = 0;
  }

  C4CMR = 0x04; // release receive buffer
  VICVectAddr = 0xFFFFFFFFL; // acknowledge Interrupt
}
#endif // MAX_CANPORTS > 4


/*----------------------- END OF FILE ----------------------------------*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日精品一区二区| 91免费观看在线| 波多野结衣精品在线| 欧美日韩亚洲丝袜制服| 日韩免费看的电影| 一区二区激情小说| 国产精品一区一区三区| 欧美性生交片4| 国产欧美一区二区精品婷婷 | www.亚洲色图.com| 91精品婷婷国产综合久久| 中文一区一区三区高中清不卡| 午夜电影一区二区三区| 成人免费视频一区二区| 日韩欧美在线不卡| 亚洲国产另类av| 99久久久精品免费观看国产蜜| 欧美一区二区三区日韩视频| 亚洲精品国产精品乱码不99| 国产91精品一区二区| 日韩免费高清视频| 午夜精品福利视频网站| 日本久久一区二区| 国产精品福利av| 国产盗摄一区二区三区| 日韩欧美国产综合一区| 亚洲成人综合视频| 91成人在线精品| 亚洲欧美自拍偷拍色图| 丰满放荡岳乱妇91ww| 精品裸体舞一区二区三区| 日本不卡123| 欧美片网站yy| 舔着乳尖日韩一区| 欧美精品色一区二区三区| 亚洲一区免费视频| 日本丰满少妇一区二区三区| 亚洲欧美偷拍三级| 99久久精品国产精品久久| 国产精品久久毛片av大全日韩| 国产精选一区二区三区| 久久精品网站免费观看| 国产成人自拍在线| 国产视频一区不卡| 成人黄色免费短视频| 中文字幕日本不卡| 91麻豆国产精品久久| 亚洲一区二区三区影院| 91电影在线观看| 亚洲午夜电影在线观看| 日韩精品一区二区三区四区 | 亚洲一级电影视频| 欧美私人免费视频| 日日夜夜一区二区| 日韩欧美国产午夜精品| 精品一区二区三区免费观看| 精品国内二区三区| 不卡一区在线观看| 一区二区三区中文字幕电影| 337p亚洲精品色噜噜狠狠| 日本美女一区二区| 久久综合色8888| 不卡av在线网| 亚洲综合色婷婷| 日韩一区国产二区欧美三区| 国产裸体歌舞团一区二区| 18成人在线视频| 欧美日韩一区高清| 国产一区二区三区四区五区美女 | 欧美高清精品3d| 精品亚洲欧美一区| 自拍偷拍亚洲欧美日韩| 欧美日韩在线播放三区| 久久99国产精品免费| 亚洲人精品午夜| 91精品啪在线观看国产60岁| 成人黄色片在线观看| 日韩电影免费在线看| 国产欧美日韩激情| 欧美日韩精品欧美日韩精品| 国产一区二区三区精品欧美日韩一区二区三区| 国产午夜亚洲精品不卡| 欧美最猛黑人xxxxx猛交| 麻豆国产91在线播放| 亚洲激情网站免费观看| 久久精品亚洲麻豆av一区二区| 欧美性猛交xxxx乱大交退制版 | 久久成人久久鬼色| 最新国产成人在线观看| 日韩午夜在线观看| 91精品欧美一区二区三区综合在 | 国产欧美一区二区精品性色| 欧美日韩国产一二三| 懂色av一区二区三区免费观看| 日韩精品一级中文字幕精品视频免费观看 | 日韩av电影免费观看高清完整版在线观看 | 亚洲欧洲国产日韩| 精品国产成人系列| 欧美精品色一区二区三区| 91美女视频网站| 国产成人在线电影| 久热成人在线视频| 亚洲高清免费在线| 亚洲欧美日本韩国| 欧美激情资源网| 精品国产91九色蝌蚪| 3751色影院一区二区三区| 日本电影欧美片| 99re这里只有精品视频首页| 国产91露脸合集magnet| 国产露脸91国语对白| 日本欧美久久久久免费播放网| 一区二区三区免费看视频| 国产精品不卡视频| 国产精品毛片久久久久久| 久久影院午夜片一区| 日韩欧美亚洲国产精品字幕久久久| 欧美日韩国产一级| 欧美肥胖老妇做爰| 欧美精三区欧美精三区| 欧美久久高跟鞋激| 9191成人精品久久| 欧美一区日本一区韩国一区| 91精品国产综合久久久久久久 | 精品国产区一区| 日韩一区二区精品在线观看| 91麻豆精品国产自产在线观看一区| 欧美性色综合网| 国产亚洲精品福利| 久久午夜老司机| 国产欧美日韩另类一区| 中文字幕二三区不卡| 综合久久一区二区三区| 一区二区三区中文在线| 亚洲国产成人av好男人在线观看| 性欧美疯狂xxxxbbbb| 日韩精品乱码免费| 激情综合一区二区三区| 国产精品一区三区| av亚洲精华国产精华精华| 91福利国产成人精品照片| 欧美日韩一级大片网址| 日韩欧美专区在线| 精品国产乱码久久久久久浪潮| 国产偷国产偷精品高清尤物| 中文字幕精品一区| 亚洲成人综合网站| 国产美女娇喘av呻吟久久| www.色综合.com| 欧美日韩一区在线观看| 精品国产乱码久久久久久1区2区| 欧美激情一区二区三区在线| 一区二区三区在线免费| 蜜桃视频在线观看一区| 成人性视频网站| 欧美色综合久久| 久久综合精品国产一区二区三区| 中文字幕一区二区三| 天堂一区二区在线免费观看| 国产福利电影一区二区三区| 在线免费视频一区二区| 精品国产123| 日韩理论在线观看| 奇米精品一区二区三区在线观看一| 成人国产免费视频| 91麻豆精品国产91久久久资源速度 | 3751色影院一区二区三区| 久久精品夜色噜噜亚洲a∨| 亚洲高清免费视频| 国产高清视频一区| 欧美人xxxx| 亚洲色图欧洲色图| 久久99精品国产麻豆婷婷| 在线欧美一区二区| 久久久噜噜噜久噜久久综合| 日韩激情中文字幕| 91麻豆swag| 国产欧美一区视频| 蜜桃精品视频在线| 欧美午夜宅男影院| 国产精品电影一区二区| 91香蕉视频mp4| 日韩一区二区三区高清免费看看 | 成人亚洲一区二区一| 日韩免费性生活视频播放| 亚洲二区在线观看| 成人开心网精品视频| 久久午夜电影网| 日本欧美一区二区三区乱码| 色视频欧美一区二区三区| 国产区在线观看成人精品| 久久狠狠亚洲综合| 69久久夜色精品国产69蝌蚪网 | 国产欧美精品一区二区色综合| 日韩电影在线看| 欧美亚洲动漫另类| 亚洲精品成人精品456| eeuss鲁片一区二区三区| 国产亚洲女人久久久久毛片| 国产在线视频不卡二|