本帖最后由 血刀老祖 于 2017-1-13 10:56 编辑
PIC18F26K80做CAN通信,进行CAN初始化,完成后,从配置模式进入到工作模式,用仿真器观察,CANCON设置成功了,CANSTAT却不变,在那里死循环了,到底是什么原因呢,谢谢各位了
void canInit(void)
{
TRISB2 = 0; //设置CANRX/RB3输入
TRISB3 = 1; //设置CANTX/RB2输出
//设置CAN的波特率为500kbps,在Fosc=32MHz时,Tbit=2us
//假设BRP=03H为000011
//则Tq=[2*(1+BRP)]/Fosc=2*(1+3)/(32MHz)=250ns。
//normal bit rate=8Tq
//SJW=1Tq,SJW为00
//Sync_Seg=1Tq
//Prog _Seg=1Tq,PRSEG为000
//Phase_Seg1=3Tq,SEG1PH为010
//Phase_Seg2=3Tq,SEG2PH为010
//位时间=(1+1+3+3)=8Tq
ECANCON &= 0x3F; //模式0
CANCON = 0xE0; //请求进入CAN配置模式REQOP=111
while ((CANSTAT & 0x80) == 0) //等待进入配置模式
{
;
} //等待进入CAN配置模式OPMODE=100
//波特率设置
BRGCON1 = 0x03; //设置SJW和BRP
BRGCON2 = 0x90; //设置SEG2PH,SEG2PH和PRSEG
BRGCON3 = 0x42; //设置SEG2PH和总线唤醒
//设置接收邮箱0的标识符和初始化数据
RXB0SIDH = 0xFF; //设置接收缓冲器0的标识符,标准标识符1111 1111 111
RXB0SIDL = 0xE0;
RXB0CON = 0x20; //仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0
RXB0DLC = 0x08; //设置接收缓冲器0的数据区长度为8个字节
RXB0D0 = 0x00; //初始化接收缓冲器0的数据区数据
RXB0D1 = 0x00;
RXB0D2 = 0x00;
RXB0D3 = 0x00;
RXB0D4 = 0x00;
RXB0D5 = 0x00;
RXB0D6 = 0x00;
RXB0D7 = 0x00;
//初始化接收滤波器0,接收标准标识符1111 1111 111
RXF0SIDH = 0xFF;
RXF0SIDL = 0xE0;
//初始化接收屏蔽器0,所有报文ID均接收
RXM0SIDH = 0x00;
RXM0SIDL = 0x00;
//初始化CAN模块的I/O控制寄存器
//CIOCON = 0x00;
//这里出现问题//////////////////////////////////////////
//使CAN进入某种工作模式模式
CANCON = 0x00; //正常操作模式 这里设置成功
while ((CANSTAT & 0xE0) != 0) //等待进入正常模式 这里寄存器CANSTAT不变化,不进入正常模式
{
;
}
//初始化CAN的中断
PIR5 = 0x00; //CAN中断标志清零
IPR5bits.RXB0IP = 1; //CAN接收缓冲区0的接收中断为高优先级
PIE5bits.RXB0IE = 1; //CAN接收缓冲区0中断允许
}
|
历程不错哦