📄 can.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 + -