打印
[CAN-bus/DeviceNet]

公布一下偶的BasicCAN总线实验程序

[复制链接]
5707|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
桂电飞天鼠|  楼主 | 2007-5-20 22:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看很多朋友在学习CAN,在网上却找不到现成能用的参考例子,本人当初刚开始学习的时候也找不到现成的,所以也明白那种期待的心情。所以我把自己做BasicCAN总线实验时的例子公布,供各位参考~~~

唯一要求就是,在完成了CAN总线的学习之后,希望能够回到这里,为这里作一些贡献,让资源共享得到一个推广。

BS那些学会了之后却再也不回来这里分享经验的人,那些人,对不起,你没有资格在这里得到帮助。

本实验有两个CAN节点,程序的注释不是很详细,而且在完成实验之后一直没时间整理,所以请体谅,不过应该能看得明白。

下面压缩包里包括两个文件夹,一个是发送端程序,一个是接收端程序;编译器为Keil uv3,编译的时候会有10个警告,这些只是MAX7219的驱动有一些函数没有使用而引起的,不必介意。
相关链接:https://bbs.21ic.com/upfiles/img/20075/2007520223820362.rar

相关帖子

沙发
hgchenkv| | 2007-5-20 23:21 | 只看该作者

谢谢!

谨记教诲!一定分享!顶!桂电飞天鼠-好人!

使用特权

评论回复
板凳
hq_y| | 2007-5-21 01:05 | 只看该作者

不错的~~~~~~~~~~up~~~~~~~~

使用特权

评论回复
地板
hgchenkv| | 2007-5-21 14:49 | 只看该作者

求助

各位高手好,请帮忙指导!在桂电飞天鼠高手的程序指点下,对BASICCAN的运行方式有了差不多的理解,通过设置跟踪显示,下载运行,还是遇到了以下问题:
void main(void)
{
    Display1(1);
    SJA_RESET = 1;
    DelayTime(50);
    SJA_RESET = 0;
    DelayTime(500);
    SJA_RESET = 1;
    Display1(2);
    TimeInit();
    SJA1000_init(); /*主函数执行到这里……*/
    Display1(5);
    EX0 = 1;
    EA  = 1;
……
}

void SJA1000_init(void)
{
   Display1(3);
    while(connect_OK==0)             
   {
       SJAconnect_judge();                //检测设备连接
       Display1(4); /*一直在循环执行Display1(4)这个显示函数*/
   }
……
}
#define base_Adr 0x8000 /*51的P2-7接SJA1000的/CS*/
我用万用表检查了所有硬件连接,都是连通的,但一直都是执行到这个地方就不动了,小弟接触CAN不久,请有调试经验的高手们指导,谢谢了~~

使用特权

评论回复
5
桂电飞天鼠|  楼主 | 2007-5-21 15:19 | 只看该作者

rt

你的SJA的/CS脚是直接接在P2.7的吗? 是的话你用的地址不对,可以用0x0000作基地址.

使用特权

评论回复
6
hgchenkv| | 2007-5-21 17:49 | 只看该作者

谢谢!

桂电飞天鼠大哥你好!
我的SJA的/CS脚是直接接在P2.7的,参照您以前的帖子:
//桂电飞天鼠
P0口接到SJA上,为低八位的地址线以及8位数据线,然后P2口任选一端口接SJA的/CS位(假如不用74LS138等器件时):
如/CS接
P2.7,那起始地址为:0x8000;
P2.0, 那起始地址为:0x0000;
//桂电飞天鼠
但为什么又是0x0000作基地址呢?而且在P2.7接SJA /CS引脚的情况下我也用
#define base_Adr 0x0000 了,但是还是显示以上硬件设备连接不上,该看的该查的我都整了整整一天了,还是没能发现什么实质性的错误,还请指点,谢谢!
另求解:SJA晶振(12M)两端起振电压相差为0.15v左右,我看了51的晶振也就差个0.2V左右(51没问题),所以我感觉这个没什么问题;电路板焊接都查过也没什么问题了,现在剩下的感觉可能是SJA1000的问题了,换了一个片子问题仍旧,怎么检查SJA1000的正常与否,请指点!
劳烦高手了~~~~~

使用特权

评论回复
7
桂电飞天鼠|  楼主 | 2007-5-21 19:54 | 只看该作者

rt

那个说地址的帖子,我当时写错了,不过我后来改正了,应该都为0x0000,但其实是有一点区别的。

你现在的问题,估计还是地址问题。

地址确定:
http://www.21icbbs.com/club/bbs/list.asp?boardid=43&page=1&t=2530895&tp=%uFF33%uFF2A%uFF21%uFF11%uFF10%uFF10%uFF10%u7684%u5730%u5740%u5982%u4F55%u786E%u5B9A

