2009-01-16
评论5
楼主 2008/11/25 13:18:58
在不处理复杂协议的情况下,一个CAN口吞吐达最高负荷5000帧/秒时,CPU的负荷是多少?多个CAN口呢(如LPC2294)
答:即使用于严格的速度测试,LPC2000的速度完全能够胜任2-4个CAN通道。
sja1000出现错误而中断的几率由多大呢? 特别是发送错误,总线关闭等。
答:注意CAN-bus是一个网络,调试网络时需要在另一端连接一个正常工作的CAN节点。
CAN是可靠的网络;测试过2-5个CAN节点连续近距离持续发送/接收超过100小时而不出现通讯错误。
为什么MiniCAN总提示发送失败?
我在使用MiniCAN在自发自收模式下进行循环发送数据时,会经常提示发送失败,但是却已经接收到了数据。这是什么原因?怎样能避免呢?
答:是不是总线上连接有其他CAN节点?检查一下对方的速率。
硬同步在CAN控制器中是如何实现的?
答:可以看一下CAN2.0规范;如是IC设计,则去BOSCH看看复杂的CAN IP。
请教zlg的大虾们,我应用89c51+sja1000+82c250的结构,运行过程中发现一个问题,即正常运行一段时间后,sja1000死机(个人认为是死机),我的89c51仍然在正常运行,也对sja1000能启动发送数据进程(我用led指示),但是接收端没有收到,用示波器测量82c250的 CANH 或 CANL 脚(6,7管脚),看不到有波形,断电重新启动程序后,sja1000的收发过程中能在上述两个管脚中测量到波形,即上电运行能正常一段时间的收发(能测量到波形),之后就不行了(启动发送过程但是波形测量不到了),除非断电重启,望指教!
头两天查找sja1000的问题,以为是死机,后来逐步检测跟踪察看,发现程序运行一段时间后,sja1000的设置被无端改变,比如波特率,输出控制方式,测试寄存器值,我的原始设置为:BTR0 = 0x00;BTR1 = 0x4F;OCR = 0x1A;REG_TEST = 0xAA;但在运行一段时间后,这四个值会莫名其妙的被改变了,导致无法接受总线得数据,而改变的值是随机的,请问这是怎么回事?硬件电路是按照推荐的典型应用接的,我在程序中除初始化设置这几个参数外没有其他地方对他们进行操作,天理何在啊
答:复位端是否可能引入尖峰脉冲?
刚开始接触can——bus,买了一块5121,用随机带的zlgtest的软件测试,验证码设为0x00000001,屏蔽码设为0xffffff00,这样的话是不是只能接受id为0x01的帧了,用随机带的zlgtest的自发自收的发现id为0x00和0x10等等也能接收到了,请问是我的验证码屏蔽码设置错了么?
答:CAN节点的验收过滤设置与CAN帧的ID不是一一对应关系,具体请参考MANUAL目录下的《函数编程手册》或《CAN控制器SJA1000验收滤波器原理与应用》。
楼主 2008/11/25 13:20:05
答:CAN和RS485不是一个层次的, CAN的速率和传输距离不是RS485可比的。
CAN-bus是技术开放的且最具成本优势的现场总线。现场总线的优势.....大家都清楚吧?
RS-485标准,提供了多点(32点,在增加驱动电阻的情况下可以连接128节点)、双向通信的能力,RS485只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,因此用户可以建立自己的高层通信协议。
RS-485最大传输距离约为1219米,最大传输速率为10Mb/s。
CAN 总线当使用Philips P82C250作为CAN收发器时,同一网络中允许挂接110个节点。CAN 可提供高达1Mbit/s的数据传输速率,但数据传输速率与通讯距离成反比,高达1Mbit时通信距离只有40m。
CAN总线使用CANopen或DeviceNet有严格的协议,传输数据中ID号、功能号都占据传输数据的一定比例,因此CAN总线的数据有效传输率不高。
网站文档《CAN-bus 现场总线应用方案--RS-485升级...》中有一些性能比较。
单片机用的是51系列,c语言,如果SJA1000模式寄存器的地址为 OXC000,请问用什么样的命令来读写,然后判断该寄存器可以被正常读写。
答:可以通过写入并验证SJA1000测试寄存器(地址:0x09,名称:REG_CAN_TEST)的数值来判断CPU与SJA1000的硬件连接是否正确。
例如,第1次向SJA1000测试寄存器REG_CAN_TEST写入0x55并读出验证;如果通过,则再次向寄存器REG_CAN_TEST写入0xAA并读出验证;如果2次验证均通过,说明CPU与SJA1000连接正确,否则需要检查相关的硬件连接。
在《基于CAN控制器SJA1000控制器的BasicCAN控制模块》、《基于SJA1000 CAN控制器的PeliCAN模块》源代码中均有测试SJA1000硬件接口函数,函数名称为:SJATestInterface,用户可直接调用。
以下程序为《基于CAN控制器SJA1000控制器的PeliCAN模块》中关于SJATestInterface函数的源代码。
char SJATestInterface(unsigned char testvalue)
{
char status=0;
bit ErrorFlag =1;
unsigned char ErrorCount = 0x20;
unsigned char temp = testvalue;
while(--ErrorCount)
{
WriteSJAReg(REG_CAN_TEST,temp);
if(ReadSJAReg(REG_CAN_TEST) == temp)
{
temp =~temp ;
WriteSJAReg(REG_CAN_TEST,temp);
If(ReadSJAReg(REG_CAN_TEST) == temp)
{
temp =0;
WriteSJAReg(REG_CAN_TEST,temp);
ErrorFlag =0;
break;
}
else continue;
}
}
if(ErrorFlag)
{
status = SJA_INTERFACE_ERR ;
}
return (status);
}
我最近在学习CAN控制器SJA1000,遇到了一个问题,希望那一为大虾能给予帮助,在此先谢了.问题是这样的:如果一个SJA1000的节点(节点1)接收到了一个远程帧,节点1怎样知道,这一远程帧是那一个节点发来的?如果节点1要给该节点以应答,识别码应该怎样写?
答:需要有应用层协议才能区分网络的源节点、目的节点。
求教大侠,用ADuC812开发CAN的时候,直接把89C51测试是正确的CAN发送程序(在程序开头加$MOD812)移植到ADuC812中去,把程序下载进去之后,运行正常(能不停的向ZLGCAN卡发送数据);但是重新上电后,不工作了(没有数据上来);可是另外编了一个串口发送程序下载进去之后运行正常,重新上电也正常。我是想把ADuC812当89C51用(主要是想用它的AD)是不是除在程序开头加$MOD812外,还需要其它的设置?如果是,怎样设置?谢谢!
答:硬同步。CAN控制器中如何执行硬同步?
楼主 2008/11/25 13:20:41
我板子上的sja1000+82c250,初始化,把发送的数据帧发到发送缓冲器都还可以,但是一设置命令寄存器的自接收命令和中止发送命令后,就在状态寄存器里的是:出错状态,发送缓冲器状态,然后TX错误计算超出127,ECC里的是03,位错,帧起始错..检查了好久也不行..请帮帮菜鸟的我吧.55
答:搜索论坛上过去的帖子,自收发需要满足几个条件。
如何用串口发送连续的13位低电平和一位高电平
就大部分的UART来看,都是8位,8位发的。要发送连续的13个0和1个1,请问如何实现。接收时又如何接收?
答:前面有回复:变化波特率以适应硬件。DP-51H实验仪的一个功能:扩展LIN-bus接口,提供完整的“LIN-bus规范、应用范例及其软件包”,实现LIN-bus的通讯实验;
两个通信完好的两个节点,如果节点CAN1发送了一帧数据,而这帧数据里的标志符不是另一节点CAN2的标志符,当发送以后,在应答间隙内,CAN2是否会发送一个显性位作为回应呢?
书上说“当接收器正确地接收到有效的报文,就会在应答间隙发出一显性位”,这里的正确接收是何概念呢?是完全满足验收滤波条件存入接收FIFO吗?
答:在数据链路层检查正确,不需要经过验收过滤,就硬件回应。
初次作CAN的项目,目前我有两个CAN节点,分别在回环模式下测试通过,波特率为125K,两节点直接将控制器的CANTX(CAN1)--CANTX(CAN2),CANRX(CAN1)--CANRX(CAN2)相连,现在CAN1能够向总线发送满足CAN2接收条件的报文,但不见CAN2回复期望的报文(CAN如果收到报文肯定会回复的)!不知为什么,请高手赐教!谢谢了
答:建议在总线上加一个标准ZLGCAN监控节点,监控总线的帧数据;只有2个原因:
1、CAN2没收到;
2、CAN2已发送,CAN1没有收到。
自答:原因是:由于我的两个can控制器不同CAN1使用SJA1000,CAN2使用的是MCP2510,这两个控制器的标识码寄存器位定义不同,我先前没有注意到,所以报文无法正确的被接收!还是很感谢黄老师:)
请问,它的两个输出端分别接个5欧电阻,并且挂30P电容接地应该可以起到滤波的作用吧,如果节点太多会使电平保持的时间太小吗?(就是变成三角波了)
答:节点数目在大于30~50时可以考虑不用PCA82C250滤波电容和电阻。
我在实验室调试两个CAN节点的通信,终端匹配电阻均为124(电位器,用万表测试),SJA1000+82C250,加斜率电阻。速率800K,在斜率电阻一个为9.6K,另一个为6.8K(也是电位器)的情况下可以通信,通信距离35米(普通网线),斜率电阻再大就不能保证了。
另外在连接时必须是一个节点的CAN-H接另一个节点的CAN-L。按书上的接线示意图将CAN-H共同接在同一根总线上,CAN-L共同接另一根总线上就不通,为什么?
答:这个方法是错误的,供参考的正确电路连接图可以从CAN-bus页面的应用方案中下载获取。
自己开发了一个CAN节点,要与PLC通过CAN通讯,由于一个网上所有CAN节点BTR0、BTR1的参数应一致,PLC各波特率的BTR0、BTR1参数不知,那么我自己开发的CAN节点这两个参数如何定?
答:编写个自动检测波特率程序;PLC一般也可设定。
楼主 2008/12/22 9:37:47
这个总结比较基础很好,初学者适用!
楼主 2009/1/16 16:24:05
是否需要增加电缆的横面积?