Exemplo n.º 1
0
void CAN_Init(void)
{
	SIM_SCGC6|=SIM_SCGC6_FLEXCAN0_MASK;

	PORTA_PCR13=PORT_PCR_MUX(0x02);
	PORTA_PCR12=PORT_PCR_MUX(0x02);

	CAN0_MCR|=CAN_MCR_FRZ_MASK;
	CAN0_MCR&=~CAN_MCR_MDIS_MASK;
	while(CAN0_MCR&CAN_MCR_LPMACK_MASK);

	CAN0_MCR|=CAN_MCR_SOFTRST_MASK;
	while(CAN0_MCR&CAN_MCR_SOFTRST_MASK);

	while(!(CAN0_MCR&CAN_MCR_FRZACK_MASK));

	CAN0_MCR|=CAN_MCR_SRXDIS_MASK;
	CAN0_MCR|=CAN_MCR_RFEN_MASK;

	CAN0_CTRL1=CAN_CTRL1_PROPSEG(2)|CAN_CTRL1_RJW(1)|CAN_CTRL1_PSEG1(7)|CAN_CTRL1_PSEG2(3)|CAN_CTRL1_PRESDIV(1); // 500KBPS
//	CAN0_CTRL1=CAN_CTRL1_PROPSEG(2)|CAN_CTRL1_RJW(1)|CAN_CTRL1_PSEG1(7)|CAN_CTRL1_PSEG2(3)|CAN_CTRL1_PRESDIV(9); // 100KBPS
	CAN0_CTRL1&=~CAN_CTRL1_LPB_MASK;

	CAN0_RXIMR0=CAN_RXIMR_MI(0x1FFFFFFF);
	CAN0_RXMGMASK=0;
	CAN0_RXFGMASK=0;

	CAN0_MCR&=~CAN_MCR_HALT_MASK;
	while(CAN0_MCR&CAN_MCR_FRZACK_MASK);
	while(CAN0_MCR&CAN_MCR_NOTRDY_MASK);

	CAN0_CS(txb)=CAN_CS_CODE(0/*INACTIVE*/);
}
Exemplo n.º 2
0
/***********************************************************************************************
 功能:CAN 设置波特率
 形参:CAN_Type: CAN结构
       @arg CAN0 : CAN0模块
			 @arg CAN1 : CAN1模块
			 baudrate: 波特率
			 @arg CAN_SPEED_33K
			 @arg CAN_SPEED_83K
			 @arg CAN_SPEED_50K
			 @arg CAN_SPEED_100K
			 @arg CAN_SPEED_125K
			 @arg CAN_SPEED_250K
			 @arg CAN_SPEED_500K
			 @arg CAN_SPEED_1000K			 
 返回:0
 详解:0
************************************************************************************************/
static uint8_t CAN_SetBaudrate(CAN_Type *can,uint8_t baudrate)
{
	switch(baudrate)
	{
		case CAN_SPEED_33K:
			 // 48M/120= 400k sclock, 12Tq
			 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 3, PSEG1 = 4, PSEG2 = 4,PRESDIV = 120
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(2) 
											| CAN_CTRL1_RJW(2)
											| CAN_CTRL1_PSEG1(3) 
											| CAN_CTRL1_PSEG2(3)
											| CAN_CTRL1_PRESDIV(119));
		  break;
		case CAN_SPEED_83K:
			 // 48M/48= 1M sclock, 12Tq
			 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 3, PSEG1 = 4, PSEG2 = 4,PRESDIV = 48
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(2) 
											| CAN_CTRL1_RJW(2)
											| CAN_CTRL1_PSEG1(3) 
											| CAN_CTRL1_PSEG2(3)
											| CAN_CTRL1_PRESDIV(47));
		  break;	
		case CAN_SPEED_50K:
			 // 48M/80= 0.6M sclock, 12Tq
			 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 40
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(2) 
											| CAN_CTRL1_RJW(1)
											| CAN_CTRL1_PSEG1(3) 
											| CAN_CTRL1_PSEG2(3)
											| CAN_CTRL1_PRESDIV(79));	
		break;
		case CAN_SPEED_100K:
			 // 48M/40= 1.2M sclock, 12Tq
			 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 40
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(2) 
											| CAN_CTRL1_RJW(2)
											| CAN_CTRL1_PSEG1(3) 
											| CAN_CTRL1_PSEG2(3)
											| CAN_CTRL1_PRESDIV(39));	
		break;
		case CAN_SPEED_125K:
			 // 48M/32= 1.5M sclock, 12Tq
			 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 32
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(2) 
											| CAN_CTRL1_RJW(2)
											| CAN_CTRL1_PSEG1(3) 
											| CAN_CTRL1_PSEG2(3)
											| CAN_CTRL1_PRESDIV(31));		
		break;
		case CAN_SPEED_250K:
			 // 48M/16= 3M sclock, 12Tq
			 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 2, PSEG1 = 4, PSEG2 = 4, PRESDIV = 16
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(2) 
											| CAN_CTRL1_RJW(1)
											| CAN_CTRL1_PSEG1(3) 
											| CAN_CTRL1_PSEG2(3)
											| CAN_CTRL1_PRESDIV(15));		
		break;
		case CAN_SPEED_500K:
			 // 48M/8=6M sclock, 12Tq
			 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 2, PSEG1 = 4, PSEG2 = 4, PRESDIV = 6
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(2) 
											| CAN_CTRL1_RJW(1)
											| CAN_CTRL1_PSEG1(3) 
											| CAN_CTRL1_PSEG2(3)
											| CAN_CTRL1_PRESDIV(7));		
		break;
		case CAN_SPEED_1000K:
			 // 48M/6=8M sclock
			 // PROPSEG = 4, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
			 // RJW = 1, PSEG1 = 1, PSEG2 = 2, PRESCALER = 6
			can->CTRL1 = (0 | CAN_CTRL1_PROPSEG(3) 
											| CAN_CTRL1_RJW(0)
											| CAN_CTRL1_PSEG1(0) 
											| CAN_CTRL1_PSEG2(1)
											| CAN_CTRL1_PRESDIV(5));	
		break;
		default: return 1;
	}
	return 0;
}