在Keil中必须设置的地方:
http://www.21icbbs.com/club/bbs/list.asp?boardid=43&page=2&t=2516686&tp=%u8BF7%u95EE%u600E%u4E48%u770B%u5BC4%u5B58%u5668%u7684%u503C%uFF1F

使用特权

评论回复
8
coolhu| | 2007-5-22 20:23 | 只看该作者

rt

看了飞天鼠老弟的大作,
对于can寄存器的配置是否可以不用函数的方式进行配置?
直接对寄存器操作赋值的方式是否更简便一些,
我的程序是采用的这样方式,也可以运行
不过可能我的这样操作方式不够专业化

使用特权

评论回复
9
桂电飞天鼠|  楼主 | 2007-5-22 20:31 | 只看该作者

可以的

当初我只是用网上的驱动修改使用的,所以结构还没有整理过,比较烦琐。

使用特权

评论回复
10
hgchenkv| | 2007-5-23 22:34 | 只看该作者

致谢

几天没来了,谢谢 桂电飞天鼠 大哥的指导,程序已经调通,运行很好!
呵呵,我比较喜欢 桂电飞天鼠 高手的这种寄存器配置定义方式。
还有个问题,郁闷了我这几天了,我两块板子通信,一块/CS接P2.7可以正常跑起来,但另一块/CS接P2.7就跑不起来,只有断开才可以正常运行,我后来对主程序有作了如下修改:
SJA_CS = 1;/*对SJA1000的片选处理*/
    SJA_RESET = 1;
    DelayTime(50);
    SJA_CS = 0;
    SJA_RESET = 0;
    DelayTime(500);
    SJA_RESET=1;
但这样还是相同的问题出现,虽然现在通信正常了,但总感觉不是按照预期的跑起来的,感觉怪怪的,请高手指教!谢谢!

使用特权

评论回复
11
桂电飞天鼠|  楼主 | 2007-5-24 00:20 | 只看该作者

恭喜呀~!不错,继续加油~!

至于你说的那个另一块板子有问题,你就自己研究看看,比较有可能是硬件问题。

使用特权

评论回复
12
hgchenkv| | 2007-5-24 12:24 | 只看该作者

好的,继续研究!出了结果一定把这个不是大问题的疑难留给初学的需要者!

使用特权

评论回复
13
baipengwei| | 2007-5-27 13:31 | 只看该作者

正在看CAN方面的,支持下

正在看CAN方面的,支持下

使用特权

评论回复
14
魔卡| | 2007-5-28 17:06 | 只看该作者

rt

正在进行中,还不能够理解的很清楚

使用特权

评论回复
15
willshi| | 2007-8-17 10:53 | 只看该作者

求助

飞天鼠大哥,我看了你的程序有些地方不太懂,底下那个P1.7为什么取非,它接的是哪个管脚?我已经把P1口接数码管了。望指点。


// 函数类别   SJA1000基本操作
// 函数名称   Write_SJAsendBUF
// 入口函数   无
// 出口函数   setting_success
// 操作寄存器 发送缓存器(10-19)状态寄存器02
// 函数功能   写发送缓存器
// 特殊要求   只能在工作模式下写
//------------------------------------------------------------------------------------------------------
bit Write_SJAsendBUF(void)
{
    bit setting_success=0;  
    unsigned char i;

//    while(SJA_workmode==0)
//   {
//      setting_SJA_workingmode();                   //设置SJA在工作模式
//   }

    if((CANREG_read(0x02)&0x10)==0)
   {
       if((CANREG_read(0x02)&0x04)!=0)
      {
          CANREG_write(10,send_BUF.FrameID_H);
          CANREG_write(11,(send_BUF.FrameLENTH)|(send_BUF.FrameKIND<<4)|(send_BUF.FrameID_L3<<5));
         
          if(send_BUF.FrameKIND==0)
         {
              for(i=0;i<send_BUF.FrameLENTH,i<8;i++)
                CANREG_write(12+i,send_BUF.Frame_Data);
              P1_7 = !P1_7;
         }
                                //发送寄存器写成功

使用特权

评论回复
16
桂电飞天鼠|  楼主 | 2007-8-17 14:13 | 只看该作者

P1.7接的是发光二极管,只为调试使用

所以可以不用的.

使用特权

评论回复
17
willshi| | 2007-8-17 15:11 | 只看该作者

多谢了

谢谢了。

使用特权

评论回复
18
cocorocky| | 2010-10-10 16:23 | 只看该作者
强烈顶!!!

使用特权

评论回复
19
ATM_Emerson| | 2010-10-26 14:53 | 只看该作者
:Q为什么我下不了啊?

使用特权

评论回复
20
ATM_Emerson| | 2010-10-27 10:30 | 只看该作者
顶起~!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

273

帖子

0

粉丝