hxiaon 发表于 2007-2-2 15:19

请哪位大虾般我改下这程序

#include&ltreg52.h&gt<br />#define&nbsp;&nbsp;_INTRPSW&nbsp;0X25<br />#define&nbsp;&nbsp;_CAN1_ADDR&nbsp;0X4700<br />#define&nbsp;&nbsp;uchar&nbsp;unsigned&nbsp;char<br />#define&nbsp;&nbsp;uint&nbsp;unsigned&nbsp;int<br />uchar&nbsp;xdata&nbsp;*canport;<br />/*CAN控制器的初始化*/<br />Init_CAN()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;//P1=0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canport=_CAN1_ADDR;<br />&nbsp;&nbsp;&nbsp;&nbsp;*canport=0x09;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(canport+31)=0x80;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(canport+16+i)=0xff;<br />&nbsp;&nbsp;&nbsp;&nbsp;i=Can_SD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//将源地址放好<br />&nbsp;&nbsp;&nbsp;&nbsp;*(canport+18)=i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//其他相关设置见资料<br />&nbsp;&nbsp;&nbsp;&nbsp;*(canport+22)=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(canport+6)=0x71;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(canport+7)=0xb4;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(canport+8)=0x1a;<br />&nbsp;&nbsp;&nbsp;&nbsp;*(canport+4)=_INTRPSW;<br />&nbsp;&nbsp;&nbsp;&nbsp;*canport=0x08;<br />}<br /><br />请问改下哪&nbsp;,能让芯片的CLKOUT脚输出与晶振频率一样的输出以驱动另一芯片,我在网上查了好久都没查到.(我的电路图是将P2.7接在片选,我使用的是PeliCAN模式)

wxj1952 发表于 2007-2-3 09:08

第一个SJA比第二个工作频率高一倍!

当然是改&nbsp;&nbsp;&nbsp;*(canport+6)=0x71;<br /><br />把第一个SJA的通信速率降低一半,(或者改第二个SJA的BTR,把第二个SJA通信速率提高一倍)。因为你设置的是SJA2外部频率是SJA1的一半。<br />&nbsp;&nbsp;CD.2-CD.0=000&nbsp;-----输出频率=fosc/2.<br />

hxiaon 发表于 2007-2-3 10:07

:re

也就是说可以有两种改法:可以改时钟分频器eg:*(canport+31)=0x07;将CLKOUT输出频率改成f=fosc;<br />也可以改总线时序也就是上楼说的?

wxj1952 发表于 2007-2-3 17:55

你说的方法简单

是,还是改CDR容易。

hxiaon 发表于 2007-2-4 10:53

我不知道时钟输出脚是开路还是接地

我的用外部振荡源的那个不能工作好象,我用另一个给其发送数据后,它不能产生中断,请老师指点,两个片子的初始化都是上面的程序(当然源地址那不同)

wxj1952 发表于 2007-2-4 12:19

很简单

1、看看它的时钟输出端有没有输出。也就是证实一下外部时钟已经输入。<br />2、单独进行自测试。看能不能发送/接收中断。<br />3、用SJA2向SJA1发送,看自己有没有发送中断。然后是对方有没有接收中断。<br /><br />一切正向不行,先反向试试。

hxiaon21 发表于 2007-2-4 22:46

请问

&nbsp;&nbsp;&nbsp;在自测试时,当给出自发自收的命令后,正常情况下它是先产生发送中断后产生接受中断?会不会造成混淆。是不是只要读中断寄存器就能区分出来。<br />&nbsp;&nbsp;&nbsp;根据我的初始化程序,我只使能了3个中断(发送、还有2个错误中断),但是检测到中断脚SJA1的低点平时,我读中断寄存器后发现不是我设置中断使能中的一种。<br />&nbsp;&nbsp;&nbsp;所以我考虑先用自测模式,但书上介绍得不详细,自测的流程是怎么样,发送的数据还是放在发送缓冲区,接受的数据还是在那读?

hxiaon 发表于 2007-2-5 11:01

WEN

今天我用自测模式时,在初始化中改动*canport=0x0d;以及最后的*canport=0x0c;用的下面的程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Can_Send(buf);&nbsp;&nbsp;//其中的发送命令是&nbsp;*(canport+1)=0x10;用0x12也试过<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(INTX1!=0);//查询方式SJA1的中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sta1=*(canport+3);//获取IR<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=sta1&0x20;&nbsp;&nbsp;&nbsp;//判断EPI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp==0x20)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H_temp=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使一个红色的发光二极管亮<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=sta1&0x04;&nbsp;&nbsp;//判断EI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp==0x04)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;L_temp=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使一个绿色的发光二极管亮<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=sta1&0x01;&nbsp;&nbsp;&nbsp;&nbsp;//判断RI<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(temp==0x01)<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />结果是:红、绿灯都亮,&nbsp;而接受处理部分没执行,后来我检查了发送中断位发现此中断位置位了;是不是能说明SJA在接收的时候出现了EI和PEI提示错误?

wxj1952 发表于 2007-2-8 19:17

这里到底设置了什么?

&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*(canport+16+i)=0xff;<br /><br />这里到底设置了什么?<br /><br />Data/ID/ACR/AMR?
页: [1]
查看完整版本: 请哪位大虾般我改下这程序