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

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

?? r591can.c

?? 基于p87c591的can通訊驅動程序源碼
?? C
字號:
/*======================================================================*/
/* NAME:    r591can.c                                                   */
/* INFO:    CAN module for the PHYTEC training board equipped with      */
/*          PHYTEC phyCORE 591 and Philips P8x591 Microcontroller       */
/* RIGHTS:  Embedded Systems Academy   www.esacademy.com                */
/* DETAILS: Using a CAN bit rate of 125kbit with a 12MHz clock          */
/*          Filters can be set to screen for 11-bit ID and 2 data bytes */
/*----------------------------------------------------------------------*/
/* To get BTRx timing values for other speeds, consult the              */
/* Microcontroller Peripheral Timing Calculators provided by the        */
/* Embedded Systems Academy at www.esacademy.com/faq/calc/philips.htm   */
/*----------------------------------------------------------------------*/
/*          BASED ON THE CAN EXAMPLE PROVIDED BY PHYTEC                 */
/* HISTORY: V1.0   Pf    21-FEB-2000                                    */
/*          V1.1   Pf    16-JUN-2000                                    */
/*======================================================================*/

#include "reg591.h"
#include "reg591ex.h"
#include "r591can.h"


/*----------------------- GLOBAL SUBROUTINES ---------------------------*/

/*======================================================================*/
/* FUNCTION:   init_can_125_12                                          */
/* DESCRIPTION:Initializes the CAN interface. Bus operates at 125kBit,  */
/*             if processor clock is 12MHz. Screeners are set to        */
/*             "one long filter for std messages.                       */
/* CAUTION:    Does not initialize filters - nothing will be received   */
/*             unless screeners are set using set_screener_std          */
/* INPUT:      none                                                     */
/* OUTPUT:     none                                                     */
/*======================================================================*/
void init_can_125_12 ( void )
{
BYTE i;

   CANMOD = 0x01;                   /* Reset mode for initialization */

/* BTR0 and BTR1 determine the baudrate and sample point position       */
   CANADR = BTR0;                   /* set address to BTR0 register */
   CANDAT = 0x85;                   /* write data to BTR0 (auto INC CANADR */
   CANADR = BTR1;                   /* set address to BTR1 register */
   CANDAT = 0x2B;                   /* write data to BTR1 */

/* To get BTRx timing values for other speeds, consult the              */
/* Microcontroller Peripheral Timing Calculators provided by the        */
/* Embedded Systems Academy at www.esacademy.com/faq/calc/philips.htm   */

/* Clear all acceptance filters and masks, receive nothing */
   CANADR = ACR0;
   for(i=1;i>=32;i++)
      CANDAT = 0;

/* Set acceptance filter mode to accept standard frames with single     */
/* acceptance filter.                                                   */
   CANADR = ACFMODE;                /* acceptance filter mode register */
   CANDAT = 0x55;                   /* all banks -> one long filter */
   CANADR = ACFENA;                 /* acceptance filter enable register */
   CANDAT = 0x55;                   /* enable filter for all banks */

   CANMOD = 0x00;                   /* release CAN controller */

   while (CANSTA & 0x80);           /* wait until controller is active */
}


