芯片是PIC18F66K80,调试can通信,可以正常接收信息,无法正常发送
这是初始化函数
void CAN_Init(void)
{
TRISB=(TRISB|0x08)&0xFB; //设置CANRX/RB3为输入,CANTX/RB2为输出
CANCON=0x80; //请求进入CAN配置模式REQOP=100
while(CANSTAT&0x80==0){;} //等待进入CAN配置模式OPMODE=100
//250 Kbps @ 64MHz
BRGCON1 = 0x0D; //0000 1101 //SJW=1TQ BRP 14
BRGCON2 = 0x98; //1001 1000 //SEG2PHTS 1 sampled once PS1=4TQ PropagationT 1TQ
BRGCON3 = 0x02; //0000 0010 //PS2 3TQ
//设置发送邮箱0标识符号和发送的数据
TXB0CON=0X03; //发送优先级为最高优先级,TXPRI=11
//扩展ID:11000111 111 11 01010000 11100101 0x18ff50e5
TXB0SIDLbits.EXIDE = 1;
TXB0SIDHbits.SID = 0b11000111;
TXB0SIDLbits.SID = 0b111;
TXB0SIDLbits.EID = 0b11;
TXB0EIDHbits.EID = 0b01010000;
TXB0EIDLbits.EID = 0b11100101;
TXB0DLC=0x08; // 设置数据长度为8个字节
TXB0D0=0x10; /* 写发送缓冲器数据区数据初值 */
TXB0D1=0x11;
TXB0D2=0x12;
TXB0D3=0x13;
TXB0D4=0x14;
TXB0D5=0x15;
TXB0D6=0x16;
TXB0D7=0x17;
RXB0CON=0x40; //仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用接收过滤器RXF0
RXB0DLC=0x01; //设置接收缓冲器0的数据区长度为8个字节
RXB0D0=0x00; //初始化接收缓冲器0的数据区数据
RXB0D1=0x00;
RXB0D2=0x00;
RXB0D3=0x00;
RXB0D4=0x00;
RXB0D5=0x00;
RXB0D6=0x00;
RXB0D7=0x00;
//初始化接收滤波器0,Id = 0x1806E5F4 = 0b 1 1000 000 001 10 1110 0101 1111 0100
RXF0SIDH=0b01001101;//1 1000 000
RXF0SIDL=0b00101010;///001 0 1 0 10
RXF0EIDH=0b11100101;
RXF0EIDL=0b11110100;
// 初始化接收屏蔽器0,所有29位都比较滤波
RXM0SIDH=0x00;
RXM0SIDL=0x00;//1110 1011
RXM0EIDH=0x00;
RXM0EIDL=0x00;
//初始化CAN模块的I/O控制寄存器
CIOCON=0x00;
ECANCON=0x00;
//使CAN进入某种工作模式模式
//CANCON=0x40; //=0X40,进入自测试模式;=0x00,正常操作模式
CANCON=0x00;
while(CANSTAT&0xE0!=0){;}
//初始化CAN的中断
PIR5=0x00; //清所有中断标志
PIE5=0x05; //使能接收缓冲器0的接收中断
IPR5=0x01; //接收缓冲器0的接收中断为最高优先级
printf("CAN初始化完成\n");
}
这是发送函数
void CAN_Send_Bytes(unsigned char *Buf,unsigned char Len)
{
unsigned char i;
TXB0CONbits.TXREQ=0; //禁止发送
TXB0DLC=Len; //设置发送字节个数
// 载入待发送数据
for(i=0;i<Len&&i<8;i++)
{
*(&TXB0D0+i)=Buf; //待发送数据写入发送缓冲器数据区的数据
}
TXB0CONbits.TXREQ=1; //请求发送报文
while(PIR5bits.TXB0IF!=1);//等待发送完成
PIR5bits.TXB0IF=0;
}
会一直卡在这一行while(PIR5bits.TXB0IF!=1);不知道为什么无法成功发送
接收信息正常 |