学者之家电子论坛--打造电子工程师共同致富的平台's Archiver

diskcopy 发表于 2008-4-1 20:49

[求助]请无中生有大侠帮忙分析一下程序为何不能正常工作(附电路图)

<p><p><font size="4"><font face="宋体"><font color="#2222dd"></font></font></font></p><font face="宋体" size="4">void sja1000hardinit(); <font color="#1a1ae6">//sja1000硬件初始化函数</font><br/>void sja1000softinit(); </font><font size="4"><font face="宋体"><font color="#113dee">//sja1000软件初始化函数<br/></font>void sja1000write(unsigned char address,unsigned char writedata); <font color="#1a42e6">//sja1000写函数</font><br/>unsigned char sja1000read(unsigned char address); <font color="#1111ee">//sja1000读函数</font></font></font></p><p><font face="宋体" size="4">unsigned char i,j,k;<br/>unsigned char temp;</font></p><p><font size="4"><font face="宋体"><font color="#113dee"></font></font></font></p><p><font face="宋体" size="4">sbit&nbsp; alepin=P2^0;&nbsp;&nbsp;&nbsp; </font><font size="4"><font face="宋体"><font color="#113dee">// SJA1000的ALE信号线<br/></font>sbit&nbsp; cspin=P2^1;&nbsp;&nbsp;&nbsp;&nbsp;</font></font><font size="4"><font face="宋体"><font color="#1111ee"> // SJA1000的CS信号线<br/></font>sbit&nbsp; rdpin=P2^2;&nbsp;&nbsp;&nbsp;&nbsp; </font></font><font size="4"><font face="宋体"><font color="#0938f7">// SJA1000的RD信号线<br/></font>sbit&nbsp; wrpin=P2^3;&nbsp;&nbsp;&nbsp;&nbsp;</font></font><font size="4"><font face="宋体"><font color="#1a1ae6"> // SJA1000的WR信号线<br/></font>sbit&nbsp; rstpin=P2^4;&nbsp;&nbsp;&nbsp; </font></font><font size="4"><font face="宋体"><font color="#1111ee">// SJA1000的RST信号线<br/></font>sbit&nbsp; intpin=P2^5;&nbsp;&nbsp;&nbsp;<font color="#0909f7"> // SJA1000的INT信号线</font></font></font></p><p><br/><font size="4"><font face="宋体">#define&nbsp; sja1000dataport&nbsp; P3&nbsp; <font color="#0938f7">// SJA1000的地址、数据线</font></font></font></p><p><font face="宋体" size="4">unsigned char sja1000read(unsigned char address)<br/>{<br/>&nbsp;&nbsp;&nbsp; unsigned char port=0;<br/>&nbsp;&nbsp;&nbsp; wrpin=1;</font></p><p><font face="宋体" size="4">&nbsp;&nbsp;&nbsp; rdpin=1;<br/>&nbsp;&nbsp;&nbsp; cspin=0;<br/>&nbsp;&nbsp;&nbsp; alepin=0;<br/>&nbsp;&nbsp;&nbsp; alepin=1;<br/>&nbsp;&nbsp;&nbsp; sja1000dataport=address;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; alepin=0;<br/>&nbsp;&nbsp;&nbsp; sja1000dataport=0xff;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp; rdpin=0;<br/>&nbsp;&nbsp;&nbsp; port=sja1000dataport;<br/>&nbsp;&nbsp;&nbsp; rdpin=1;<br/>&nbsp;&nbsp;&nbsp; cspin=1;<br/>&nbsp;&nbsp;&nbsp; return port;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font size="4"><font face="宋体"><font color="#0909f7"> // 返回读出的数据<br/></font>}</font></font></p><p><font face="宋体" size="4">void sja1000write(unsigned char address,unsigned char writedata)<br/>{<br/>&nbsp;rdpin=1;<br/>&nbsp;<br/>&nbsp;wrpin=1;<br/>&nbsp;cspin=1;<br/>&nbsp;alepin=0;<br/>&nbsp;alepin=1;<br/>&nbsp;cspin=0;<br/>&nbsp;sja1000dataport=address;<br/>&nbsp;alepin=0;<br/>&nbsp;wrpin=0;<br/>&nbsp;sja1000dataport=writedata;<br/>&nbsp;wrpin=1;<br/>&nbsp;alepin=1;<br/>&nbsp;cspin=1;&nbsp;&nbsp;&nbsp; <br/>}</font></p>
[align=right][color=#000066][此贴子已经被作者于2008-4-11 19:10:53编辑过][/color][/align]

diskcopy 发表于 2008-4-1 20:51

<p>上传电路图不成功,下面是我电路图在和讯里面的网页地址,可能只能这么看了</p><p>你点“查看原图”,可以看到我画的大图</p><p></p><p><a href="http://diskcopy.photo.hexun.com/36757117_d.html">http://diskcopy.photo.hexun.com/36757117_d.html</a></p>
[align=right][color=#000066][此贴子已经被作者于2008-4-2 7:55:34编辑过][/color][/align]

diskcopy 发表于 2008-4-1 20:54

<p>期待答复<a href="http://diskcopy.photo.hexun.com/originalPic.aspx?photoID=36757117&amp;pubTime=2008-4-1%2020:32&amp;filetype=.jpg&amp;hashid=318223DD836468D91A2768D318AB4640"></a></p>
[align=right][color=#000066][此贴子已经被作者于2008-4-2 7:54:36编辑过][/color][/align]

无中生有 发表于 2008-4-2 19:35

<p>&nbsp;&nbsp;&nbsp;&nbsp; 你的电路和程序已浏览,认为你的硬件电路图应该没太大问题,只要你读写测试缓冲区先写入0XAA再写入0X55都能正常读出的话那你的硬件应该没问题,不过硬件联通了并不表明就连接的好,一般没有谁用单片机的IO口来模拟SJA1000的时序,至少我还没见过,一般都是P0接地址数据线AD0-AD7.再用P2口来接其余地址线,应为这样能够方便的应用读写外设的指令来操作SJA1000.</p><p>再说你的软件应用模拟的方法来操作SJA1000很难保证真的把数据写进去了,就是抛开这些不说在你的联机程序(非自测模式下)中:::::::::::::::::::::::<font size="4">sja1000write(0x1f,0x88); <font face="宋体"><font color="#0909f7">//地址31,设置时钟分频寄存器,关闭时钟,PeliCAN模式</font></font></font></p><p><font face="宋体" color="#000000" size="4">建议你改为sja1000write(0x1f,0xc8)</font></p><p><font face="宋体" color="#000000" size="4">同时你的<font color="#f70909">sja1000write(0,0x0c);</font><font face="宋体" color="#0968f7" size="4"><font color="#f70909"> //返回到工作模式</font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#000000">这里你是让SJA1000退出复位模式但是却进入了自检模式.同时发送指令也是sja1000write(0x01,0x10);也是自接收请求命令而不是发送请求(0X01);我建议你先把上述问题问题搞清楚之后再解决后面的问题.</font></font></font></p><p><font face="宋体" color="#000000" size="4"><font face="宋体" color="#0968f7" size="4"><font color="#000000">同时提醒你LED是不能反应出PCA82C250是否发送数据,即使是一般的示波器也反应不出来,除非反复发送.</font></font></font></p>

diskcopy 发表于 2008-4-11 19:18

<p>感谢版主的热情回复!</p><p>我用我这个硬件电路跑了跑你贴上来的那个BASIC-CAN模式的收发程序,成功了</p><p>而且我用的就是我搞的这个P3口的读写程序,事实证明我的接口程序是没有问题的</p><p>你发的那两个贴中的发送和接收的ACR的值是不同的,不过,因为接收方的AMR设成了0XFF,所以可以正常收到的,但是,如果是两个发送方都往接收方发信息,过不了几秒钟就会死机的</p><p>我只保留我写的P3口程序部分,为了不误导他人,有错误的部分删掉了</p><p>现在我要研究其它的模块了,等有了时间,我会把PELI-CAN模式研究清楚的</p>

diskcopy 发表于 2008-4-11 19:19

<p>到时候把代码贴上来</p><p>感谢所有贴出CAN代码的人!</p><p>谢谢你们!BS收费的!</p>

无中生有 发表于 2008-4-19 10:32

看到你成功的消息我很为你高兴,也是应为你有这种坚持不懈的毅力才换来的成功,恭喜你,以后有什么需要帮助的尽管说。你可以加我的QQ:498575921

页: [1]

Powered by Discuz! Archiver 7.1  © 2001-2009 Comsenz Inc.

302 Found

302 Found


nginx/1.8.0