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

📄 can_unit.h

📁 can initialization for coldfire microcontorllers
💻 H
字号:
/************************************************************************
*
*  Freescale Semicondactor
*  ALL RIGHTS RESERVED
*  (c) Copyright 2004Freescale Semiconductor
*
*************************************************************************
*
*  FILE NAME: can_unit.h
* 
*  PURPOSE: Header file for can_init.c and can_routine.c
*
*  AUTHOR(s): Igor Byeda
*
*************************************************************************/
#ifndef CAN_unit_H
#define CAN_unit_H

#include PROCESSOR_H
#include INIT_H
#include "stdlib.h"

//#define CAN_DEBUG_MSG

// VERSION 
#define CAN_VERSION 	("2.1.0")	// char[5] "x.x.x" format

#define RECEIVE_ALIEN_MESSAGES_ONLY

#define CAN_UNIT_TX_RX_BUFFER_SIZE 				(201) // 10ms buffering on 1Mbps CAN bus speed
#define CAN_UNIT_HW_BUFFER_NUMBER 			(16)
#define CAN_UNIT_MESSAGE_DATA_LENGTH 		(8)
#define CAN_UNIT_ERROR_DESCRIP_STRING_SIZE	(256)
#define CAN_UNIT_ERROR_DESCRIP_BUFFER_SIZE	(5)

#define CAN_UNIT_GLOBAL_PARAM_NAME_SIZE (16)
#define PARAM_CAN_SPEED (0)

#define TX 		(0)
#define REMOTE	(1)
#define RX		(2)

#define MCF5282_FLEXCAN_MBUF_CTRL(id)					(*(vuint8 *)(void *)(&__IPSBAR[0x1C0081+16*(id)]))
#define MCF5282_FLEXCAN_MBUF_CTRL_ADDR(id) 			(&__IPSBAR[0x1C0080+16*(id)])
#define MCF5282_FLEXCAN_MBUF_CTRL_CODE(bufferNumber)	(MCF5282_FLEXCAN_MBUF_CTRL(bufferNumber) & 0xF0)
#define MCF5282_FLEXCAN_MBUF_IDH(id)					(*(vuint16 *)(void *)(&__IPSBAR[0x1C0082+16*(id)]))
#define MCF5282_FLEXCAN_MBUF_IDL(id)					(*(vuint16 *)(void *)(&__IPSBAR[0x1C0084+16*(id)]))

//HW Buffer codes
#define BUFFER_RX_CODE_NOT_ACTIVE		(0x00)
#define BUFFER_RX_CODE_FULL 			(0x20)
#define BUFFER_RX_CODE_EMPTY			(0x40)
#define BUFFER_RX_CODE_OVERRUN		(0x60)
#define BUFFER_TX_CODE_DATA			(0x80)
#define BUFFER_TX_CODE_REMOTE		(0xC0)

#define MCF5282_FLEXCAN_IDH_IDE (0x08)
#define MCF5282_FLEXCAN_IDH_RTR (0x10)

#define TX_BUFFER_DATA					(11)
#define TX_BUFFER_REMOTE_1				(12)
#define TX_BUFFER_REMOTE_2				(13)
#define NUMBER_OF_BYTES_IN_HW_BUFFER	(14)
#define TIME_OUT_TIME (1000000)

#define CAN_START_TIMEOUT	(1000) // in [ms]

//!***! need to be move in another *.h file
enum can_ErrorLevel_t	{INFO, WARNING,	ERROR};

typedef enum can_ErrorLevel_t can_ErrorLevel;
//!***!

enum can_unit_IntegrationState_t { can_Waiting,
								   can_MessageSuccesfullyReceived,
								   can_ErrorOccured
								 };
								 
enum can_unit_PlugInState_t		{ can_CanOpenServer, 
							 	  can_CanOpenClient, 
							 	  can_DeviceNet, 
							 	  can_None
							 	};

enum can_unit_Mode_t			{ can_ModeStop = 0,
								  can_ModeIntegration, 
							 	  can_ModeRunListenOnly, 
							 	  can_ModeRunTransmitOnly, 
							 	  can_ModeRunFull
							 	};

enum can_unit_CurrentOperation_t { can_StatusIdle = 0,
								   can_StatusCanTransmittingData,
								   can_StatusCanReceivingData,
								   can_StatusFIFOCopingTo,
								   can_StatusFIFOCopingFrom
								 };

/************************************************************************
*     Can Unit bus speed and bit timing parameters Strucrure
*************************************************************************/

typedef struct
{
	uint32	CanSpeed;
	uint8	PREScalerDIVision; 
	uint8	NumberOfTQ;
	uint8	PROPagationSEG;
	uint8	PhaseSEG1;
	uint8	PhaseSEG2;		
	uint8	ResyncJumpWidth;
	uint8	SAMPlingMode;
	uint8	isStandartSpeed;
} can_SpeedParam_t;

/************************************************************************
*     Can Unit Hardware Buffer Parameters Strucrure
*************************************************************************/
typedef struct
{
	uint8	BufferType;
	uint16	Id_H;
	uint16	Id_L;
	uint16	IFlag;
	uint8	canBufferTxtName[CAN_UNIT_GLOBAL_PARAM_NAME_SIZE];
}can_HWBufferParam_t;

