📄 can_dtk.c
字号:
#include "SEED-DSK2407.h"
#include "CAN.h"
#include "comm.h"
#define FRAMLONGTH 2
unsigned int can_receive_flag;
unsigned int receive_deal_flag;
unsigned int mail_data[4];
unsigned int spi_data=0;
unsigned int recieve_over = 0;
unsigned int recieve_count = 0;
unsigned int recieve_check = 0;
unsigned int recieve[0x208] = {0};
void SpiInit(void);
void CanInit(void);
void sysreset(void);
void ledturnon(void);
void ledturnoff(void);
void main()
{
DINT;
can_receive_flag = 0;
receive_deal_flag = 0;
SystemInit();
SpiInit();
CanInit();
/*WHEN THE CAN PROGRAM RUN ,TURN ON THE LED2*/
*MCRC &= 0xBFFF;
*PFDATDIR |=0x4040;
*IFR = 0x3f;
*IMR = 0x11;
EINT;
for(;;)
{
/* if(can_receive_flag == 1)
{
can_receive_flag = 0;
}
*CANTCR = 0x20;
while(can_receive_flag == 0)
{
if((*CANTCR & 0x2000) == 0x2000)
{
break;
}
}
*CANTCR = 0x2000;*/
}
}
void SystemInit(void)
{
WSGR = 0;
*WDCR = 0x68;
*SCSR1 = 0x003e;
}
void SpiInit(void)
{
*MCRB = 0x3c;
*SPICCR = 0x4f;
*SPICTL = 0x03;
*SPIBRR = 0x31;
*SPIPRI = 0x10;
*SPICCR = 0xcf;
}
void CanInit(void)
{
/* 设置CANTX和CANRX为CAN功能口 */
*MCRB = *MCRB | 0xc0;
/* 邮箱2为接收方式、邮箱3为发送方式 */
*CANMDER = 0x40;
/* 设置ID屏蔽位 */
*CANLAM1H = 0x7fff;
*CANLAM1L = 0xffff;
/* 设置配置请求,系统为自闭环模式 */
*CANMCR = 0x1040;
/* 判断CCR的配置是否为1,可以对BCR1和BCR2寄存器修改 */
while((*CANGSR & 0x10) == 0);
/* CAN波特率为1M */
*CANBCR2 = 0x27;
/* */
*CANBCR1 = 0x13;
/* 关闭CCR,配置请求 */
*CANMCR = *CANMCR & 0xefff;
/* 判断CCR的配置是否为0,可以对BCR1和BCR2寄存器修改 */
while((*CANGSR & 0x10) == 0x10);
/* 邮箱2为接收方式、邮箱3为发送方式 */
*CANMDER = 0x40;
/* cdr = 1,数据区改变请求 */
*CANMCR = 0x143;
/* 设置邮箱2的控制字和ID */
*CANMSGID2H = 0x4447;
*CANMSGID2L = 0;
/* */
*CANMSGCTRL2 = 0x08;
/* 清邮箱2 */
*CANMBX2A = 0;
*CANMBX2B = 0;
*CANMBX2C = 0;
*CANMBX2D = 0;
/* 设置邮箱3的控制字和ID */
*CANMSGID3H = 0x2447;
*CANMSGID3L = 0;
/* */
*CANMSGCTRL3 = 0x08;
/* 清邮箱2 */
*CANMBX3A = 0x3210;
*CANMBX3B = 0x7654;
*CANMBX3C = 0xba98;
*CANMBX3D = 0xfedc;
/* */
*CANMCR = 0x4c0;
/* me3和me2使能 */
*CANMDER = 0x4c;
/* 清CAN中断标志 */
*CANIFR = 0xFFFF;
/**/
*CANIMR = 0xf7ff;
}
interrupt void PHANTOM(void)
{
}
/*SPI INTERRUPT*/
interrupt void c_int1(void)
{
unsigned int i;
if((*PIVR & 0x05) == 0x05)
{
recieve[recieve_count] = *SPIRXBUF;
recieve_count++;
if(recieve_count==FRAMLONGTH)
{
switch(recieve[0])
{
case CANSENDDATA:
ledturnon();
*CANMBX3A = recieve[1];
*CANTCR = 0x20;
break;
case SYSRESET:
ledturnoff();
sysreset();
break;
default:
break;
}
recieve_over = 1;
recieve_count = 0;
}
}
*IFR &=0x0001;
EINT;
}
interrupt void c_int5(void)
{
if((*PIVR & 0x40) == 0x40)
{
can_receive_flag = 1;
*CANRCR = 0x40;
*CANIFR = 0xffff;
*CANMDER = 0;
*CANMCR = 0x140;
*CANTCR = 0x2000;
mail_data[0] = *CANMBX2A;
*SPITXBUF = mail_data[0];
*CANMCR = 0x4c0;
*CANMDER = 0x4c;
}
/* *IFR = 0x02;*/
EINT;
}
void sysreset(void)
{
WSGR = 0;
*WDCR = 0x08;
for(;;){};
/*asm(" B 768H "); */
}
void ledturnon()
{
LED = 0x0F;
}
void ledturnoff()
{
LED = 0x00;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -