请教:AT90CAN128为什么不进入接收MOB中断呢?【恢复】
1、晶振是内部4M,波特率=125K,选择8TQ,3,2,2,1,2、MOB0=接收指令,MOB1=发送指令
3、先不管上层协议,将标识码寄存器和标识码屏蔽寄存器全部设置=0
只要调试通过两个结点之间能够进入接收中断即可。
void CAN_Init(void)
{
CANGCON |= (1<<SWRES); // CAN控制器软复位
///////////////////////////////////////////////////////////////////////////////////////
//4M,125K,8TQ,3,2,2,1,参见数据手册
///////////////////////////////////////////////////////////////////////////////////////
CANBT1 = 0x06; // 晶振=4M,波特率=125K
CANBT2 = 0x04; //
CANBT3 = 0x13; //
CANTCON = 0xff;
//-------------------------------------------------------------------
//MOB0=接收上位机发来的指令
//-------------------------------------------------------------------
CANPAGE = 0x00; //MOB0,自动增量,初值为0
CANSTMOB = 0;
CANCDMOB = 0x08; //CAN2.0A,DLC=8
CANIDT4 = 0x00; // 标识码寄存器
CANIDT3 = 0x00;
CANIDT2 = 0x00;
CANIDT1 = 0x00;
CANIDM4 = 0x00;
CANIDM3 = 0x00;
CANIDM2 = 0x00;
CANIDM1 = 0x00; //屏蔽寄存器
//-------------------------------------------------------------------
//MOB1=发送指令
//-------------------------------------------------------------------
CANPAGE = (1 << 4); //MOB0,自动增量,初值为0
CANSTMOB = (1<<TXOK);
CANCDMOB = 0x08; // CAN2.0A DLC=8
CANIDT4 = 0x00; // 标识码寄存器
CANIDT3 = 0x00;
CANIDT2 = 0x00;
CANIDT1 = 0x00;
CANIDM4 = 0x00;
CANIDM3 = 0x00;
CANIDM2 = 0x00;
CANIDM1 = 0x00; //屏蔽寄存器
CANGIE |= ((1<<ENIT) + (1<<ENRX)); // 开放CAN全局中断,允许接收中断
CANIE2 |= 0x01; //开MOB0信箱接收中断(接收邮箱)
CANPAGE = 0x00;
CANCDMOB |= 0x80; //MOB0接收使能
CANGCON |= 0x02; //CAN控制器启动
}
//////////////////////////////////////////////
//MOB1=发送邮箱
//////////////////////////////////////////////
void CAN_Send(void)
{
uint8 i;
CANGIE &= ~(1<<ENRX);
CANPAGE = (1 << 4) // 设置发送MOB为MOB1
if (CANSTMOB & (1<<TXOK))
{
CANSTMOB &= ~(1<<TXOK);
for (i = 0 ; i < 8 ; i++)
CANMSG = i;
CANCDMOB = 0x48; // MOB发送使能(bit7:bit6=01),DLC=8
}
CANGIE |= (1 << ENRX); // 接收中断允许
}
//////////////////////////////////////////////
//MOB0=接收邮箱
//////////////////////////////////////////////
#pragma interrupt_handler AT90CAN128_ISR:iv_CANIT
void AT90CAN128_ISR(void)
{
uint8 i,flag;
CANGIE &= ~(1<<ENRX); //关接收中断
flag = CANSIT2;
/////////////////////////////////////////
//MOb0 interrupt.
/////////////////////////////////////////
if (flag & 0x01)
{
CANPAGE = 0x00; //选择MOB0
for (i = 0 ; i < 8 ; i++)
rece_Buf = CANMSG; //读取邮箱数据
}
CANPAGE = 0x00;
CANSTMOB &= ~(1<<RXOK); //清中断标志
CANCDMOB = 0x88; //接收使能 ,CAN2.0A,DLC=8
CANGIE |= (1<<ENRX); //开接收中断
}
void main(void)
{
CLI();
PORT_Init();
TIMER0_Init();
TIMER2_Init();
TJA1040_ENABLE();
CAN_Init();
Watchdog_Init();
SEI();
while (1)
{
TJA1040_ENABLE();//周立功TJA1040收发器
CAN_Send();
WDR();
}
} 随便看看 发错位置了,呵呵。
页:
[1]