/************************************************************************
*     Can Unit Message Internal Buffer Strucrure
*************************************************************************/
typedef struct
{
    uint16  Ctrl;
    uint16  IDH;
    uint16  IDL;    
    uint8   data[CAN_UNIT_MESSAGE_DATA_LENGTH];
    uint16  reserved;	// just for structure alignment
//	uint32  absDate;
    uint32  absTime;
} can_Message_t;

#define CAN_MSG_LEN  (sizeof(can_Message_t)/sizeof(char))

/************************************************************************
*     Can Unit Errors Buffer Strucrure
*************************************************************************/
typedef struct
{
	uint16 canErrCode;
	uint8  canErrTxtDescription[CAN_UNIT_ERROR_DESCRIP_STRING_SIZE];
} can_err_ErrorTable_t;

/************************************************************************
*     Can Unit Errors Buffer Strucrure
*************************************************************************/
typedef struct
{
	uint16					canErrNumber;
	can_err_ErrorTable_t*	canErrTxtDescriptionPtr;
	uint32					sysErrTime;
	uint16					canFunctionId;
} can_err_ErrorDescript_t;

/************************************************************************
*     Can Unit Errors Buffer Pointer Strucrure
*************************************************************************/
typedef struct
{
	can_err_ErrorDescript_t	*ptr;
	can_err_ErrorDescript_t	*head;
	can_err_ErrorDescript_t	*tail;
	can_err_ErrorDescript_t	*end;
	uint8	count;
	uint8	length;
} can_err_ErrorPointer_t;

//	#pragma section CAN_SRAM_BUFFERS begin
extern uint8 can_unit_IsSpeedAutodetected;
extern can_SpeedParam_t can_CurrentSettings;
extern can_SpeedParam_t can_SpeedParam[];
extern can_HWBufferParam_t can_HWBufferParam[];

extern can_err_ErrorTable_t can_err_ErrorTable[];
extern can_err_ErrorDescript_t can_err_ErrorDescript[CAN_UNIT_ERROR_DESCRIP_BUFFER_SIZE];
extern can_err_ErrorPointer_t can_err_ErrorPointer;

extern enum can_unit_IntegrationState_t can_unit_IntegrationState;
extern enum can_unit_PlugInState_t can_unit_PlugInState;

extern uint8 can_unit_Mode;
extern volatile uint8 can_unit_CurrentOperation;
//	#pragma section CAN_SRAM_BUFFERS end

/************************************************************************
* NAME: memcpy16
*
* DESCRIPTION Copies "n" bytes from "*src" location
*			    into "*dest" location
************************************************************************/
inline 
void *
memcpy16 (void *dest, const void *src, unsigned n)
{
	int longs, bytes;
	uint16 *dpl = (uint16 *)dest;
	uint16 *spl = (uint16 *)src;
	uint8  *dpb, *spb;

	if ((dest != NULL) && (src != NULL) && (n > 0))
	{
		bytes = (n & 0x1);
		longs = (n - bytes) >> 1;

		// 2 bytes copying
		while (longs--)
			*dpl++ = *spl++;
		
		dpb = (uint8 *)dpl;
		spb = (uint8 *)spl;
		
		// 1 byte copying
		while (bytes--)
			*dpb++ = *spb++;
	}
	return dest;
}

/************************************************************************
*     Function Prototypes
*************************************************************************/    
#define can_unitInit_Id		 				1
#define can_get_hGlobalParamList_Id			2
#define can_set_GlobalParam_Id 				3
#define can_unit_getMode_Id 				4
#define can_unit_getStatus_Id 				5
#define can_get_TxBufferFreeSpace_Id 		6
#define can_get_TxBufferWaitingMessages_Id 	7
#define can_get_RxBufferWaitingMessages_Id 	8
#define can_get_IsRxBufferEmpty_Id 			9
#define can_err_GetLastError_Id				10
#define can_data_CopyRxToFIFO_Id 			11
#define can_data_CopyTxFromFIFO_Id 		12
#define can_unit_Run_Id 					13
#define can_unit_Stop_Id 					14
#define can_data_SendDataToCANbus_Id 		15
#define can_err_SendError_Id 				16
#define can_Remote_Id 						17
#define can_Rx_Id 							18

uint8  can_unitInit(void);
uint8  can_unit_Run(void);
void   can_unit_Stop(void);
uint8  can_unit_Auto_Integration(void);
uint8  can_unit_getMode(void);
vuint8 can_unit_getStatus(void);

void   can_flexcan_init(void);
uint8  can_flexcan_setBitRate(can_SpeedParam_t*);
uint8  can_flexcan_getBitRate(can_SpeedParam_t*);
uint32 can_calcSpeedFromParams(can_SpeedParam_t*);

uint32 can_set_GlobalParam(uint8, uint32);

uint32 can_data_CopyRxToFIFO(void);
uint32 can_data_CopyTxFromFIFO(void);
uint32 can_data_SendDataToCANbus(void);
uint8  can_data_IsSelfMsgWasRecv(can_Message_t* , uint8);

can_err_ErrorDescript_t* can_err_GetLastError(void);
uint32 can_err_SendError(can_err_ErrorTable_t*, uint32, uint16);

#endif //CAN_unit_H

⌨️ 快捷键说明

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