控制工程师论坛

现场总线

关于can的一些经验总结 3

xilinxue
xilinxue

2008-11-25

问:不好意思,因为我在调试中,下发的报文没有反应,但是能收到下位机送上来的信息,我问了我们开发装置的同事,他说可能跟ID有关,所以我想再确认一下:
frameinfo.ID = (DWORD)(Send_Group[i].Buffer[0] << 8) + (DWORD)Send_Group[i].Buffer[1];//没有把整个ID右移5位
Data[0] = Send_Group[i].Buffer[2];
Data[1] = Send_Group[i].Buffer[3];
Data[2] = Send_Group[i].Buffer[4];
Data[3] = Send_Group[i].Buffer[5];
Data[4] = Send_Group[i].Buffer[6];
Data[5] = Send_Group[i].Buffer[7];
Data[6] = Send_Group[i].Buffer[8];
Data[7] = Send_Group[i].Buffer[9];
frameinfo.DataLen=8;//datalen
memcpy(&frameinfo.Data,Data,8);
frameinfo.SendType = 0;
frameinfo.RemoteFlag = 0;
frameinfo.ExternFlag = 0;
if (VCI_Transmit(2,0,0,&frameinfo,1)==1)
{
    TRACE0("写入成功");       
}
else
{
    TRACE0("写入失败");
}
这样的frameinfo信息,在下发时CAN卡是否会对frameinfo.ID重新处理?

答:这个ID就是发送到总线上的CAN ID。
CAN的id有11位范围或29位范围。
    PCI-9810 光盘上的示范代码:
        VCI_CAN_OBJ senddata;
        senddata.SendType=sendtype;
        senddata.ExternFlag=frametype;
        senddata.RemoteFlag=frameformat;
        senddata.ID=id;
        senddata.DataLen=i;
        memcpy(senddata.Data,data,i);

        if(VCI_Transmit(m_devtype,m_devind,m_cannum,&senddata,1)==1)
        {
                ListBox1->Items->Add("发送成功");
        }
        else
        {
                ListBox1->Items->Add("发送失败");
        }
答:检查一下你所谓的上位机的验收滤波寄存器的设置
回复:通讯成功了,谢谢各位,错误原因是我的程序中有个BUG。


问:用2119做了一个CAN中继器,单向发两边都很正常,1M无延时的发送都可以应付,可是双向发发几百帧就堵塞,很奇怪,是处理能力不够还是怎么回事?我用的是查询,主循环里查询CAN1、CAN2控制器的接收状态位,置位就转发。感觉已经不能再精简了,请大家帮忙诊断一下,谢谢!
答;采用中断接收并压入缓冲区,主程序查询发送OK,堵塞绝对不是芯片性能引起的,除非另一方设备接收存在问题。 

问:关于SJA1000的读写时序
我看sja1000的数据手册上是:先是ALE锁存信号有效对地址进行锁存,然后才是/CS片选信号有效(此时读写信号,数据也有效),我得疑问是/CS信号在整个CAN通信期间不是一直有效吗?在地址锁存时必须是无效的吗?在CAN使用期间我如果让/CS一直为低可以吗?请知道的大侠不吝指教啊!!
答:若不需要考虑其他地址冲突和功耗因素的可以这样。

问:请教:CAN总线收发器PCA82C250的斜率电阻Rs的选择问题。
是用47k的吗?还是4.7k啊?哪位仁兄告诉一下,谢谢!
答:如果你没有什么特殊的要求,直接接地就行了
答:47k的。

问:各位大侠,我想用双滤波进行通讯,我想请教一下,另一个节点是不是也必须是双滤波格式才能进行通讯?我在通讯中设置的其中一个节点的ACR0,ACR1,ACR2,分别是00,00,02,选择的是标准帧格式;另一个节点的发送标识1,标识2分别是00,0B ,为什么也能够通讯呢,按照滤波器工作原理来说,只要一个滤波器通过验收就能通讯,可是上面00,0B并没有通过滤波器1呀!我糊涂了,请教各位大侠,非常的感谢!
答:友情提醒朋友,资料很多在网站上已发表,查找一下即可。见《CAN控制器SJA1000验收滤波器原理与应用》。

问:标识符确定??
假设网络中有A、B两个节点。A请求B发送数据,则A发送远程帧(B标识符+RTR)。B点接收到该帧后,如何判断这是谁发来的请求帧?若是A点,则B点发送数据帧(A标识符+RTR+数据长度+数据)。关键的问题是,在多个节点组成的系统中,各节点之间如何管理?相互之间如何识别和握手??答:应用层协议的建立,请参考《CAN-bus 现场总线基础方案--通讯篇》。
答:每个结点都是对等的,你只需要规划好发送结点的ID 与接收结点的acr,amr的对应关系就好了。可以这样理解,每个结点的数据都发送到了总线上,至于这个数据哪个结点能接收到,就是决定于这个结 点的acr,amr了,当然要比照发送结点的ID。

新手上路:两个CAN节点相连时,CAN高线连CAN高线、CAN低线连CAN低线,还是交叉相连?
答:CAN_H连接CAN_H,CAN_L连接CAN_L。

问:两个CAN节点(51+sja1000+82c250,自测试通过),id分别是1和2,Peli模式,波特率相同,发送端发出一帧(扩展帧)后,SR由0C变成60(表示:正在发送且出错),ECC变成D9(表示:发送时应答时间段填充错),why? 是因为另一个节点未发出应答么?应答应由硬件自动完成吧?那时因为什么呢?(波特率100kbps,BTR0=41H,BTR1=B9H)
答:应答有硬件自动完成。

问:我现在没有CAN的接收器,就简单的把CAN的两个输入、输出连起来,发现输出有信号,输入没信号,不知这样可不可以?有没有更好的办法来检验我设计的电路?
答:将CAN控制器的TDx与RDx连接可以进行测试,具体参考相关的CAN控制器手册。本人不提倡这种方法,因为没有实际应用价值。


询问sja1000在16mhz晶振下波特率问题
我看了sja1000的总线定时寄存器BTR0和BTR1的设置问题,我看了多个资料上的数据,感觉不太统一,发贴确认一下,16MHZ情况下是这样的吗?,麻烦了。另外,我也才学了一端时间的can总线,有此爱好的朋友可以加我msn:tianlei_126@hotmail.com或者qq:18235473
16MHZ晶振下
波特率(Kbit/s)BTR0     BTR1
20              053H,    02FH
40              087H,    0FFH
50              047H,    02FH
80              083H,    0FFH
100             043H,    02fH
125             03H,     01cH
200             081H,    0faH
250             01H,     01cH
400             080H,    0faH
500             00H,     01cH
666             080H,    0b6H
800             00H,     016H
1000            00H,     014H

回帖

评论2

总共 , 当前 /
首页 | 登录 | 注册 | 返回顶部↑
手机版 | 电脑版
版权所有 Copyright(C) 2016 CE China