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

📄 can_lib.c

📁 AVR CAN128单片机 基于IAR开发环境can通信程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*C**************************************************************************
* $RCSfile: can_lib.c,v $
*----------------------------------------------------------------------------
* Copyright (c) 2003 Atmel.
*----------------------------------------------------------------------------
* RELEASE:      $Name:  $      
* REVISION:     $Revision: 1.2 $     
* FILE_CVSID:   $Id: can_lib.c,v 1.2 2003/07/04 13:16:54 jberthy Exp $       
*----------------------------------------------------------------------------
* PURPOSE: 
* This template file can be parsed by langdoc for automatic documentation
* generation.
* FILE_PURPOSE: provide low level functions for CAN controller   
*
* Timing with 8 MHz oscillator and compiled IAR_AVR
* note:  xx : ICCAVR optimization size low
*       (xx): ICCAVR optimization speed high
*       [xx]: CC01 perf., 12 MHz oscillator and compiled with Keil V6.00i
*
* - CANSetBRP       : 2.2 (2.2) [14] us                                 
* - CANSetSJW       : 4.0 (3.6) [18] us                             
* - CANSetPRS       : 3.8 (3.2) [16] us                                 
* - CANSetPHS2      : 3.8 (3.2) [17] us                                                                               
* - CANSetPHS1      : 3.8 (3.2) [16] us                                                        
* - FindFirstChIt   : 2.2 (2.2) [24] us max (it on channel_14)                                                       
* - ConfChannel_Rx  : xx (xx) [110] us max(ide with mask),
*                     xx (xx) [ 59] us max(std with mask)                                                       
* - SendCanMsg      : 44 (33.2) [333] us max(ide, 8 data),
*                     40 (29.4) [306] us max(std, 8 data)                                                        
* - ReadCanMsg_Rx   : xx (xx) [392] us max(ide, 8 data),
*                     xx (xx) [326] us max(std, 8 data)                                                         
* - RazAllMailbox   : 187.6 (147.4) [890]  us
******************************************************************************/

/*_____ I N C L U D E - F I L E S ____________________________________________*/

#include "config.h"
#include "can_lib.h"


/*_____ G L O B A L S ________________________________________________________*/

/* variables used by everybody */
conf_t   conf_rx, conf_tx;

/* variables used by ConfChannel_Rx. */
can_id_t   can_rx_filt, can_rx_msk;

/* variables used by SendCanMsg. */
Uchar       * pt_candata_tx; 
can_id_t      can_tx_id;

/* variables used by ReadCanMsg. */
can_msg_t   * pt_st_can_rx;


/* bit decalaration used by SendCanMsg and ConfChannel_rx 
*  this variable is redeclared in conf_rx and conf_tx.
* -------------------------------------------------------*/
// bdata Uchar conf;
// Sbit( msk_ide, conf, 7);  /* only for RX   */
// Sbit( msk_rtr, conf, 6);  /* only for RX   */
// Sbit( rtr    , conf, 5);  /* for Rx and TX */
// Sbit( ide    , conf, 4);  /* for RX and TX */
// Sbit( buffer , conf, 0);  /* only for TX   */


/* bit decalaration used by ReadCanMsg 
*------------------------------------
* The declaration of NEW_CONF depend of declaration below
* #define CHANNEL_DISABLE		0x01 -> bit0 of b_var_read
* #define CHANNEL_RX_ENABLE	0x02 -> bit1 of b_var_read
* #define CHANNEL_RXB_ENABLE	0x04 -> bit2 of b_var_read
*/
// bdata Uchar b_var_read;
// Sbit( bit_read_7, b_var_read, 7);
// Sbit( bit_read_6, b_var_read, 6);
// Sbit( bit_read_5, b_var_read, 5);
// Sbit( bit_read_4, b_var_read, 4);
// Sbit( bit_read_3, b_var_read, 3);
// Sbit( bit_read_2, b_var_read, 2);
// Sbit( bit_read_1, b_var_read, 1);
// Sbit( bit_read_0, b_var_read, 0);

//#define NEW_CONF_CH_DISABLE 	bit_read_0
//#define NEW_CONF_CH_RX_ENABLE 	bit_read_1
//#define NEW_CONF_CH_RXB_ENABLE 	bit_read_2


/* bit decalaration used by FindFirstChIt and fct_can_it
*-------------------------------------------------------*/
// bdata Uchar bit_var;
// Sbit( bit_7, bit_var, 7);
// Sbit( bit_6, bit_var, 6);
// Sbit( bit_5, bit_var, 5);
// Sbit( bit_4, bit_var, 4);
// Sbit( bit_3, bit_var, 3);
// Sbit( bit_2, bit_var, 2);
// Sbit( bit_1, bit_var, 1);
// Sbit( bit_0, bit_var, 0);

// #define IT_TXOK bit_6
// #define IT_RXOK bit_5


/*_____ P R I V A T E - F U N C T I O N S - D E C L A R A T I O N ____________*/


/*_____ L O C A L S __________________________________________________________*/


