求教can

[复制链接]
3123|2
 楼主| jacklong0541 发表于 2009-5-21 11:00 | 显示全部楼层 |阅读模式
大家帮我看下,我设置的对吗?现在收发都出错。<br />void&nbsp;CANInit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;DDRM_DDRM2=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;DDRM_DDRM3=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;DDRM_DDRM4=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;DDRM_DDRM5=0;&nbsp;//&nbsp;PM[2:5]设置为输入,即设置为通用I/O口,避免CAN0的重复<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0CTL0=0x01;//设置为初始状态<br />&nbsp;&nbsp;while&nbsp;((CAN0CTL1&nbsp;&0x01)==&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;//确保CAN0处于初始状态,即CAN0CTL1_INITAK=1<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0CTL1=0x80;&nbsp;//MSCAN12模块使能<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0BTR0&nbsp;=&nbsp;CAN0BTR0V;&nbsp;&nbsp;&nbsp;&nbsp;//同步跳转宽度为1,预分频因子为5<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0BTR1&nbsp;=&nbsp;CAN0BTR1V;&nbsp;&nbsp;&nbsp;&nbsp;//将位速率设置成&nbsp;197kbps<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0IDAC&nbsp;=&nbsp;CAN0IDACV;&nbsp;&nbsp;&nbsp;&nbsp;//两个32位验收过滤器<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0IDAR0&nbsp;=&nbsp;CAN0IDAR0V;&nbsp;&nbsp;&nbsp;&nbsp;//给接收验证码寄存器0-1赋值<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0IDAR1&nbsp;=&nbsp;CAN0IDAR1V;<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0IDMR0&nbsp;=&nbsp;CAN0IDMR0V;&nbsp;&nbsp;&nbsp;&nbsp;//给接收验证屏蔽寄存器0-1赋值<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0IDMR1&nbsp;=&nbsp;CAN0IDMR1V;<br />&nbsp;&nbsp;&nbsp;&nbsp;//CAN0TIER&nbsp;=&nbsp;CAN0TIERV;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置中断方式<br />&nbsp;&nbsp;&nbsp;&nbsp;//CAN0TIER&nbsp;=&nbsp;CAN0TIERV;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0CTL0=0x00;;&nbsp;&nbsp;&nbsp;//INITRQ=0,退出初始化模式<br />&nbsp;&nbsp;&nbsp;&nbsp;//等待应答<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((CAN0CTL1&nbsp;&&nbsp;0x01)&nbsp;==&nbsp;1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//CANSND1DFRM:CAN发送1帧数据-----------------------------------------------*<br />//功&nbsp;&nbsp;能:CAN发送1帧数据(数据长度&lt=8)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />//参&nbsp;&nbsp;数:ID---报文标识符&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBUF---报文数据区首址&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEN---报文数据长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />//返&nbsp;&nbsp;回:INT8U&nbsp;CANsnd1DFrm&nbsp;---&nbsp;发送成功与否标志,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0,没有空闲发送缓冲区,发送不成功;=1,发送成功&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />//说明:在发送数据之前,先查询是否有空闲发送缓冲区,若无则不能发送,返回0&nbsp;&nbsp;&nbsp;*<br />//-------------------------------------------------------------------------*<br />INT8U&nbsp;CANSND1DFRM(INT8U&nbsp;*&nbsp;DataBUF&nbsp;)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;BufferSelect;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;BufferFlag1;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;LEN;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;x_value=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;*&nbsp;addr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送缓冲区<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;BufNum&nbsp;=&nbsp;0xFF;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//空闲的发送缓冲区号<br />&nbsp;&nbsp;&nbsp;&nbsp;//BufNum&nbsp;=&nbsp;GetSNDBUF();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//查找空闲的发送缓冲区&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(CAN0T**==0x00)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTH_PTH6=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayXms(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTH_PTH6=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayXms(1000);//延时,稳定<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTH_PTH6=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DelayXms(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTH_PTH6=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;//确保有发送缓冲器为空<br />&nbsp;&nbsp;&nbsp;&nbsp;BufferFlag1=CAN0T**;//读出发送缓冲器标志寄存器的内容<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0TBSEL=BufferFlag1;//用以赋值发送缓冲器选择寄存器<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr=(INT8U&nbsp;*)(&CAN0TXF);&nbsp;&nbsp;//获得发送前台缓冲区首地址&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//---------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;//将报文按CAN格式进行封装并存入空闲发送缓冲区等待发送<br />&nbsp;&nbsp;&nbsp;addr[0]&nbsp;=&nbsp;ascii2byte(++DataBUF);&nbsp;//11位报文标识符高8位<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[0]&nbsp;&lt&lt=4;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[0]&nbsp;+=&nbsp;ascii2byte(++DataBUF);<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[1]&nbsp;=&nbsp;ascii2byte(++DataBUF);&nbsp;&nbsp;&nbsp;&nbsp;//低3位<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[1]&nbsp;&lt&lt=5;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[1]&nbsp;&=&nbsp;~(1&nbsp;&lt&lt&nbsp;RTR);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//RTR=0,数据帧<br />&nbsp;&nbsp;&nbsp;&nbsp;addr[1]&nbsp;&=&nbsp;~(1&nbsp;&lt&lt&nbsp;IDE);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IDE位=0&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LEN=&nbsp;ascii2byte(++DataBUF);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;LEN;&nbsp;i++)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBUF++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[i+4]&nbsp;=&nbsp;ascii2byte(DataBUF);&nbsp;//数据赋值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[i+4]&lt&lt=4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBUF++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[i+4]+=ascii2byte(DataBUF);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr[12]&nbsp;=&nbsp;LEN&0x0f;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数据长度<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//---------------------------------------------------------------------<br />&nbsp;&nbsp;&nbsp;&nbsp;//发送缓冲区相应TXE位写1清除该位来通知MSCAN12发送数据<br />&nbsp;&nbsp;&nbsp;&nbsp;BufferSelect=CAN0TBSEL;<br />&nbsp;&nbsp;&nbsp;&nbsp;CAN0T**=BufferSelect;<br />&nbsp;&nbsp;&nbsp;&nbsp;DelayXms(1000);//延时,稳定<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br />
ssoftboy 发表于 2009-5-21 18:13 | 显示全部楼层

CAN程序很Easy

1.很少有人用PE生成代码用在产品中<br />2.手写CAN的代码也很简单,你可以从AN里找示例代码来改
开芯行者 发表于 2009-5-30 17:45 | 显示全部楼层

同样问题

我和你问题基本一样,同情。PM口不用设置,因为CAN使能有优先权,会自动完成的。&nbsp;建议用示波器查一下,是波特率的问题,还是没有发出信号。发送数据可设0x55,如正确发送,可见一方波信号。我的问题是用示波器检测信号正常,但波特率一直不对。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

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