?? can_lib.c
字號:
/*C*****************************************************************************
* FILE_NAME : Can_lib.c
*----------------------------------------------------------------------------
* FILE_CREATED_BY : BERTHY JS
* FILE_CREATION_DATE: 27/09/99
*----------------------------------------------------------------------------
* FILE_PURPOSE: provide low level functions for CAN controller
*
* Timing with 12 MHz oscillator and compiled with Keil V6.00i
*
* - CANSetBRP : 14 us
* - CANSetSJW : 18 us
* - CANSetPRS : 16 us
* - CANSetPHS2 : 17 us
* - CANSetPHS1 : 16 us
* - FindFirstChIt : 24 us max(it on channel14)
* - ConfChannel_Rx : 110 us max(ide with mask), 59 us max(std with mask)
* - SendCanMsg : 333 us max(ide, 8 data) , 306 us max(std, 8 data)
* - ReadCanMsg_Rx : 392 us max(ide, 8data) , 326 us max(std, 8 data)
* - RazAllMailbox : 890 us
******************************************************************************/
/*_____ I N C L U D E - F I L E S ____________________________________________*/
#include "compiler.h"
#include "config.h"
#include "can_lib.h"
/*_____ G L O B A L S ________________________________________________________*/
/* 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); /* just for TX */
Sbit( msk_rtr, conf, 6); /* just for RX */
Sbit( rtr , conf, 5); /* commun Rx and TX */
Sbit( ide , conf, 4); /* commun RX and TX */
Sbit( buffer , conf, 0); /* just 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
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Raz mailbox, status and control register
* 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 << 4;
CANCONCH = 0;
CANSTCH = 0;
CANIDT1 = 0;
CANIDT2 = 0;
CANIDT3 = 0;
CANIDT4 = 0;
CANIDM1 = 0;
CANIDM2 = 0;
CANIDM3 = 0;
CANIDM4 = 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
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Prescaler for CAN Controler baudrate
* with value pasted in parameter.
* Tscl = 2*(prescaler +1) / Fin
* -----------------------------
* FUNCTION_INPUTS : Uchar prescaler : CAN_BAUDRATE_MIN to CAN_BAUDRATE_MAX
* FUNCTION_OUTPUTS: void
******************************************************************************/
void CanSetBRP (Uchar prescaler)
{
if ((prescaler <= CAN_PRESCALER_MAX) &&
(prescaler >= CAN_PRESCALER_MIN) )
{
CANBT1 = prescaler << 1;
}
}
/*F***************************************************************************
* FUNCTION_NAME: CanSetSJW
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.
* FUNCTION_DATE : 27/09/99
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Re_synchronization jump width for CAN
* Controler baudrate with value pasted in parameter.
* Tsjw = Tscl * (sjw + 1)
* -----------------------
* FUNCTION_INPUTS : Uchar sjw : CAN_SJW_MIN to CAN_SJW_MAX
* FUNCTION_OUTPUTS: void
******************************************************************************/
void CanSetSJW (Uchar sjw)
{
if ((sjw <= CAN_SJW_MAX) &&
(sjw >= CAN_SJW_MIN) )
{
CANBT2 &= MSK_CANBT2_SJW; /* RAZ of field sjw. */
CANBT2 |= (sjw << 5);
}
}
/*F****************************************************************************
* FUNCTION_NAME: CanSetPRS
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.
* FUNCTION_DATE : 27/09/99
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Programation time segment for CAN
* Controler with value pasted in parameter.
* Tprs = Tscl * (prs + 1)
* -----------------------
* FUNCTION_INPUTS : Uchar prs : CAN_PRS_MIN to CAN_PRS_MAX
* FUNCTION_OUTPUTS: void
******************************************************************************/
void CanSetPRS (Uchar prs)
{
if ((prs <= CAN_PRS_MAX) &&
(prs >= CAN_PRS_MIN) )
{
CANBT2 &= MSK_CANBT2_PRS; /* RAZ of field prs. */
CANBT2 |= (prs << 1);
}
}
/*F***************************************************************************
* FUNCTION_NAME: CanSetPHS2
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.
* FUNCTION_DATE : 27/09/99
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Phase segment 2 for CAN Controller
* with value pasted in parameter.
* Tphs2 = Tscl * (phs2 + 1)
* -------------------------
* FUNCTION_INPUTS : Uchar phs2: CAN_PHS2_MIN to CAN_PHS2_MAX
* FUNCTION_OUTPUTS: void
******************************************************************************/
void CanSetPHS2 (Uchar phs2)
{
if ((phs2 <= CAN_PHS2_MAX) &&
(phs2 >= CAN_PHS2_MIN) )
{
CANBT3 &= ~MSK_CANBT3_PHS2; /* RAZ of field PHS2. */
CANBT3 |= (phs2 << 4);
}
}
/*F****************************************************************************
* FUNCTION_NAME: CanSetPHS1
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.
* FUNCTION_DATE : 27/09/99
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Initialise the Phase segment 1 for CAN Controller
* with value pasted in parameter.
* Tphs1 = Tscl * (phs1 + 1)
* -------------------------
* FUNCTION_INPUTS : Uchar phs1 : CAN_PHS1_MIN to CAN_PHS1_MAX
* FUNCTION_OUTPUTS: void
******************************************************************************/
void CanSetPHS1 (Uchar phs1)
{
if ((phs1 <= CAN_PHS1_MAX) &&
(phs1 >= CAN_PHS1_MIN) )
{
CANBT3 &= MSK_CANBT3_PHS1; /* RAZ field of phs1. */
CANBT3 |= (phs1 << 1);
}
}
/*F**************************************************************************
* FUNCTION_NAME: ConfChannel_Rx
*----------------------------------------------------------------------------
* FUNCTION_AUTHOR: BERTHY J.S.
* FUNCTION_DATE : 28/09/99
*----------------------------------------------------------------------------
* FUNCTION_PURPOSE: Configure the 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 for the buffer mode (CONF_BUFFER) or
* channel is not for buffer mode (CONF_NOBUFFER)
*
* Exemple of configuration:
* ------------------------
* conf_rx = CONF_IDE | CONF_NOMSK_IDE | CONF_NORTR |
* CONF_NOMSK_RTR | CONF_NOBUFFER
*
******************************************************************************
* NOTE:
* It's very important to make sure that channel is free.
* No verification are perform by this function.
* The corresponding channel must selected before called 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()
{
CANSTCH = 0x00;
CANCONCH = 0x00;
if (ide == TRUE)
{ /* identifier = 29 bits. */
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);
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);
CANCONCH|= MSK_CANCONCH_IDE; /* set bit ide in CANCONCH. */
}
else /* In Standart mode (ide = B_FALSE), */
{ /* identifier = 11bits. */
CANIDT1 = CAN_SET_STD_ID_10_4 (can_rx_filt.std);
CANIDT2 = CAN_SET_STD_ID_3_0 (can_rx_filt.std);
CANIDM1 = CAN_SET_STD_MSK_10_4 (can_rx_msk.std);
CANIDM2 = CAN_SET_STD_MSK_3_0 (can_rx_msk.std);
CANIDM4 = 0;
}
if (rtr == TRUE)
{
CANIDT4 |= MSK_CANIDT4_RTRTAG; /* set bit rtr in CANIDT4. */
}
else
{
CANIDT4 &=~MSK_CANIDT4_RTRTAG; /* clear bit rtr in CANIDT4. */
}
if (msk_rtr == TRUE)
{
CANIDM4 |= MSK_CANIDM4_RTRMSK; /* set bit rtr in CANIDM4. */
}
if (msk_ide == TRUE)
{
CANIDM4 |= MSK_CANIDM4_IDEMSK; /* set bit ide in CANIDM4. */
}
if (buffer == TRUE)
{
ENABLE_CHANNEL_BUFFER; /* Buffer Reception enabled.*/
}
else
{
ENABLE_CHANNEL_RX; /* Reception enabled.*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -