亚洲欧美第一页_禁久久精品乱码_粉嫩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

14. May. 2005:
- replaced integer types unsigned int with unsigned long where
  appropriate to avoid "target dependent sizeof(int)"
- added volatiles to avoid compiler warnings
Martin Thomas, Kaiserslautern, Germany
<eversmith@heizung-thomas.de>
***************************************************************************/ 

#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 long can_btr        // CAN BTR value used to set CAN baud rate
  )
{
volatile unsigned long *pSFR; // pointer into SFR space
volatile unsigned long *pSFR2; // pointer into SFR space
unsigned long 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 = (volatile unsigned long *) &C1MOD + offset; // Select Mode register
  *pSFR = 1; // Go into Reset mode

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

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

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

  // Set and enable receive interrupt
  pSFR = (volatile unsigned long *) &VICVectAddr0;
  pSFR += can_isrvect; // Set to desired interrupt vector
  
  pSFR2 = (volatile unsigned long *) &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 = (volatile unsigned long *) &C1IER + offset; // Select Interrupt register
  *pSFR = 1; // Enable Receive Interrupt

  // Enter Normal Operating Mode
  pSFR = (volatile unsigned long *) &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)
  )
{
volatile unsigned long *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 = (volatile unsigned long *) &VICVectAddr0;
  pSFR += can_isrvect; // Set to desired interrupt vector
  // Set interrupt vector
  *pSFR = (unsigned long) CANAll_CANISR_Err; 
  
  pSFR = (volatile unsigned long *) &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
  )
{
volatile unsigned long *pAddr;  
unsigned long *pCandata;
unsigned long 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 = (volatile unsigned long *) &C1SR + offset; // CANSR
  if (!(*pAddr & 0x00000004L))
  { // Transmit Channel is not available
    return 0; // No channel available
  }

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

  // Write second 4 data bytes 
  pCandata++;
  pAddr++;
  *pAddr = *pCandata;
  
  // Write self transmission request
  pAddr = (volatile unsigned long *) &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 long *pSrc; // Source pointer
unsigned long *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 long *) &(mRxCAN[can_port][mRxOUT[can_port]]);
  pDst = (unsigned long *) &(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 long *pDest;

  // initialize destination pointer
  pDest = (unsigned long *) &(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 long *pDest;

  // initialize destination pointer
  pDest = (unsigned long *) &(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 long *pDest;

  // initialize destination pointer
  pDest = (unsigned long *) &(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 long *pDest;

  // initialize destination pointer
  pDest = (unsigned long *) &(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一区二区三区免费野_久草精品视频
久久综合色天天久久综合图片| 亚洲美女视频一区| 亚洲成av人综合在线观看| 不卡一区中文字幕| 中文无字幕一区二区三区| 老司机午夜精品99久久| 91精品在线免费观看| 亚洲高清视频在线| 欧美视频中文字幕| 亚洲福利国产精品| 91成人在线免费观看| 一区二区三区在线视频免费| 99国产精品久| 亚洲欧美视频在线观看| 91美女在线看| 亚洲综合在线免费观看| 欧洲亚洲精品在线| 日本不卡视频一二三区| 日韩久久久久久| 国产精品88av| 亚洲激情图片qvod| 欧美情侣在线播放| 国产一区二区精品久久| 中文字幕中文在线不卡住| 97精品电影院| 久久精品国产一区二区三 | 国产精品一区免费视频| 国产精品视频一区二区三区不卡| 色综合久久综合中文综合网| 日韩电影在线一区二区三区| eeuss鲁片一区二区三区在线看| 欧美一区二区三区电影| 丁香啪啪综合成人亚洲小说 | 欧美一区二区三区精品| 国产精品亚洲视频| 亚洲精品成人少妇| 欧美日韩国产综合一区二区三区| 日本怡春院一区二区| 久久久久88色偷偷免费| 91福利国产成人精品照片| 久久9热精品视频| 亚洲国产精品一区二区www在线 | 国产乱子伦视频一区二区三区 | 丰满岳乱妇一区二区三区| 亚洲男人的天堂av| 久久精品夜色噜噜亚洲aⅴ| 欧美日韩国产片| 91在线视频免费观看| 国产在线不卡一区| 六月婷婷色综合| 日本美女一区二区三区视频| 中文字幕一区二区三区在线观看| 久久亚洲捆绑美女| 日韩欧美一级二级三级久久久| 欧美三级电影网| 欧美日韩一区 二区 三区 久久精品| 国产一区二区电影| 精品午夜一区二区三区在线观看| 日本伊人精品一区二区三区观看方式| 亚洲欧洲99久久| 亚洲国产va精品久久久不卡综合| 亚洲日本一区二区三区| 国产精品久久久久四虎| 亚洲视频 欧洲视频| 亚洲一区二区三区视频在线播放| 亚洲成人一区二区| 日本欧美肥老太交大片| 激情五月激情综合网| av不卡在线播放| 韩国成人在线视频| 国产aⅴ综合色| 欧美影院精品一区| 51午夜精品国产| 国产欧美一区二区三区鸳鸯浴 | 欧美aaaaaa午夜精品| 久久99精品久久久久久动态图| 国产精品中文字幕一区二区三区| 国产成人亚洲综合a∨婷婷| av在线这里只有精品| 欧美亚洲综合一区| wwww国产精品欧美| 亚洲综合清纯丝袜自拍| 麻豆精品一区二区| 成人一区二区视频| 韩国女主播成人在线| 国产酒店精品激情| 7777精品伊人久久久大香线蕉的 | 久久国产乱子精品免费女| 国产成人精品亚洲午夜麻豆| 欧美性感一类影片在线播放| 国产女同性恋一区二区| 秋霞午夜av一区二区三区| 99视频在线观看一区三区| 日韩视频在线永久播放| 亚洲成av人在线观看| 91免费国产在线观看| 欧美精品一区二区三区一线天视频| 亚洲一区二区不卡免费| 91在线视频在线| ㊣最新国产の精品bt伙计久久| 国产一区二区三区在线观看精品| 欧美老年两性高潮| 亚洲小说春色综合另类电影| 91黄色激情网站| 亚洲精品高清在线观看| 在线看国产一区二区| 国产精品丝袜在线| gogogo免费视频观看亚洲一| 中文字幕在线观看一区| 色婷婷精品久久二区二区蜜臂av | 欧美精品在线观看播放| 亚洲国产精品一区二区www| 欧美三级午夜理伦三级中视频| 亚洲摸摸操操av| 欧美视频完全免费看| 亚洲在线视频一区| 777久久久精品| 欧美a级理论片| 中文字幕不卡在线观看| 成人av一区二区三区| 亚洲成人动漫av| 久久蜜桃av一区精品变态类天堂| 国产成人福利片| 一级精品视频在线观看宜春院| 欧美一a一片一级一片| 韩国中文字幕2020精品| 一区精品在线播放| 日韩欧美在线网站| 99久久精品国产麻豆演员表| 天堂在线一区二区| 国产视频一区在线观看| 在线观看日产精品| 国产一区二区三区在线观看精品| 国产精品免费久久| 精品久久久久久久人人人人传媒| 成人一级片网址| 日韩avvvv在线播放| 亚洲欧美日韩国产另类专区| 精品国产免费人成在线观看| 欧美性感一区二区三区| 粉嫩一区二区三区在线看| 日本不卡一二三| 午夜精品视频一区| 亚洲三级在线免费观看| 久久久久久久久久久久久久久99| 91电影在线观看| av网站一区二区三区| 成人自拍视频在线| 三级久久三级久久久| 91麻豆精品国产91久久久久久久久 | 日韩免费看的电影| 538在线一区二区精品国产| 欧美日韩久久不卡| 欧美性猛片aaaaaaa做受| 日本国产一区二区| 欧美性生活影院| 欧美老女人第四色| 欧美一级欧美一级在线播放| 91精品国产综合久久久蜜臀粉嫩| 欧美四级电影在线观看| 欧美日韩一区二区在线观看| 欧美精品丝袜久久久中文字幕| 欧美三级韩国三级日本三斤 | 日本道色综合久久| 色94色欧美sute亚洲线路二| 91精品办公室少妇高潮对白| 91蜜桃网址入口| 欧美久久久久久久久久| 亚洲精品一区二区三区福利| 国产精品不卡一区| 亚洲国产精品久久人人爱蜜臀| 秋霞成人午夜伦在线观看| 国产高清在线精品| 色悠久久久久综合欧美99| 日韩一级片在线播放| 久久精品欧美一区二区三区麻豆| 亚洲特黄一级片| 精品亚洲免费视频| 日本久久电影网| 久久精品在这里| 亚洲va欧美va天堂v国产综合| 国产精品一卡二| 7777精品伊人久久久大香线蕉的| 久久精品无码一区二区三区| 亚洲影视在线观看| 成人免费福利片| 欧美成人vps| 日日摸夜夜添夜夜添亚洲女人| 国产美女在线精品| 欧美日韩视频在线第一区| 亚洲三级久久久| 成人午夜电影小说| 欧美经典三级视频一区二区三区| 三级亚洲高清视频| 欧美性大战久久久久久久| 亚洲欧美日韩中文播放| 成人午夜视频福利| 亚洲国产精品成人久久综合一区| 国内精品久久久久影院色| 欧美第一区第二区|