/*======================================================================*/
/* FUNCTION:   set_screener_std                                         */
/* DESCRIPTION:Sets one of the four screeners (acceptance filters) of   */
/*             the CAN controller.                                      */
/* CAUTION:    Does assume the screeners are set-up to be used as "one  */
/*             long filter for standard messages"                       */
/* INPUT:      Screener - 1 to 4, one of the four screeners             */
/*             ID_Mask - Bit set: corresponding bit in ID is don't care */
/*               Bit clear: corresponding bit in ID must match ID_Match */
/*             ID_Match - Match/Code value for ID                       */
/*             B1_Mask - Bit set: cor. bit in data byte 1 is don't care */
/*               Bit clear: cor. bit in data byte 1 must match B1_Match */
/*             B1_Match - Match/Code value for data byte 1              */
/*             B2_Mask - Bit set: cor. bit in data byte 2 is don't care */
/*               Bit clear: cor. bit in data byte 2 must match B2_Match */
/*             B2_Match - Match/Code value for data byte 2              */
/* OUTPUT:     none                                                     */
/*======================================================================*/
void set_screener_std ( BYTE Screener,
                        WORD ID_Mask, WORD ID_Match,
                        BYTE B1_Mask, BYTE B1_Match,
                        BYTE B2_Mask, BYTE B2_Match)
{
   Screener -= 1;
   Screener &= 0x3;                 /* ensure 0 <= Screener <= 3 */

   CANADR = ACFENA;                 /* acceptance filter enable register*/

   switch (Screener)
   {
   case 0: CANDAT &= 0xFE; break;   /* disable bank 1 */
   case 1: CANDAT &= 0xFB; break;   /* disable bank 2 */
   case 2: CANDAT &= 0xEF; break;   /* disable bank 3 */
   case 3: CANDAT &= 0xBF; break;   /* disable bank 4 */
   }

/* Initialize acceptance filter - Mask  */
   CANADR = AMR0 + (Screener * 8);  /* acceptance mask register bank "Screener" */
   CANDAT = (BYTE) (ID_Mask >> 3);
   CANDAT = (BYTE) (((ID_Mask & 0x07) << 5) | 0x1F);
   CANDAT = B1_Mask;
   CANDAT = B2_Mask;

/* Initialize acceptance filter - Code / Match */
   CANADR = ACR0 + (Screener * 8);  /* acceptance code register bank "Screener" */
   CANDAT = (BYTE) (ID_Match >> 3);
   CANDAT = (BYTE) (ID_Match & 0x07) << 5;
   CANDAT = B1_Match;
   CANDAT = B2_Match;

   CANADR = ACFENA;                 /* acceptance filter enable register*/
   switch (Screener)
   {
   case 0: CANDAT |= 0x01; break;   /* enable bank 1 */
   case 1: CANDAT |= 0x04; break;   /* enable bank 2 */
   case 2: CANDAT |= 0x10; break;   /* enable bank 3 */
   case 3: CANDAT |= 0x40; break;   /* enable bank 4 */
   }
}


/*======================================================================*/
/* FUNCTION:   transmit_message                                         */
/* DESCRIPTION:Transmits a single CAN message                           */
/* CAUTION:    Before transmitting, the function WAITS until the        */
/*             CAN controller is ready for the next data set            */
/* INPUT:      pTransmitBuf - data structure with the message           */
/* OUTPUT:     none                                                     */
/*======================================================================*/
void transmit_message ( MSG_BUF *pTransmitBuf )
{
DWORD Identifier;                   /* CAN message identifier */
BYTE  Length;                       /* lenght of data frame */
BYTE  i;                            /* local loop counter */

/* Prepare length code and identifier.                                  */
   Length     = pTransmitBuf->LEN;
   Identifier = (pTransmitBuf->ID << 5);

/* Wait until write access to CAN controller buffer is allowed          */
   while ( !(CANSTA & 0x04) );

/* Write message to transmit buffer                                     */
   CANADR = TBF;                    /* adress to transmit buffer */
   CANDAT = Length;                 /* write Length code */
   CANDAT = (BYTE)(Identifier >> 8);
   CANDAT = (BYTE)Identifier;       /* write identifier */
   for (i=0; i < Length; i++)       /* write data bytes */
      CANDAT = *(BYTE *)(pTransmitBuf->BUF+i); /* copy data byte  */

/* Init a transmission request.                                         */
   CANCON  = 0x01;
}


