⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpuser.c

📁 Controller Area Network Programming Interface Environment Ver0.8。 CanPie版本0.8. CAN总线通讯编程接口源代码。
💻 C
字号:
/*****************************************************************************\*  CANpie                                                                     **                                                                             **  File        : cpuser.c                                                     **  Description :                                                              **  Author      : Uwe Koppe                                                    **  e-mail      : koppe@microcontrol.net                                       **                                                                             ** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **                                                                             **   This program is free software; you can redistribute it and/or modify      **   it under the terms of the GNU General Public License as published by      **   the Free Software Foundation; either version 2 of the License, or         **   (at your option) any later version.                                       **                                                                             ** - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - **                                                                             **  History                                                                    **  Vers.    Date        Comment                                         Aut.  **  -----    ----------  ---------------------------------------------   ----  **  0.1      11.02.1999  Initial version                                 UK    **  0.2      29.04.1999  Changed structures, new data type definitions   UK    **  0.3      01.09.1999  Adaption to version 0.3 of the CANpie Doc.      UK    **  0.4      18.01.2000  added function calls in CpUserAppInit(), i.e.   UK    **                       CpUserBaudrate() and CpFilterAll(),                   **                       changed place of CpVar_InitFlag                       **  0.5                  - no changes -                                        **  0.6      15.06.2000  set to CANpie release 0.6                       UK    **  0.7                  - no changes -                                      	**  0.8      21.06.2001  init to default baudrate                        UK   	**                                                                             *\*****************************************************************************/#include "cpcore.h"#include "cpfifo.h"#include "cpfilter.h"#include "cpuser.h"/*------------------------------------------------------------------------** CpUserAppInit()***/_U08 Cp_PREFIX CpUserAppInit( _U08 channel,                              _U16 rcvFifoSize, _U16 trmFifoSize, _U16 timeout){   _U16        initMask = 0;   _U08        err_code;#if   CP_SMALL_CODE == 0   //--- test the channel number --------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized ---------------------   if( (CpVar_InitFlag >> channel) & 0x0001) return (CpErr_INIT_READY);#endif   //--- set up the FIFOs ---------------------------------   err_code = CpFifoSetup(channel,CP_FIFO_RCV, rcvFifoSize);   if (err_code != CpErr_OK) return (err_code);   err_code = CpFifoSetup(channel,CP_FIFO_TRM, trmFifoSize);   if (err_code != CpErr_OK) return (err_code);            //--- init the core driver -----------------------------   err_code = CpCoreInitDriver(channel);   if (err_code != CpErr_OK) return (err_code);   //--- mark the channel as initialized ------------------   initMask = (1 << channel);   CpVar_InitFlag = CpVar_InitFlag | initMask;   //--- init baudrate ------------------------------------   err_code = CpUserBaudrate(channel, CP_DEFAULT_BAUDRATE);   if (err_code != CpErr_OK) return (err_code);   //--- setup filter -------------------------------------   CpUserFilterAll(channel, TRUE);   //--- clear pointer for callback functions -------------   CpInt_ReceiveHandler[channel]    = 0;   CpInt_TransmitHandler[channel]   = 0;   CpInt_ErrorHandler[channel]      = 0;      return (CpErr_OK);}/*------------------------------------------------------------------------** CpUserAppDeInit()***/_U08 Cp_PREFIX CpUserAppDeInit(_U08 channel){   _U08  err_code;   _U16  initMask;#if   CP_SMALL_CODE == 0   //--- test the channel number --------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized ---------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif   //--- remove the core driver ---------------------------   err_code = CpCoreDeInitDriver(channel);   if (err_code != CpErr_OK) return (err_code);   //--- remove the FIFOs ---------------------------------   //--- remove initialization flag -----------------------   initMask = (1 << channel);   initMask = ~initMask;   CpVar_InitFlag = CpVar_InitFlag & initMask;   return(CpErr_OK);}/*------------------------------------------------------------------------** CpUserBaudrate()***/_U08 Cp_PREFIX CpUserBaudrate(_U08 channel, _U08 baud){   int   offset = 0;    /* Offset for Bit-Timing Table   */#if   CP_SMALL_CODE == 0   //--- test the channel number ------------------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized -------------------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif   //--- get the Bit-Timing values and call the core function -------   offset = baud + (channel * CP_NUMBER_OF_BAUDRATES);   return ( CpCoreBaudrate(channel,                           CpStruct_BitTimingTable[offset].btr0,                           CpStruct_BitTimingTable[offset].btr1,                           CpStruct_BitTimingTable[offset].sjw)  );}/*------------------------------------------------------------------------** CpUserFifoClear()***/_U08 Cp_PREFIX CpUserFifoClear(_U08 channel, _U08 buffer){   _U08  err_code;#if   CP_SMALL_CODE == 0   //--- test the channel number ------------------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized -------------------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif   //--- clear the FIFO ---------------------------------------------   err_code = CpFifoClear(channel, CP_FIFO_RCV);   if (err_code) return (err_code);   err_code = CpFifoClear(channel, CP_FIFO_TRM);   if (err_code) return (err_code);   return(CpErr_OK);   }/*------------------------------------------------------------------------** CpUserFilterAll()***/_U08 Cp_PREFIX CpUserFilterAll(_U08 channel, _BIT enable){#if   CP_SMALL_CODE == 0   //--- test the channel number ------------------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized -------------------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif#if   CP_SW_FILTER == 0   return ( CpErr_NOT_SUPPORTED );#elif CP_SW_FILTER == 1   return ( CpFilterAll(channel, enable) );#elif CP_SW_FILTER == 2   return ( CpCoreFilterAll(channel, enable) );#else#error   Wrong definition for symbol CP_SW_FILTER !#endif}/*------------------------------------------------------------------------** CpUserFilterMsg()***/_U08 Cp_PREFIX CpUserFilterMsg(_U08 channel, _U16 id, _BIT enable){#if   CP_SMALL_CODE == 0   //--- test the channel number ------------------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized -------------------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif#if   CP_SW_FILTER == 0   return ( CpErr_NOT_SUPPORTED );#elif CP_SW_FILTER == 1   return ( CpFilterMsg(channel, id, enable) );#elif CP_SW_FILTER == 2   return ( CpCoreFilterMsg(channel, id, enable) );#else#error   Wrong definition for symbol CP_SW_FILTER !#endif}/*------------------------------------------------------------------------** CpUserIntFunctions()***/_U08 Cp_PREFIX CpUserIntFunctions(  _U08 channel,                                    _U08 (* rx_handler)  (CpStruct_CAN *),                                    _U08 (* tx_handler)  (CpStruct_CAN *),                                    _U08 (* err_handler) (_U08) ){#if   CP_SMALL_CODE == 0   //--- test the channel number ------------------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized -------------------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif   CpInt_ReceiveHandler[channel]    = rx_handler;   CpInt_TransmitHandler[channel]   = tx_handler;   CpInt_ErrorHandler[channel]      = err_handler;      return(CpErr_OK);}/*------------------------------------------------------------------------** CpUserMsgRead()***/_U08 Cp_PREFIX CpUserMsgRead(_U08 channel, CpStruct_CAN * msgPtr){   _U08  err_code = 0;#if   CP_SMALL_CODE == 0   //--- test the channel number ------------------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized -------------------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif#if CP_INT_HANDLER == 0   //--- use polling if there is no Interrupt-Handler ---------------   CpCoreMsgReceive(channel);#endif   //--- get message from FIFO --------------------------------------   err_code = CpFifoPop(channel, CP_FIFO_RCV, msgPtr);   if (err_code) return (err_code);    return (CpErr_OK);}/*------------------------------------------------------------------------** CpUserMsgWrite()***/_U08 Cp_PREFIX CpUserMsgWrite(_U08 channel, CpStruct_CAN * msgPtr){   _U08  err_code = 0;#if   CP_SMALL_CODE == 0   //--- test the channel number ------------------------------------   if( (channel + 1) > CP_CHANNEL_MAX) return (CpErr_CHANNEL);   //--- check if already initialized -------------------------------   if( !( (CpVar_InitFlag >> channel) & 0x0001) ) return (CpErr_INIT_MISSING);#endif   //--- put message into FIFO --------------------------------------   err_code = CpFifoPush(channel, CP_FIFO_TRM, msgPtr);   if (err_code) return (err_code);   //--- transmit the message ---------------------------------------   CpCoreMsgTransmit(channel);   return (CpErr_OK);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -