发送总是显示应答错,发送忙 AERR=1 TXBSY=1 程序如下:
void CAN_INIT ( void ) { CANGCON = 0x01 ; /*进入复位模式并且复位MOb*/ while ((CANGSTA & 0x04)); /*测试CANGSTA中的ENFG位是否为0*/ CANBT1 = 0x12; //16Mhz,100kbps CANBT2 = 0x0c; CANBT3 = 0x37; CANTCON = 0xff ; /*设置定时器预定标*/ //--------------can_MOB INITIAL------------------- //MOB0=RX[CMD] 接收上位机发来的指令 格式:3,0,0,177,239,33 CANPAGE = 0x00; //MOB0,自动增量,初值为0 CANSTMOB = 0; CANCDMOB = 0x18; //can2B,DLC=8 CANIDT4 = 0x08; // 00001 0xx CANIDT3 = 0x79; // 01111 001 33 CANIDT2 = 0x8f; // 10001 111 239 CANIDT1 = 0x65; // 01100 101 177
CANIDM4 = 0xfc; // 11111 100 CANIDM3 = 0xff; // 11111 111 CANIDM2 = 0xff; // 11111 111 CANIDM1 = 0x07; //CANIDM4-1数据校验屏蔽寄存器 00000 111
//MOB1=TX[STA1] 向上位机报告状态组1 6,0,0,178,239,33 CANPAGE = 0x10; CANSTMOB = (1<<TXOK); CANCDMOB = 0x18; CANIDT4 = 0x08; // 00001 000 CANIDT3 = 0x79; // 01111 001 33 CANIDT2 = 0x97; // 10010 111 239 CANIDT1 = 0xc5; // 11000 101 178
CANGIE |= ((1<<ENIT) + (1<<ENRX)); //开全局中断 和 接收中断 CANIE2 |= 0x00; //开MOB3 & MOB0信箱接收中断(接收邮箱) CANPAGE = 0x00;
CANGCON = 0x0a ; /*进入操作模式*/ while (!(CANGSTA & (1<<2))); /*测试CANGSTA中的ENFG位是否为1*/ } void CAN_TX ( void ) { byte i; CANGIE &= 0xdf;//ENRX=0 CANPAGE = 0x10 ; /*指定此消息的MOb页(寄存器中的高4位)*/ if (CANSTMOB & 0x40) { CANSTMOB &= 0xbf; for(i = 0; i < 8; i++) CANMSG = 0x41+i;
CANCDMOB = 0x58; //帧发送 } CANGIE |=0x20; //ENRX=1 }
|