/*======================================================================*/
/* FUNCTION:   receive_message                                          */
/* DESCRIPTION:Receives a single standard ID CAn mesage                 */
/* CAUTION:    Will only recive something, if a message is actually     */
/*             pending in the FIFO of the CAN controller                */
/* INPUT:      pReceiveBuf - Pointer to data structure for message      */
/* OUTPUT:     pReceiveBuf - the received message                       */
/*             RETURNS 0, if there was no message to receive            */
/*             RETURNS 0xFF, if a message was received                  */
/*======================================================================*/
BYTE receive_message(MSG_BUF *pReceiveBuf)
{
DWORD Identifier;                   /* Definition of vars */
BYTE  Length;
BYTE  i;

/* Check the CAN status register for received message                   */
   if ( CANSTA & 0x01)
   {                                /* Message received! */

      CANADR       = RBF;           /* set address to receive buffer */
      Length       = CANDAT & 0x0F;
      Identifier   = (DWORD)CANDAT; /* read identifier */
      Identifier <<= 8;
      Identifier  |= (DWORD) CANDAT;
      Identifier >>= 5;
      CANADR       = RBF + 3;       /* set address to data bytes */

/* Copy message to application message buffer.                          */
      pReceiveBuf->ID = Identifier;
      pReceiveBuf->LEN = Length;

/* Read data bytes and write to buffer                                  */
      for (i=0; i < Length; i++)
    	   *(BYTE *)(pReceiveBuf->BUF+i) = CANDAT; /* copy bytes */

      CANCON = 0x0C;                /* release receive buffer */

      return (0xFF);                /* Return TRUE, msg rcvd */
   }
   else                             /* Return False, no msg rcvd */
      return (0);
}


/*======================================================================*/
/* FUNCTION:   check_busoff_state                                       */
/* DESCRIPTION:Checks, if the CAN controller went into BUS OFF state    */
/* INPUT:      none                                                     */
/* OUTPUT:     RETURNS 0, if CAN controller still active                */
/*             RETURNS 0xFF, if CAN controller in BUS OFF state         */
/*======================================================================*/
BYTE check_busoff_state (void)
{
/* Check status register for bus-off state                              */
   if (CANSTA & 0x80)
      return (0xFF);	            /* CAN controller is in bus-off */
   else
      return (0);                   /* CAN controller active */
}

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






