搜索
bottom↓
回复: 11

CAN总线上如果只有一台设备的情况下还能发数据吗?

[复制链接]

出0入0汤圆

发表于 2006-7-5 10:40:42 | 显示全部楼层 |阅读模式
  如果现在CAN总线上只有一台设备,那么这台设备如果启动CAN的发送,会出现什么情况呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2006-7-5 11:00:26 | 显示全部楼层
一直发个不停

出0入20汤圆

发表于 2006-7-5 11:16:20 | 显示全部楼层
没有明白你的意思.

出0入0汤圆

 楼主| 发表于 2006-7-5 11:22:41 | 显示全部楼层
我的CAN发送程序如下

  /*************************************************

                SJA1000发送子函数

*************************************************/

void CanTransmit(void)

{

        uchar status;

        CLI();                                                          //关中断               

        TransBuffer[0]=0x85;               

        TransBuffer[1]=0x00;       

        TransBuffer[2]=0x00;       

        TransBuffer[3]=Address;                   //将本机地址赋给ID码的ID5-ID12

        TransBuffer[4]=0x00;       

        TransBuffer[5]=0x01;       

        TransBuffer[6]=0x02;       

        TransBuffer[7]=0x03;       

        TransBuffer[8]=0x04;       

        TransBuffer[9]=0x05;       

        TransBuffer[10]=0x06;       

        TransBuffer[11]=0x07;       

        TransBuffer[12]=0xaa;                                          

        while(!(read_sja(SR)&0x04));   //wait until reg2^2==1 ,即判断发送缓冲器的状态

        PORTD ^= BIT(5);

        write_sja(TXEFF,TransBuffer[0]);                   //扩展帧,数据长度为8个字节

        write_sja(TXID0,TransBuffer[1]);

        write_sja(TXID1,TransBuffer[2]);

        write_sja(TXID2,TransBuffer[3]);

        write_sja(TXID3,TransBuffer[4]);

        write_sja(TXDATA0,TransBuffer[5]);

        write_sja(TXDATA1,TransBuffer[6]);

        write_sja(TXDATA2,TransBuffer[7]);

        write_sja(TXDATA3,TransBuffer[8]);

        write_sja(TXDATA4,TransBuffer[9]);

        //write_sja(TXDATA5,TransBuffer[10]);

        //write_sja(TXDATA6,TransBuffer[11]);

        //write_sja(TXDATA7,TransBuffer[12]);

        write_sja(CMR,0x01);                  //发送请求命令

        SEI();                                                      //开中断

}

  我试过,如果总线上只有一个设备,当我启动这个设备的发送时,即调用上面的发送程序时,第一次程序不会死,而第二次发送时,程序死在了while(!(read_sja(SR)&0x04));

出0入0汤圆

发表于 2006-7-5 11:27:45 | 显示全部楼层
做个实验不就知道那 ,

出0入0汤圆

发表于 2006-7-5 11:35:23 | 显示全部楼层
因为你还没发出去 就一直在查询等待啊 当然死机拉 很正常的

出0入0汤圆

发表于 2006-7-5 11:39:48 | 显示全部楼层
CAN 总线不可以只有一个设备在总线上。

要调试必须要有2个以上的设备!所以CAN控制器一般都有一个listen的工作模式,实现内部的数据闭环发送、接收“自发、自收”,方便调试!等调试好了再转入正常的收、发模式。

    这些在CAN 协议的手册里好象有说明,刚开始开发CAN总线的时候好象记得看过,现在忘了。

出0入0汤圆

 楼主| 发表于 2006-7-5 14:48:39 | 显示全部楼层
找到解决办法了,采用查询方式来发送数据.把从 while(!(read_sja(SR)&0x04));   开始的一段代码改为:

 if((read_sja(SR)&0x04) != 0);   //reg2^2==1 ,即判断发送缓冲器的状态

        {

            write_sja(TXEFF,TransBuffer[0]);                   //扩展帧,数据长度为8个字节

                write_sja(TXID0,TransBuffer[1]);

                write_sja(TXID1,TransBuffer[2]);

                write_sja(TXID2,TransBuffer[3]);

                write_sja(TXID3,TransBuffer[4]);

                write_sja(TXDATA0,TransBuffer[5]);

                write_sja(TXDATA1,TransBuffer[6]);

                write_sja(TXDATA2,TransBuffer[7]);

                write_sja(TXDATA3,TransBuffer[8]);

                write_sja(TXDATA4,TransBuffer[9]);

                write_sja(TXDATA5,TransBuffer[10]);

                write_sja(TXDATA6,TransBuffer[11]);

                write_sja(TXDATA7,TransBuffer[12]);

                write_sja(CMR,0x01);                  //发送请求命令

                SEI();                                                      //开中断

            CanTxSucFlag=1;                                  //置发送成功标志位

        }

   然后在主程序查询CanTxSucFlag的状态,即知道数据是否发送成功了.
-----此内容被LOVEMCU于2006-07-05,14:50:20编辑过

出0入0汤圆

发表于 2011-9-27 12:51:45 | 显示全部楼层
回复【7楼】LOVEMCU
-----------------------------------------------------------------------

出0入0汤圆

发表于 2013-4-25 01:09:45 | 显示全部楼层
goblin :CAN 总线不可以只有一个设备在总线上。

要调试必须要有2个以上的设备!所以CAN控制器一般都有一个listen的工作模式,实现内部的数据闭环发送、接收“自发、自收”,方便调试!等调试好了再转入正常的收、发模式。


找了好久,就为了找这句话

出0入0汤圆

发表于 2013-4-25 09:18:08 | 显示全部楼层
出其而亮 发表于 2013-4-25 01:09
找了好久,就为了找这句话

这句话太给力了!!

出0入0汤圆

发表于 2013-4-25 09:18:45 | 显示全部楼层
出其而亮 发表于 2013-4-25 01:09
找了好久,就为了找这句话

这句话太给力了!!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 03:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表