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

📄 can.c

📁 EMB91SAM7S64开发板(全套资料)
💻 C
字号:
#include "MCP2510.h"
#include "spi.h"

#define IRQ0_INTERRUPT_LEVEL	2
#define IRQ1_INTERRUPT_LEVEL	2

extern void at91_IRQ0_handler(void);
extern void at91_IRQ1_handler(void);
extern void blink(unsigned int vLED);

	uchar kk=0;
    uchar mdlc, mextF, mrtr;	
    unsigned long mID;
    
void InitIOforSPI()
{
    	AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA ) ;
    	AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, AT91C_PA11_NPCS0 \
    										  |AT91C_PA31_NPCS1\
    										  |AT91C_PA14_SPCK \
    										  |AT91C_PA13_MOSI \
    										  ) ;
   	//* Clear the LED's. On the EB55 we must apply a "1" to turn off LEDs
		AT91F_PIO_SetOutput( AT91C_BASE_PIOA, AT91C_PA11_NPCS0 \
    										  |AT91C_PA31_NPCS1\
    										  |AT91C_PA14_SPCK \
    										  |AT91C_PA13_MOSI \
    										  ) ;
		AT91F_PIO_CfgInput(AT91C_BASE_PIOA, AT91C_PA12_MISO);    										  		
}


void ConfigInterrupt()
{
    //* open external IRQ interrupt
    	AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,0,AT91C_PA20_IRQ0);
   	//* open external IRQ0 interrupt
        AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_IRQ0, IRQ0_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, at91_IRQ0_handler);
        AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ0); 
   
     //* open external IR1 interrupt
    	AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,AT91C_PA30_IRQ1,0);
   	//* open external IRQ1 interrupt
        AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_IRQ1, IRQ1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED, at91_IRQ1_handler);
        AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_IRQ1);            
}
//		canWrite(0,send_msg,8,0,0,MCPA_Cs);

void canWrite(ulong id,uchar* msg, uchar data_size,
						 uchar ext,uchar rtr,uint num) 
{
    McpWriteCan(2,ext,id,data_size,rtr,msg,num);
    WriteRTS(0x80|TX1RTS,num);//第2发送缓冲
}

uchar canRead(ulong* id,uchar* msg,uchar* data_size,uchar* extF,uchar* rtr,uint num) 
{
    uchar byte;
//    ReadDataCs(CANINTF, &byte, 1,Cs_num);
	byte=McpRdByte(CANINTF,num);
    if (byte & RX1INT) 
    { 
       McpReadCan(5, extF, id, data_size, rtr, msg,num);
//       WriteBitsCs(CANINTF, (uchar)~RX1INT, RX1INT,Cs_num); // Clear interrupt
	   BitModify(CANINTF,(uchar)~RX1INT,RX1INT, num);
    }
    else if (byte & RX0INT) 
    {   
        McpReadCan(4, extF, id, data_size, rtr, msg,num);
        BitModify(CANINTF, (uchar)~RX0INT, RX0INT,num); // Clear interrupt                       
    }
    if((*data_size)>8) return 1;
    
    return 0;    
}
        
void AT91F_Test_A(void)
{

    	uchar candata[6][8]={
					{0,1,2,3,4,5,6,7},
					{200,198,196,194,192,190,188,186},
					{0,2,4,6,8,10,12,14},
					{1,3,5,7,9,11,13,15},
					{149,129,109,89,69,49,29,9},
					{50,100,150,200,250,200,150,100}
					};
//		 uchar cm[8],i,da=k;
//		 da=4;
//	     for(i=0;i<8;i++)cm[i]=da++;
	     
   		 canWrite(1,candata[kk],8,0,0,SPI_0); 
         kk++;
         if(kk>=6)kk=0;
}
void AT91F_Test_B(uchar data)
{
		uchar cm[6],i;
	 	for(i=0;i<6;i++)cm[i]=data++;
   		canWrite(1501,cm,5,0,0,SPI_1);	
}
    	
void CANBus_test(void)
{
	uchar data1;
		
	InitIOforSPI();
	MCP2510Init(SPI_0);
	MCP2510Init(SPI_1);
	InitPorts(SPI_0);
	InitPorts(SPI_1);

	ConfigInterrupt();//将AT91C_PIO_PC14,AT91C_PIO_PC15设置为输入,并且使能中断
  	    		    	
	McpWrByte(CANINTF,NO_IE,SPI_0);
	McpWrByte(CANINTF,NO_IE,SPI_1);	
	while(1)
	{
	
	   	
	    SetLED(1,SPI_0);  //all flash
		SetLED(0,SPI_1);  //all flash
		DelayX(2500);		
	    SetLED(2,SPI_0);  //all flash
		SetLED(0,SPI_1);  //all flash
		DelayX(2500);
		
	AT91F_Test_B(data1++);
		
	blink(LED3);		
		
	    SetLED(0,SPI_0);  //all flash
		SetLED(1,SPI_1);  //all flash	    
		DelayX(2500);
	    SetLED(0,SPI_0);  //all flash
		SetLED(2,SPI_1);  //all flash
		DelayX(2500);		
	AT91F_Test_A();		
	blink(LED4);
											
	}

}

⌨️ 快捷键说明

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