LOVEMCU 发表于 2006-7-5 10:40:42

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

  如果现在CAN总线上只有一台设备,那么这台设备如果启动CAN的发送,会出现什么情况呢?

AVR-MEGA128 发表于 2006-7-5 11:00:26

一直发个不停

wenming 发表于 2006-7-5 11:16:20

没有明白你的意思.

LOVEMCU 发表于 2006-7-5 11:22:41

我的CAN发送程序如下

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

                SJA1000发送子函数

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

void CanTransmit(void)

{

        uchar status;

        CLI();                                                        //关中断               

        TransBuffer=0x85;               

        TransBuffer=0x00;       

        TransBuffer=0x00;       

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

        TransBuffer=0x00;       

        TransBuffer=0x01;       

        TransBuffer=0x02;       

        TransBuffer=0x03;       

        TransBuffer=0x04;       

        TransBuffer=0x05;       

        TransBuffer=0x06;       

        TransBuffer=0x07;       

        TransBuffer=0xaa;                                          

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

        PORTD ^= BIT(5);

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

        write_sja(TXID0,TransBuffer);

        write_sja(TXID1,TransBuffer);

        write_sja(TXID2,TransBuffer);

        write_sja(TXID3,TransBuffer);

        write_sja(TXDATA0,TransBuffer);

        write_sja(TXDATA1,TransBuffer);

        write_sja(TXDATA2,TransBuffer);

        write_sja(TXDATA3,TransBuffer);

        write_sja(TXDATA4,TransBuffer);

        //write_sja(TXDATA5,TransBuffer);

        //write_sja(TXDATA6,TransBuffer);

        //write_sja(TXDATA7,TransBuffer);

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

        SEI();                                                      //开中断

}

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

pcl001 发表于 2006-7-5 11:27:45

做个实验不就知道那 ,

AVR-MEGA128 发表于 2006-7-5 11:35:23

因为你还没发出去 就一直在查询等待啊 当然死机拉 很正常的

goblin 发表于 2006-7-5 11:39:48

CAN 总线不可以只有一个设备在总线上。

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

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

LOVEMCU 发表于 2006-7-5 14:48:39

找到解决办法了,采用查询方式来发送数据.把从 while(!(read_sja(SR)&0x04));   开始的一段代码改为:

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

        {

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

                write_sja(TXID0,TransBuffer);

                write_sja(TXID1,TransBuffer);

                write_sja(TXID2,TransBuffer);

                write_sja(TXID3,TransBuffer);

                write_sja(TXDATA0,TransBuffer);

                write_sja(TXDATA1,TransBuffer);

                write_sja(TXDATA2,TransBuffer);

                write_sja(TXDATA3,TransBuffer);

                write_sja(TXDATA4,TransBuffer);

                write_sja(TXDATA5,TransBuffer);

                write_sja(TXDATA6,TransBuffer);

                write_sja(TXDATA7,TransBuffer);

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

                SEI();                                                      //开中断

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

        }

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

sbsbsbsbsb 发表于 2011-9-27 12:51:45

回复【7楼】LOVEMCU
-----------------------------------------------------------------------

出其而亮 发表于 2013-4-25 01:09:45

goblin :CAN 总线不可以只有一个设备在总线上。

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



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

guowanling8061 发表于 2013-4-25 09:18:08

出其而亮 发表于 2013-4-25 01:09 static/image/common/back.gif
找了好久,就为了找这句话

这句话太给力了!!

guowanling8061 发表于 2013-4-25 09:18:45

出其而亮 发表于 2013-4-25 01:09 static/image/common/back.gif
找了好久,就为了找这句话

这句话太给力了!!
页: [1]
查看完整版本: CAN总线上如果只有一台设备的情况下还能发数据吗?