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
楼主 2008/11/25 13:28:23
答:16mhz下多个资料BTR0,BTR1的值不同,事实上都是对的 ,这两个值只要遵从比例就好了,详细了解一下位定时的计算就清楚了。
问:我现在正在用sja1000做CAN接口的硬件部分,请问书上CAN_H和CAN_L部分间的两个二极管起什么作用啊?是不是必须接啊,应该选什么型号的呢?(比如说什么功率的)查了好久都没看到这部分的说明,请大家一定告诉我啊,着急要画图啊!先行谢过了!!
答:这两个二极管叫做瞬态抑制二极管,主要是总线过压保护,具体可以查找瞬态抑制二极管资料。
答:这两个二极管可以不要,如果总线稳定,没什么影响,就是一种保护。个人看法,仅供参考,多多指教!
问:在CAN卡中,把IDH和IDL放在同一个ID中,请问发送的时候是不是把ID右移5位来分成IDH,IDL?
答:在你过去的问题中从中抽取一些有用的信息“公司中规定IDL中低五位是固定的01000”可以确定:
1.使用的是数据帧,不用远程帧;
2.数据长度dlc恒为8;
你想发送frameinfo.ID = 0x000081E8,(这是你们的协议吧?),分解IDH=0x81,IDL=0xE8,这个时候真正的id是0x000081E8 >> 5;丢了什么呢?dlc和rtr位,而在VCI_CAN_OBJ中DataLen对应dlc,也就是你们公司要求的8,RemoteFlag对应rtr位设置为0。
总结:
VCI_CAN_OBJ.ID = 0x000081E8 >> 5
VCI_CAN_OBJ.DataLen = 8
VCI_CAN_OBJ.RemoteFlag = 0
其他略。
问:为什么我一上电,SJA1000的INT管脚就为低电平,是否要加上拉电阻?
答:SJA1000的INT管脚是一个开漏输出,需要外部上拉。
我用CAN-MINI和饶教授书中例子的实验板通讯,发现总也不能连通。
用饶板发送数据,不能被CAN-MINI接收,且82C250上的数据发送一直不停。我想是不是有下面几个问题:
1、波特率不对。饶板用40K,不知道MINI怎么设,设哪几个参数,MINI用的晶振频率多少
2、设定的ID 不对,我真不知道该怎么设ID,能不能给个例子。 先谢谢了!:)
答:先看CAN-MINI的用户手册,那里能找到大部分答案。
CAN-MINI用16MHz晶振;网站有一个波特率计算工具下载;
楼主 2008/11/25 13:28:43
问:设波特率是不是用“打开设备-》定时器0、定时器1”?每次都是0x00,0x14.MINI的缺省波特率是多少啊?
答:用户说明文档中有常用波特率设置表格,0x00、0x14对应1Mbps。
问:两个CAN节点,Peli模式,波特率相同,发送一帧后,SR由0C变成60,ECC变成D9(发送时应答时间段填充错),why?
是因为另一个节点未发出应答么?应答应由硬件自动完成吧?(波特率100kbps,BTR0=41H,BTR1=B9H)
答:none。
问:51的晶振和与51相连的SJA1000的晶振频率一定要相同么?
答:SJA1000的晶振只管CAN bit逻辑及总线bit stream定时,与总线接口无关。
问:在发送完一帧数据后,一定要用中止发送么?接收方的应答是硬件自动完成还是需要写软件实现?
答:终止发送一般仅仅用于处理异常终止,正常发送成功没必要。
问:SJA1000用6M的晶振,波特率100Kbps,BTR0、BTR1应该怎么设置啊?用计算工具得出很多值?应该怎么选择呢?
答:采样点在65%-85%之间的都行,短距离没有特殊要求。
问:SJA1000的初始化均正常,写发送缓冲区也正常,但是对命令寄存器写发送命令后,用示波器观察发送脚,无信号,读状态寄存器的值为00H,烦请各位高手帮忙分析,感激不尽!!!
答:读状态寄存器的值为00H?硬件连接是否正常,sja是否真的受控了?还有晶振起否?复位电平撤销否?。。。等等
依稀记得还有两个寄存器设置为0x1a(输出管脚配置)和0xc8(模式及分频)的;
千万不要引脚连错!!!这样类似的问题不止是听过一两次了。。。