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

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

?? lpc_canall.c

?? winarm for lpc2129 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在线播放| 黄色资源网久久资源365| 偷拍自拍另类欧美| 九九视频精品免费| 国产不卡视频在线播放| 99re这里都是精品| 一本到一区二区三区| 欧美日韩一区二区三区四区五区| 91精品久久久久久久99蜜桃| 精品国内片67194| 欧美tickling网站挠脚心| 久久综合狠狠综合久久综合88| 中文字幕av一区二区三区高| 中文字幕亚洲不卡| 亚洲成人tv网| 精品写真视频在线观看| 91免费版在线| 欧美日韩高清影院| 久久久噜噜噜久噜久久综合| 国产精品久久久久影院亚瑟| 一区二区三区四区亚洲| 久久精品国产一区二区三区免费看| 激情五月婷婷综合网| 成人avav影音| 色婷婷综合久色| 欧美成人精品3d动漫h| 成人免费一区二区三区视频| 日本三级亚洲精品| 成人福利视频在线| 欧美丰满美乳xxx高潮www| 久久综合色婷婷| 亚洲欧美乱综合| 免费欧美在线视频| 91欧美一区二区| 日韩欧美国产小视频| 亚洲一区二区三区四区在线观看 | 国产伦精品一区二区三区在线观看| 成人一级视频在线观看| 欧美人牲a欧美精品| 国产精品国产三级国产普通话99| 美女爽到高潮91| 久久精品欧美一区二区三区不卡 | 久久99精品国产.久久久久 | 亚洲午夜在线视频| 国产一区二区美女诱惑| 欧美精三区欧美精三区| 1024成人网| 成人精品亚洲人成在线| 欧美一级欧美三级在线观看| 亚洲六月丁香色婷婷综合久久 | 99久久综合精品| 久久久91精品国产一区二区三区| 日韩国产一二三区| 在线观看日韩av先锋影音电影院| 久久久久久久久免费| 美女网站色91| 欧美日韩在线免费视频| 亚洲啪啪综合av一区二区三区| 国产曰批免费观看久久久| 欧美性受xxxx| 亚洲精选视频在线| 成人国产一区二区三区精品| 久久综合狠狠综合久久激情| 同产精品九九九| 欧美视频日韩视频| 亚洲免费看黄网站| 成年人午夜久久久| 欧美成人在线直播| 狠狠色综合播放一区二区| 欧美一二三四在线| 午夜视频在线观看一区| 在线精品视频免费观看| 亚洲青青青在线视频| 国产盗摄精品一区二区三区在线| 久久久久久久网| 国产一区二区伦理片| 91麻豆精品国产自产在线观看一区 | 日韩和欧美一区二区| 欧美日韩精品久久久| 亚洲福利电影网| 在线不卡一区二区| 美女国产一区二区| 久久日韩粉嫩一区二区三区| 国产剧情一区二区| 国产精品久久久久久久久搜平片 | 亚洲视频一二区| 91美女在线视频| 亚洲国产日韩av| 日韩一区二区电影在线| 精品一区二区三区视频在线观看| 久久久高清一区二区三区| 成人午夜电影网站| 亚洲免费观看高清完整版在线 | 五月婷婷另类国产| 欧美电影免费观看高清完整版在线 | 欧美日韩在线一区二区| 免费成人小视频| 国产日韩欧美麻豆| 色999日韩国产欧美一区二区| 亚洲高清不卡在线| 精品捆绑美女sm三区| 丁香婷婷深情五月亚洲| 亚洲激情五月婷婷| 欧美一卡二卡三卡| 懂色av一区二区三区免费观看| |精品福利一区二区三区| 欧美美女喷水视频| 国产一区二区三区最好精华液 | 欧美色网站导航| 久热成人在线视频| 中文字幕一区二区三区av| 欧美人成免费网站| 激情五月播播久久久精品| 亚洲男女一区二区三区| 欧美日韩国产小视频在线观看| 麻豆精品一区二区三区| 中文字幕永久在线不卡| 69成人精品免费视频| 日韩欧美精品三级| 99久久综合国产精品| 午夜精品久久久久久久| 久久精品日产第一区二区三区高清版 | 欧美一区二区高清| 99国产精品久久久久久久久久| 视频一区二区三区在线| 中文字幕久久午夜不卡| 欧美人xxxx| 91最新地址在线播放| 久久99国产精品免费网站| 亚洲欧洲综合另类| 久久久精品tv| 欧美一区二区私人影院日本| 99国内精品久久| 国产精品影视网| 日韩av一二三| 一区二区三区中文免费| 国产欧美精品国产国产专区| 91精品国产综合久久婷婷香蕉| 99精品欧美一区二区蜜桃免费| 老司机精品视频一区二区三区| 亚洲一区二区3| 中文字幕精品一区二区三区精品| 日韩精品综合一本久道在线视频| 色呦呦一区二区三区| 国产精品一卡二卡在线观看| 日韩激情一区二区| 亚洲午夜激情网站| 国产精品美女久久久久aⅴ| 精品国产露脸精彩对白| 91麻豆精品国产91| 欧美三级日韩三级| 色999日韩国产欧美一区二区| 国产成人亚洲综合a∨猫咪| 麻豆国产精品777777在线| 日韩精品一区第一页| 亚洲一二三区在线观看| 亚洲精品ww久久久久久p站| 国产精品三级av| 国产欧美1区2区3区| 久久久国产一区二区三区四区小说 | 中文一区二区在线观看| 久久久久久**毛片大全| 日韩一区二区三区观看| 这里只有精品免费| 欧美欧美欧美欧美首页| 精品视频免费在线| 精品视频一区二区三区免费| 欧美曰成人黄网| 在线观看成人小视频| 91美女在线看| 91成人看片片| 在线观看成人免费视频| 在线中文字幕一区| 在线视频一区二区三区| 一本色道综合亚洲| 在线视频综合导航| 欧美三级电影在线看| 欧美二区乱c少妇| 欧美高清视频www夜色资源网| 国产精品久久毛片av大全日韩| 国产午夜精品一区二区三区嫩草| 久久久av毛片精品| 国产精品午夜久久| 国产精品素人视频| 亚洲免费在线电影| 亚洲一区二区三区四区在线观看 | 欧美视频一区二区三区四区 | 亚洲18影院在线观看| 亚洲一级二级三级在线免费观看| 最新欧美精品一区二区三区| 亚洲三级在线播放| 亚洲在线一区二区三区| 偷拍亚洲欧洲综合| 蜜乳av一区二区| 韩国av一区二区三区在线观看| 国产精品 日产精品 欧美精品| 国产一区二区日韩精品| 成人av网站大全|