[CAN-bus/DeviceNet] PIC18F458的CAN总线控制器设置的问题

[复制链接]
4232|2
 楼主| lifespace 发表于 2007-6-15 11:21 | 显示全部楼层 |阅读模式
//**************CANB初始化子程序***************<br />void&nbsp;&nbsp;&nbsp;&nbsp;initcan(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;TRISB=(TRISB|0X08)&0XFB;//设置CANRX/RB3为输入,CANTX/RB2为输出<br /><br />//设置CAN的波特率为125K,在Fosc=4M时,Tbit=8us,假设BRP=01h<br />//则TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。<br />//NOMINAL&nbsp;BIT&nbsp;RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog&nbsp;_Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ<br />&nbsp;&nbsp;&nbsp;&nbsp;CANCON=0X80;&nbsp;&nbsp;&nbsp;&nbsp;//请求进入CAN配置模式REQOP=100&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(CANSTAT&0X80==0){;}&nbsp;&nbsp;&nbsp;&nbsp;//等待进入CAN配置模式OPMODE=100<br />&nbsp;&nbsp;&nbsp;&nbsp;BRGCON1=0X01;&nbsp;&nbsp;&nbsp;&nbsp;//设置SJW和BRP,SJW=1TQ,BRP=01H<br />&nbsp;&nbsp;&nbsp;&nbsp;BRGCON2=0X90;&nbsp;&nbsp;&nbsp;&nbsp;//设置Phase_Seg1=3TQ和Prog&nbsp;_Seg=1TQ<br />&nbsp;&nbsp;&nbsp;&nbsp;BRGCON3=0X42;&nbsp;&nbsp;&nbsp;&nbsp;//设置Phase_Seg2=3TQ<br /><br />//设置发送邮箱0标识符号和发送的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0CON=0X03;//发送优先级为最高优先级,TXPRI=11<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0SIDH=0XFF;//设置发送缓冲器0的标准标识符,本程序采用标准识符<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0SIDL=0XE0;<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0DLC=0X08;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置数据长度为8个字节<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D0=0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写发送缓冲器数据区的数据<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D1=0X01;<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D2=0X02;<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D3=0X03;<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D4=0X04;<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D5=0X05;<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D6=0X06;<br />&nbsp;&nbsp;&nbsp;&nbsp;TXB0D7=0XA7;<br /><br />//设置接收邮箱0的标识符和初始化数据<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0SIDH=0XFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置接收缓冲器0的标识符&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0SIDL=0XE0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0CON=0X20;&nbsp;&nbsp;&nbsp;&nbsp;//仅仅接收标准标识符的有效信息,FILHIT0=0表示RXB0采用filter0<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0DLC=0X08;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置接收缓冲器0的数据区长度<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D0=0X00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化接收缓冲器0的数据区数据<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D1=0X00;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D2=0X00;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D3=0X00;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D4=0X00;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D5=0X00;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D6=0X00;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXB0D7=0X00;<br /><br />//初始化接收滤波器0和接收屏蔽,<br />&nbsp;&nbsp;&nbsp;&nbsp;RXF0SIDH=0XFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXF0SIDL=0XE0;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXM0SIDH=0X00;<br />&nbsp;&nbsp;&nbsp;&nbsp;RXM0SIDL=0X00;<br /><br />//初始化CAN模块的I/O控制寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;//CIOCON=0X00;<br /><br />//使CAN进入某种工作模式模式<br />&nbsp;&nbsp;&nbsp;&nbsp;CANCON=0X00;&nbsp;&nbsp;&nbsp;&nbsp;//=0X40,进入自测试模式;=0x00,正常操作模式<br />&nbsp;&nbsp;&nbsp;&nbsp;while(CANSTAT&0XE0!=0){;}<br />&nbsp;&nbsp;&nbsp;&nbsp;//while(CANSTAT&0X40==0){;}<br /><br />//初始化CAN的中断<br />&nbsp;&nbsp;&nbsp;&nbsp;PIR3=0X00;&nbsp;&nbsp;&nbsp;&nbsp;//清所有中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;PIE3=0X01;&nbsp;&nbsp;&nbsp;&nbsp;//使能接收缓冲器0的接收中断<br />&nbsp;&nbsp;&nbsp;&nbsp;IPR3=0X00;&nbsp;&nbsp;&nbsp;&nbsp;//接收缓冲器0的接收中断为最高优先级<br />}<br />在最后的两部分中,标准程序将CAN中断的初始化放在了CAN工作模式改变为正常操作模式的设置之后,这样合适么??<br />我实验了一下,将中断放在了模式操作之前的话,也能正常进行CAN数据的收发。<br /><br />请问各位高手在调试CAN初始化程序的时候,对这一点是如何认识的?这两部分的前后顺序有区别么?
桂电飞天鼠 发表于 2007-6-15 23:53 | 显示全部楼层

rt

按照SJA1000的用法来说,中断使能无论是复位模式还是在工作模式都可以进行设置,也就是说,在哪设置的结果都是一样的。<br /><br />这是实验得出的结果~~~
 楼主| lifespace 发表于 2007-6-18 14:22 | 显示全部楼层

rt

我也做了实验,两者的位置没有关系,放在前面后面都可以的……
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

19

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部