/*_____ P U B L I C - F U N C T I O N S ______________________________________*/


/*_____ P R I V A T E - F U N C T I O N S ____________________________________*/


/*F****************************************************************************
* FUNCTION_NAME: RazAllMailbox                                                  
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.                                              
* FUNCTION_DATE  : 13/10/99                                                 
*   AVR RELEASE  : 23/05/03 - JT                                                 
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Mailbox, status and control registers reset    
* FUNCTION_INPUTS : void                                                          
* FUNCTION_OUTPUTS: void                                                       
******************************************************************************/
void RazAllMailbox (void)
{
  Uchar num_channel, num_data;

  for (num_channel = 0; num_channel < NB_CHANNEL; num_channel++)
  {
    CANPAGE  = (num_channel << MOBNB);
    CANSTMOB = 0;
    CANCDMOB = 0;
    CANIDT4  = 0;
    CANIDT3  = 0;
    CANIDT2  = 0;
    CANIDT1  = 0;
    CANIDM4  = 0;
    CANIDM3  = 0;
    CANIDM2  = 0;
    CANIDM1  = 0;
    for (num_data = 0; num_data < NB_DATA_MAX; num_data++)
    {
      CANMSG = 0;
    }
  }

}


/*F****************************************************************************
* FUNCTION_NAME: CanSetBRP                                                  
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.                                              
* FUNCTION_DATE  : 27/09/99                                                 
*   AVR RELEASE  : 23/05/03 - JT                                                 
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Prescaler for CAN Controler baudrate     
*                    with value pasted in parameter.                         
*                    Tscl = 2*(prescaler +1) / Fin                           
*                    -----------------------------                            
* FUNCTION_INPUTS : Uchar prescaler                  
* FUNCTION_OUTPUTS: void                                                         
******************************************************************************/
void CanSetBRP (Uchar prescaler)
{

  if (prescaler <= (BRP_msk >> BRP))
  {
    CANBT1 = prescaler << BRP;
  }
  /* else, nothing */
}


/*F***************************************************************************
* FUNCTION_NAME: CanSetSJW                                                  
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.                                              
* FUNCTION_DATE  : 27/09/99                                                 
*   AVR RELEASE  : 23/05/03 - JT                                                 
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Re_synchronization jump width for CAN    
*                    Controler baudrate with value pasted in parameter.      
*                      Tsjw = Tscl * (sjw + 1)                                
*                      -----------------------                               
* FUNCTION_INPUTS : Uchar jmpwidth                                    
* FUNCTION_OUTPUTS: void                                                        
******************************************************************************/
void CanSetSJW (Uchar jmpwidth)
{
 
  if (jmpwidth <= (SJW_msk >> SJW))
  {
    CANBT2 &= (~SJW_msk);	/* SJW field reset */
    CANBT2 |= (jmpwidth << SJW);
  }
  /* else, nothing */
}


/*F****************************************************************************
* FUNCTION_NAME: CanSetPRS                                                  
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.                                              
* FUNCTION_DATE  : 27/09/99                                                 
*   AVR RELEASE  : 23/05/03 - JT                                                 
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Programation time segment for CAN        
*                    Controler with value pasted in parameter.               
*                      Tprs = Tscl * (prs + 1)                                
*                      -----------------------                               
* FUNCTION_INPUTS : Uchar propag                                    
* FUNCTION_OUTPUTS: void                                                         
******************************************************************************/
void CanSetPRS (Uchar propag)
{

  if (propag <= (PRS_msk >> PRS))
  {
    CANBT2 &= (~PRS_msk);   /* PRS field reset */
    CANBT2 |= (propag << PRS);
  }
  /* else, nothing */
}


/*F***************************************************************************
* FUNCTION_NAME: CanSetPHS2                                                 
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.                                              
* FUNCTION_DATE  : 27/09/99                                                 
*   AVR RELEASE  : 23/05/03 - JT                                                 
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Phase segment 2 for CAN Controller       
*                    with value pasted in parameter.                         
*                      Tphs2 = Tscl * (phs2 + 1)                              
*                      -------------------------                             
* FUNCTION_INPUTS : Uchar segment2                                 
* FUNCTION_OUTPUTS: void                                                         
******************************************************************************/
void CanSetPHS2 (Uchar segment2)
{
  if (segment2 <= (PHS2_msk >> PHS2))
  {
    CANBT3 &= (~PHS2_msk);  /* PHS2 field reset */
    CANBT3 |= (segment2 << PHS2);
  }
  /* else, nothing */
}


/*F****************************************************************************
* FUNCTION_NAME: CanSetPHS1                                                 
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.                                              
* FUNCTION_DATE  : 27/09/99                                                 
*   AVR RELEASE  : 23/05/03 - JT                                                 
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Phase segment 1 for CAN Controller       
*                    with value pasted in parameter.                         
*                      Tphs1 = Tscl * (phs1 + 1)                              
*                      -------------------------                             
* FUNCTION_INPUTS : Uchar segment1 : CAN_PHS1_MIN to CAN_PHS1_MAX                                 
* FUNCTION_OUTPUTS: void                                                        
******************************************************************************/
void CanSetPHS1 (Uchar segment1)
{
  if (segment1 <= (PHS1_msk >> PHS1))
  {
    CANBT3 &= (~PHS1_msk);  /* PHS1 field reset */
    CANBT3 |= (segment1 << PHS1);
  }
  /* else, nothing */
}