?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品72免费观看| 亚洲欧洲一区二区在线播放| 色女孩综合影院| 99综合电影在线视频| 成人看片黄a免费看在线| 成人精品免费网站| 99国产精品久久| 欧美中文字幕一区| 69堂精品视频| 精品国产污污免费网站入口| 国产欧美一区二区精品仙草咪| 久久精品亚洲麻豆av一区二区| 久久久久久久久久电影| 18欧美亚洲精品| 午夜亚洲国产au精品一区二区| 午夜精品一区二区三区免费视频 | 老汉av免费一区二区三区| 奇米777欧美一区二区| 韩国午夜理伦三级不卡影院| 国产91精品一区二区麻豆亚洲| 高清beeg欧美| 欧美色图激情小说| 精品久久国产老人久久综合| 国产精品视频九色porn| 亚洲一区二区三区视频在线播放 | 一本色道综合亚洲| 在线播放91灌醉迷j高跟美女 | 99国产精品视频免费观看| 在线观看精品一区| 欧美成人猛片aaaaaaa| 国产精品美女一区二区在线观看| 亚洲精品一二三| 美女在线视频一区| 99久久国产免费看| 精品久久久三级丝袜| 亚洲精品欧美激情| 国内欧美视频一区二区| 色菇凉天天综合网| 久久精子c满五个校花| 亚洲永久精品大片| 成人aaaa免费全部观看| 在线成人免费视频| 亚洲欧美国产三级| 国内精品免费**视频| 一本久久综合亚洲鲁鲁五月天| 日韩欧美一级二级三级久久久| 亚洲日本青草视频在线怡红院| 精品一区二区三区在线观看| 欧美专区亚洲专区| 亚洲欧洲精品天堂一级| 精品无码三级在线观看视频| 欧美日韩中文精品| 国产精品久久久久久久久免费丝袜| 免费观看在线综合| 欧美日韩黄视频| 亚洲综合激情网| 91论坛在线播放| 国产精品久久久久久久久免费相片 | 欧美电视剧免费观看| 亚洲一区二区欧美激情| 99国产精品国产精品久久| 国产日产亚洲精品系列| 精品影院一区二区久久久| 欧美一卡二卡三卡四卡| 午夜电影一区二区三区| 欧美日韩一区二区三区四区 | 欧美日韩国产首页| 一区二区三区在线视频观看| 成人动漫精品一区二区| 国产午夜亚洲精品午夜鲁丝片| 日韩高清欧美激情| 欧美一二区视频| 久久91精品国产91久久小草 | 国产精品电影院| 丁香网亚洲国际| 国产精品色呦呦| 成人免费不卡视频| 亚洲日本一区二区| 91久久人澡人人添人人爽欧美 | 欧美日韩的一区二区| 日韩—二三区免费观看av| 91精品国产入口在线| 日韩一区欧美二区| 精品久久久久香蕉网| 国产伦精品一区二区三区视频青涩| 欧美mv日韩mv| 成人免费毛片嘿嘿连载视频| 国产精品欧美久久久久无广告| a在线播放不卡| 一区二区久久久久久| 欧美精品在线观看一区二区| 蜜桃av一区二区| 久久精品无码一区二区三区| 成人av在线影院| 亚洲自拍另类综合| 日韩欧美一区二区在线视频| 黄页网站大全一区二区| 中文字幕一区二区三区在线播放| 91免费国产视频网站| 午夜成人免费视频| 久久九九99视频| 欧美在线观看18| 国产永久精品大片wwwapp| 亚洲色图制服诱惑| 日韩午夜小视频| www.欧美精品一二区| 亚洲成人免费av| 久久精品人人做人人综合 | 一区二区视频在线看| 欧美一级精品大片| 成人精品gif动图一区| 天天色综合天天| 国产精品乱人伦中文| 欧美精品在线观看一区二区| 成人综合婷婷国产精品久久免费| 亚洲欧美日韩在线| 欧美精品一区二区三区四区| 欧美亚男人的天堂| 成人午夜激情在线| 美女网站在线免费欧美精品| 亚洲欧美另类在线| 国产亚洲一本大道中文在线| 欧美女孩性生活视频| 成人app网站| 国产精品综合视频| 欧美aaaaa成人免费观看视频| 国产精品久久久久四虎| 久久久综合网站| 91精品国产综合久久香蕉麻豆 | 91精品啪在线观看国产60岁| 色综合久久88色综合天天免费| 理论片日本一区| 首页亚洲欧美制服丝腿| 亚洲精品国久久99热| 国产午夜亚洲精品不卡| 日韩免费视频一区| 欧美一区二区私人影院日本| 欧美性高清videossexo| caoporn国产一区二区| 国产成人夜色高潮福利影视| 久久99精品国产91久久来源| 水野朝阳av一区二区三区| 亚洲午夜精品一区二区三区他趣| 中文字幕一区二区三区视频 | 精品欧美一区二区在线观看| 欧美美女激情18p| 色婷婷av一区二区三区大白胸 | 婷婷六月综合网| 亚洲图片欧美色图| 亚洲自拍与偷拍| 亚洲国产日韩综合久久精品| 亚洲国产aⅴ天堂久久| 亚洲第一av色| 青娱乐精品在线视频| 麻豆精品一区二区三区| 国内精品伊人久久久久av影院| 久久精品国产第一区二区三区 | 国产丝袜欧美中文另类| 国产色一区二区| 国产精品毛片久久久久久久| 国产精品女上位| 亚洲免费观看视频| 亚洲线精品一区二区三区八戒| 婷婷综合五月天| 国产一区二区三区在线看麻豆| 国产精品一区二区黑丝| 成人国产免费视频| 在线这里只有精品| 欧美精品777| 久久久99精品免费观看不卡| 国产精品动漫网站| 亚洲国产视频a| 精品在线播放午夜| 99re成人精品视频| 欧美精品久久99久久在免费线 | 色噜噜狠狠一区二区三区果冻| 欧美一级精品大片| 精品日韩在线观看| 国产精品色婷婷| 亚洲成人免费av| 国产精品一区二区三区乱码| 91福利区一区二区三区| 91精品国产福利| 国产精品久久午夜夜伦鲁鲁| 亚洲国产一区二区视频| 国产精品1区2区3区在线观看| 91丨porny丨在线| 欧美xfplay| 亚洲一本大道在线| 国产精品小仙女| 7777精品伊人久久久大香线蕉超级流畅 | 国产精品久久久久久久久久免费看| 伊人婷婷欧美激情| 国精产品一区一区三区mba视频| av中文字幕一区| 日韩一区二区三区三四区视频在线观看 | 午夜视频在线观看一区二区三区| 国产精品伊人色| 日韩一区二区三区视频在线| 亚洲乱码日产精品bd |