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

📄 main.c

📁 相关富士通单片机实用资料5
💻 C
字号:
// The route is testing CAN
#include "mb90540.h"
// BTR value get from BITMIXER.EXE in FUJISTU and references to CANOPEN specfication
#define BTR_16M_2000K 0x1400
#define BTR_16M_1000K 0x1C00
#define BTR_16M_500K 0x1C01
#define BTR_16M_250K 0x1C03
#define BTR_16M_125K 0x4987
#define BTR_16M_100K 0x5CC7
// Initialization   CAN0
void InitCAN0(void)
{
	CSR0_TOE = 1;			// BIT 7: enable PIN 73 for CAN0 
							// transmit output
	do
	{
		CSR0_HALT = 1;	 
							// BIT 0: stop bus operation
	}while(CSR0_HALT == 0);
	BVALR0_BVAL0 = 0;		// buffer0 data is invalid
	BVALR0_BVAL1 = 0;		// buffer1 data is invaild	
	BTR0 = BTR_16M_125K;	// set bit timeing for 250k
	CSR0 = 0x0080;			// activate can bus operation
// acceptance mask definition 	
	AMR00 = 0x00;
	AMR10 = 0x00;
// full bit compare
	AMSR0_AMS0 = 0;
	AMSR0_AMS1 = 0;
// 11 bit identifier
	IDER0_IDE0 = 0;
	IDER0_IDE1 = 0;
// set idr0 to 1, ID mapping to ID register value
// reference to BITMIXER.EXE  
	IDR0(0) = 0x2000;
// set idr1 to 2
	IDR0(1) = 0x4000;
// disable buffer0 transmission interrupt
	TIER0_TIE0 = 0;
// disable buffer1 transmission interrupt
	TIER1_TIE1 = 0;
// enable buffer0 receive interrupt
	RIER0_RIE0 = 1;
// enable buffer1 receive interrupt
	RIER0_RIE1 = 1;
// enable buffer0 data is vaild
	BVALR0_BVAL0 = 1;
// enable buffer1 data is vaild
	BVALR0_BVAL1 = 1;
// no transmission
	TREQR0_TREQ0 = 0;
	TREQR0_TREQ1 = 0;
// no wait for remote request
	RFWTR0_RFWT0 = 0;
	RFWTR0_RFWT1 = 0;
// data frame to be transferred
	TRTRR0_TRTR0 = 0;
	TRTRR0_TRTR1 = 0;
} 
// Initialization UART1
void InitUart(void)
{
// initialize UART1 e.g. operation mode, baud rate, stop bit, data length etc.
// set clockspeed as PLLX4 in start.asm 
//  Make SOT1 working
	DDR4_D45 = 1;				 	
// serial mode register
	SMR1 = 0x01;				 
// serial control register	
	SCR1 = 0x13;				 
// prescaler control register,baud rate 9600	
	U1CDCR = 0x88;	
// enable recvive interrupt
	SSR1_RIE = 1;			   						
}
void delay()
{
	int i,j;
	for(j = 0; j <= 3; j++)
		for(i = 0; i <= 32760; i++);
}
// sends a char
void Putch (char ch)             
{
// wait for transmit buffer is empty
	while (SSR1_TDRE == 0);	     
// put char into buffer
	 SODR1 = ch;		         
}
void CAN0WriteCh (unsigned ch)
{
	DLCR0(0)		= 1;		// data length
	DTR0_WORD(0,0) = ch;
	TREQR0_TREQ0 = 1;
	while (TCR0_TC0==0)
			PDR2 = 0x5a;
	TCR0_TC0=0;
	
}
// UART1 receive and CAN transfer interrupt route
__interrupt void UART1RevIRQ(void)
{
	unsigned char ch;
	ch = SIDR1;
	CAN0WriteCh(ch);
}
// CAN0 receive interrupt route
unsigned char RevFlag0,RevFlag1,DataLength;
unsigned char DataBuffer[8];
__interrupt void CANRevIRQ (void)
{
	unsigned char i;
    // read data in receive buffer0 
	if(RCR0_RC0 == 1)
	{ 
	// set receive buff0 flag	
		RevFlag0 = 1;
	// get receive buffer0 length	
		DataLength = DLCR0(0);
		RCR0_RC0 = 0;
	// get receive buffer0 data
		for(i = 0; i < DataLength; i++)
		{
			DataBuffer[i] = DTR0_BYTE(0,i);
			Putch(DataBuffer[i]); 
		}
	}
	else
		RevFlag0 = 0;
	// read data in receive buffer1
	if(RCR0_RC1 == 1)
	{
	// set receive buff1 flag
		RevFlag1 = 1;
	// get receive buffer1 length	
		DataLength = DLCR0(1);
		RCR0_RC1 = 0;
	// get receive buffer1 data
		for(i = 0; i < DataLength; i++)
		{
			DataBuffer[i] = DTR0_BYTE(1,i);
			Putch(DataBuffer[i]);		
		}	
	}
	else
		RevFlag1 = 0;
	// display DataBuffer[0] data with LED
	PDR2 = ~DataBuffer[0];
}

main()
{
	unsigned char k = 0;
	// enable PORT2 as Output
	DDR2 = 0xff;
	PDR2 = 0x00;
	delay();
	delay();
	PDR2 = 0x55;
	delay();
	PDR2 = 0xaa;
	delay();
	PDR2 = 0xff;
	InitUart();
	InitCAN0();
	InitIrqLevels();
	// enable all interrupt level
	__set_il(7);
	// enable interrupt
	__EI();
	while(1)
	{
	    
	    if(RevFlag0 == 0)
		{
			PDR2_P26 = 0;
			delay();
			PDR2_P26 = 1;
			delay();
		}
		else
			RevFlag0 = 0;
	}
	
}
                

⌨️ 快捷键说明

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