📄 can_lib.c
字号:
/*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 + -