/*F**************************************************************************
* FUNCTION_NAME: ConfChannel_Rx                                             
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.                                              
* FUNCTION_DATE  : 28/09/99                                                 
*   AVR RELEASE  : 23/05/03 - JT                                                 
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Configure the MOb (or channel) in reception,
*        The identifier filtered and mask are initialized with the 
*        value contain in global variables can_rx_id and can_rx_msk.     
*        The configuration is defined in globale variable conf_rx.                   
*                          
* FUNCTION_INPUTS : void
* FUNCTION_OUTPUTS: void                                                    
*----------------------------------------------------------------------------
* GLOBAL VARIABLES USED :
*	- conf_rx
*	- can_rx_filt
*	- can_rx_msk
******************************************************************************
* The variable conf_rx must contain information:                                   
*    - on ide:
*           standart (CONF_NOIDE) or 
*           extended (CONF_IDE)                     
*    - on ide mask, 
*           no mask on ide bit(CONF_NOMSK_IDE) or
*           mask on ide bit   (CONF_MSK_IDE) 
*    - on rtr:
*           data frame   (CONF_NORTR) or 
*           remote frame (CONF_RTR)                     
*    - on rtr mask, 
*           no mask on rtr bit(CONF_NOMSK_RTR) or 
*           mask on rtr bit   (CONF_MSK_RTR) 
*    - on buffer mode
*           channel is not for buffer mode (CONF_NOBUFFER) or 
*           channel is for the buffer mode (CONF_BUFFER)
*
* Exemple of configuration:                                                                   
* ------------------------                                                                   
* conf_rx = CONF_IDE | CONF_NOMSK_IDE | CONF_NORTR | CONF_NOMSK_RTR | CONF_NOBUFFER                                       
*                                                                            
******************************************************************************
* NOTE:                                                                      
*     It's very important to be sure that channel is free.                 
*     No verification is perform by this function.                          
*     The corresponding MOb (or channel) must be selected before calling
*     this function.
*
*     When conf_rx = 0 -> CONF_NOIDE | CONF_NOMSK_IDE | CONF_NORTR |
*                         CONF_NOMSK_RTR | NO_BUFFER 
*
* Exemple of use:
*---------------
*
*  can_rx_filt.ext = 0x5555555;
*  can_rx_msk.ext  = 0x00;
*  conf_rx         = CONF_IDE|CONF_MSK_IDE|CONF_NOBUFFER;
*  CAN_SET_CHANNEL(CHANNEL_1);
*  ConfChannel_Rx();
*
******************************************************************************/
void ConfChannel_Rx(void)
{

  CANSTMOB = 0x00;
  CANCDMOB = 0x00;

//  if (ide == TRUE)
  if ((conf_rx & CONF_IDE) != FALSE)
  { /* 29-bit identifier tag  */  
    CANIDT1 = CAN_SET_EXT_ID_28_21 (can_rx_filt.ext);
    CANIDT2 = CAN_SET_EXT_ID_20_13 (can_rx_filt.ext);
    CANIDT3 = CAN_SET_EXT_ID_12_5  (can_rx_filt.ext);
    CANIDT4 = CAN_SET_EXT_ID_4_0   (can_rx_filt.ext);
                                   /* RTRTAG and RBnTAG cleared */
    /* 29-bit identifier mask */
    CANIDM1 = CAN_SET_EXT_MSK_28_21 (can_rx_msk.ext);
    CANIDM2 = CAN_SET_EXT_MSK_20_13 (can_rx_msk.ext);
    CANIDM3 = CAN_SET_EXT_MSK_12_5  (can_rx_msk.ext);
    CANIDM4 = CAN_SET_EXT_MSK_4_0   (can_rx_msk.ext);
                                   /* RTRMSK and IDEMSK cleared */
                            
    CANCDMOB |= (SET<<IDE);        /* set IDE bit in CANCDMOB */
  }
  else
  { /* 11-bit identifier tag  */  
    CANIDT1 = CAN_SET_STD_ID_10_4 (can_rx_filt.std);
    CANIDT2 = CAN_SET_STD_ID_3_0 (can_rx_filt.std);
    CANIDT4 = 0;                   /* Clear RTRTAG and RB0TAG */
    /* 11-bit identifier mask */
    CANIDM1 = CAN_SET_STD_MSK_10_4 (can_rx_msk.std);
    CANIDM2 = CAN_SET_STD_MSK_3_0 (can_rx_msk.std);
    //CANIDM3 = 0; /* optional */
    CANIDM4 = 0;                   /* Clear RTRMSK and IDEMSK */

    /* IDE=0 in CANCDMOB already done at the beginning */
  }

⌨️ 快捷键说明

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