1、CAN总线学习心得:zlg 关于 can帖子汇总(一)2009-04-28 11:01SJA1000的常用标准波特率设置,为什么基本上都是单次采样?即使是低速的时候也是这样的,既然 TSEG1的设置周期都很大,比如都大于 10了,为什么不让他采样三次呢?答: 是不好理解,但那是 CiA推荐的值。用 51系列芯片和两个 SJA1000接口还要外扩一个 RAM,请问 51的 ALE能否同时与三个芯片的 ALE管脚相连(地址不同)? 有哪位高手做过双 SJA1000冗余的请指教! 答: 能同时连接。 请问 CAN总线在想传输 1000m的情况下,最快的速度能到多少呢? 答: 50kbps = 130
2、0m。如果一个网络中只有 2个节点,其中一个处于监听模式,另一个节点发送报文会使处于监听模式的节点进入中断吗? 答: 能进入接收中断,你自己的试验也可以证明。想组建一个简单的 CAN网络,已经有两个节点,我想问 CAN总线如何组建,终端电阻安装在哪里?小弟还没有入门,大虾们指点一下。答 1:直接将节点 CANH和 CANL连到总线上,终端电阻接在总线两端,大约 120欧。答 2: 推荐北航出版现场总线 CAN原理与应用技术,研读一下。请问各位老师:我是一名 can总线的新手,我正在做 can总线的开发,控制器用 sja1000t(我自己两个控制板互通),但我在发送数据后将出现总线关闭,我看到发
3、送错误计数器在不断增加,直到 0xff,最后恢复到 0x7f,谢谢各位老师帮我解答这个问题。或者对我给与启发答 1;首先调通单个节点。答 2:这是单节点发送没有成功(或者由于网络中其他节点没有收到帧并在响应场响应);建议参考网站 CAN应用方案。我想请教各位 can远程贞有何作用?如何应用?在什么情况下才需要用到远程贞?谢谢了!答:远程幀的用与不用完全取决你自己的协议,can 有远程幀的功能,是可用可不用的!用网站提供的计算波特率的工具算出的数,12k 以上的都正确,无论是自接收还是两个节点通讯都没有任何问题。但是 12k以下的数据一个都不能用,两个节点通讯没有成功的,自接收有 10k的几个数
4、据成功。我们的项目要求必须在 10k以下,最好是 5k,但是不成功,自己计算的数据也没有成功的。(我们至少试验了 30多个,所有情况都考虑了。)我现在怀疑 sja1000的波特率根本达不到 5k和相对应的传输 10km。或者可以谁能提供个经过实践检验的正确的总线定时器 0和 1的设置呢?要求低于 10k。答:PCA82C250/251 可以保证 5KBPS的速率;比如 ZLGCAN系列接口卡。答:tja1050 在低速时好像有问题。我用 1050进行 5k的时候不行,用 82c250很好,你可以试一试。我本想双机调试,一边收,一边发,但跑程序后,发送方会不断进入复位模式,所以现在进行自测试模式
5、,我先进入复位模式,设置进入 PELICAN模式,对寄存器初始化后,设置接收,发送中断使能,最后设置进入自接收,单滤波模式,这样初始化就结束了,我的 ACR0ACR3 为 0x55,0x55,0x55,0x50,AMR0AMR3为0xff,之后,我就往 BUFFER里填数,0x88,0x55,0x55,0x55,0x50,0x30,0x31,.0x37,之后,启动自接收请求命令,但是程序只进入了中断一次,是发送空中断,接收中断没有产生,我读发送错误寄存器,发现有错误产生,我读接收计数寄存器,为 0,说明我没有收到数,但我读接收 BUFFER时,值为0x55,0x55,0x55,0xff,0xf
6、f,0xff,0xff,0xff,0,0,0,0,0,以上测试时,我在 CANH和 CANL之间加入了两个 120欧的匹配电阻并联在一起的,请各位高手指点呀,谢谢了答:在总线上加个 CAN接口卡会方便许多,或者加个捕获功能的示波器也可以检测波形。仿真环境:keil uv2编译器:keil c51 7.0仿真器:tks-591scpu:p87c591程序大小:8K 左右兄弟在一片 CPU中烧写了一个,运行一个 CAN总线,IIC 总线测试程序能够正常运行。这个基础上加上应用程序后在仿真机中运行正常,但是烧写到 cpu后插入 cpu程序不能运行,请问是什么原因?另外一个问题:在另外一个项目中条件相
7、同,程序只有 4K,程序正常跑着,CAN 接口可以检测到输出波形但是却不能正确传输数据,在一块旧板子上就可以,比较两者之后发现电路完全相同测量也正常,只是布局不同,请教原因。答:程序已运行了吧?可能是 HEX文件有错;编制程序时注意 P87C591的 ERAM设置、6CLK 设置。位流数据采样自发送节点的 82c250的 Tx管脚。测试条件:pelican ,扩展,双滤波模式,对方 ID:0x88,0x11,0x55,0x10,发送的对方 ID为:0x88,0x11,0x00,0x00,发送 2字节数据为:0x05,0x06采集的位流数据如下:0100010000010111000100000
8、1000001000001000100000110000010001101100001001110111111111111请教位流数据的含义?答:自行计算时要区分位,还需要进行“位填充”的逆运行;简单的方法是将此信号连接至 1个 CAN接口卡的 RXD引脚。用 ZLGCANTEST软件调试和板卡通讯,但是板卡能够正常通讯几次后就不再上传数据,查看 SJA1K的状态寄存器,发现是 SJA1K正在发送,但是怎么老是出现这种问题啊,请有相同经历的高手教小弟一把啊!谢谢了!答:其中的一个原因是收不到接受应答,比如对方 id错误通讯实验:长度 1km,同样的线路,得用 ZLG公司的 CAN设备(9820
9、,5121)通讯是正常的,但是我们自已的系统,在 1000米时(50K 波特率)的通讯是完全正常的,但是再上加一段线路(约 70米,与 1公里电缆是不同线质,螺旋状),数据丢失严重.我们的硬件是完全提供的参考电路的,所以说硬件上应当没有问题.软件上有没有什么特殊处理吗?比如说发送失败,总线错误如何处理?系统已经调试了相当长一段时间了,但还是没有头绪.就这个问题解决不了,我们在线路中加了 CanRepA和 CAN_REPB均不能很好的解决!同样的线路和硬件,ZLG公司的系统可以通信很好,而我们的系统却不呢,是不是软件处理有些要求?请大家指点!答:检查各节点 CANH和 CANL之间的阻值是否在合
10、理范围之内;CAN 网络通讯故障一般是通讯电缆选择不合适。请专家帮估计 ARM CPU 的 CAN口处理能力! 在不处理复杂协议的情况下,一个 CAN口吞吐达最高负荷 5000帧/秒时,CPU 的负荷是多少?多个 CAN口呢(如 LPC2294)答:即使用于严格的速度测试,LPC2000 的速度完全能够胜任 2-4个 CAN通道。sja1000出现错误而中断的几率由多大呢? 特别是发送错误,总线关闭等。答:注意 CAN-bus是一个网络,调试网络时需要在另一端连接一个正常工作的CAN节点。CAN是可靠的网络;测试过 2-5个 CAN节点连续近距离持续发送/接收超过 100小时而不出现通讯错误。
11、 为什么 MiniCAN总提示发送失败? 我在使用 MiniCAN在自发自收模式下进行循环发送数据时,会经常提示发送失败,但是却已经接收到了数据。这是什么原因?怎样能避免呢?答:是不是总线上连接有其他 CAN节点?检查一下对方的速率。 硬同步在 CAN控制器中是如何实现的?答:可以看一下 CAN2.0规范;如是 IC设计,则去 BOSCH看看复杂的 CAN IP。请教 zlg的大虾们,我应用 89c51+sja1000+82c250的结构,运行过程中发现一个问题,即正常运行一段时间后,sja1000 死机(个人认为是死机),我的89c51仍然在正常运行,也对 sja1000能启动发送数据进程(
12、我用 led指示),但是接收端没有收到,用示波器测量 82c250的 CANH 或 CANL 脚(6,7 管脚),看不到有波形,断电重新启动程序后,sja1000 的收发过程中能在上述两个管脚中测量到波形,即上电运行能正常一段时间的收发(能测量到波形),之后就不行了(启动发送过程但是波形测量不到了),除非断电重启,望指教!头两天查找 sja1000的问题,以为是死机,后来逐步检测跟踪察看,发现程序运行一段时间后,sja1000 的设置被无端改变,比如波特率,输出控制方式,测试寄存器值,我的原始设置为:BTR0 = 0x00;BTR1 = 0x4F;OCR = 0x1A;REG_TEST = 0
13、xAA;但在运行一段时间后,这四个值会莫名其妙的被改变了,导致无法接受总线得数据,而改变的值是随机的,请问这是怎么回事?硬件电路是按照推荐的典型应用接的,我在程序中除初始化设置这几个参数外没有其他地方对他们进行操作,天理何在啊答:复位端是否可能引入尖峰脉冲? 刚开始接触 canbus,买了一块 5121,用随机带的 zlgtest的软件测试,验证码设为 0x00000001,屏蔽码设为 0xffffff00,这样的话是不是只能接受 id为 0x01的帧了,用随机带的 zlgtest的自发自收的发现 id为 0x00和 0x10等等也能接收到了,请问是我的验证码屏蔽码设置错了么?答:CAN 节点
14、的验收过滤设置与 CAN帧的 ID不是一一对应关系,具体请参考MANUAL目录下的函数编程手册或CAN 控制器 SJA1000验收滤波器原理与应用。谁能告诉我 canbus的优势?CAN vs 485答:CAN 和 RS485不是一个层次的, CAN 的速率和传输距离不是 RS485可比的。CAN-bus是技术开放的且最具成本优势的现场总线。现场总线的优势.大家都清楚吧? RS-485标准,提供了多点(32 点,在增加驱动电阻的情况下可以连接 128节点)、双向通信的能力,RS485 只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,因此用户可以建立自己的高层通信协议。RS-485最大传
15、输距离约为 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模式寄存器的地址为 OXC0
16、00,请问用什么样的命令来读写,然后判断该寄存器可以被正常读写。答:可以通过写入并验证 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控制器的 PeliC
17、AN模块源代码中均有测试 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_T
18、EST,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,遇到了一个问题,希望那一为大虾能给予帮助,在此先谢了
19、问题是这样的:如果一个 SJA1000的节点(节点)接收到了一个远程帧,节点怎样知道,这一远程帧是那一个节点发来的?如果节点要给该节点以应答,识别码应该怎样写?答:需要有应用层协议才能区分网络的源节点、目的节点。求教大侠,用 ADuC812开发 CAN的时候,直接把 89C51测试是正确的 CAN发送程序(在程序开头加$MOD812)移植到 ADuC812中去,把程序下载进去之后,运行正常(能不停的向 ZLGCAN卡发送数据);但是重新上电后,不工作了(没有数据上来);可是另外编了一个串口发送程序下载进去之后运行正常,重新上电也正常。我是想把 ADuC812当 89C51用(主要是想用它的 A
20、D)是不是除在程序开头加$MOD812 外,还需要其它的设置?如果是,怎样设置?谢谢!答:硬同步。CAN 控制器中如何执行硬同步?我板子上的 sja1000+82c250,初始化,把发送的数据帧发到发送缓冲器都还可以,但是一设置命令寄存器的自接收命令和中止发送命令后,就在状态寄存器里的是:出错状态,发送缓冲器状态,然后 TX错误计算超出 127,ECC里的是 03,位错,帧起始错检查了好久也不行请帮帮菜鸟的我吧.55答:搜索论坛上过去的帖子,自收发需要满足几个条件。如何用串口发送连续的 13位低电平和一位高电平就大部分的 UART来看,都是 8位,8 位发的。要发送连续的 13个 0和 1个
21、1,请问如何实现。接收时又如何接收?答:前面有回复:变化波特率以适应硬件。DP-51H 实验仪的一个功能:扩展LIN-bus接口,提供完整的“LIN-bus 规范、应用范例及其软件包”,实现 LIN-bus的通讯实验;两个通信完好的两个节点,如果节点 CAN1发送了一帧数据,而这帧数据里的标志符不是另一节点 CAN2的标志符,当发送以后,在应答间隙内,CAN2 是否会发送一个显性位作为回应呢?书上说“当接收器正确地接收到有效的报文,就会在应答间隙发出一显性位”,这里的正确接收是何概念呢?是完全满足验收滤波条件存入接收 FIFO吗?答:在数据链路层检查正确,不需要经过验收过滤,就硬件回应。初次作
22、 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
23、使用的是 MCP2510,这两个控制器的标识码寄存器位定义不同,我先前没有注意到,所以报文无法正确的被接收!还是很感谢黄老师:)请问,它的两个输出端分别接个 5欧电阻,并且挂 30P电容接地应该可以起到滤波的作用吧,如果节点太多会使电平保持的时间太小吗?(就是变成三角波了)答:节点数目在大于 3050时可以考虑不用 PCA82C250滤波电容和电阻。我在实验室调试两个 CAN节点的通信,终端匹配电阻均为 124(电位器,用万表测试),SJA100082C250,加斜率电阻。速率 800K,在斜率电阻一个为9.6K,另一个为 6.8K(也是电位器)的情况下可以通信,通信距离 35米(普通网线),
24、斜率电阻再大就不能保证了。另外在连接时必须是一个节点的 CANH 接另一个节点的 CANL。按书上的接线示意图将 CANH 共同接在同一根总线上,CANL 共同接另一根总线上就不通,为什么?答:这个方法是错误的,供参考的正确电路连接图可以从 CAN-bus页面的应用方案中下载获取。自己开发了一个 CAN节点,要与 PLC通过 CAN通讯,由于一个网上所有 CAN节点 BTR0、BTR1 的参数应一致,PLC 各波特率的 BTR0、BTR1 参数不知,那么我自己开发的 CAN节点这两个参数如何定? 答:编写个自动检测波特率程序;PLC 一般也可设定。 问:SJA1000 的双相输出方式具体该如何
25、应用,如果不接 PCA250,怎么接到总线上?答: 还是要接 PCA82C250芯片。问:关于 CAN总线供电的请教: 如果用电源耦合能否实现 CAN的总线供电?答:建议用标准双绞线方式;走的人多了,不需要自己研究。问:光靠标准双绞线怎么能实现总线供电呢?答:总线供电另外采用独立的电缆,如 DeviceNet 规范;这是国际推荐的标准方式。问:请问 CAN总线两节点间要通信的话,他们的波特率是不是要完全一致?答:节点有重同步的功能,允许偏差在一定范围内,比如晶振偏差,见 SJA1000的位定时文档。问:请问验收滤波器可不可以屏蔽某些位,就是说不管某些位是什么,只关心其中几位。答:当然可以啊。问
26、:我现在调试通过 CAN通讯的数据采集板,上位机买的是的 PCI_CAN9810卡,用 CANalyst分析仪调试自己开发的 CAN采集板,我现在调试 CAN,还没有调试通,CAN 的 CS接 CPU(P89V51RD)的 P2.7(28 脚),CAN 地址是 7fff,应该没错吗?程序如下(用伟福仿真器仿真):# include# include# include# define uchar unsigned charvoid InitCpu(void);void InitT0(void);void Sja1000Init(void);bit SecFlag;/uchar data a5;u
27、char data SendData10,RcvData10;uchar DataBuf,SecData,Second;uchar data TmodData;uchar bdata FlagInit;sbit RcvFlag=FlagInit0;sbit ErrFlag=FlagInit2;void main(void)/int i;/for(i=0;i 问:在使用周的底层驱动时出了点问题,不知是什么原因 用 LPC2119中断方式做了一个转发器件,中断很正常,中断程序调用写环形环形缓冲区;主程序是读环形缓冲区,但是读时发生了数据中止,不解,就是下面第二句出了问题stcRxBUF *RxBu
28、f;*RxBuf = CANRcvBufApp.RcvBufCAN1CANRcvBufApp.ReadPoint1;答:网站资料已更新;查询方式会比较方便。问:过载帧与错误帧是怎么使用的啊对数据帧,和远程帧很好理解,也很好使用,但是对过载和错误就不知道在什么地方用了,也不知道该怎么用了啊?请各位指点答:CAN 控制器自己管理问:错误消极中断和错误警报中断该怎么处理呢?只是简单的复位么?这两种错误有什么区别呢?不太明白答:按流程可以不处理,参考网站示例。问:仲裁丢失该怎么理解呢?仲裁丢失算不算是一种错误呢?仲裁丢失一般的处理是怎么样的呢?只是读取仲裁丢失捕捉寄存器么?答:不算,仅仅提供一个网络参
29、考信息,例如网络负载/id 分配是否合理等。问:为什么在分析仪发出第三侦后,2119 才产生接收中断,而且收到的是第一侦的数据,WritePoint2 = 1。如果分析仪只发出一侦数据,不能产生中断,怎么回事?答:第三帧才产生中断可能是溢出中断,因为接收中断和溢出中断的额中断号是不同的,菲利普的早期资料中 CAN的中断号有错,请下载最新资料!答:我试过中断模式,没问题,可以产生中断,可是周的低层驱动关于环形缓冲区那部分可能有些问题。中断后调用写数据缓冲区,然后在主程序里循环读环形缓冲区。忘了是在哪里会出现数据中止,按说是不应该出现的。问:请教 RTR位在滤波中的作用?请教各位老师:滤波器中的
30、rtr位参不参与滤波,我在实验中有两个节点,采用双滤波标准帧通信,我设置接收方的 acr0,acr1,acr2,acr3 寄存器为00,00,00,amr0,amr1,amr2,amr3 分别是 00,0f,00,ff.发送方 ID1,ID2为 00,20;但是发送方的,只要是 20和 30,该帧数据都能接收,其它的如 40,50,都不行,我不知道为什么?是不是 rtr位不参与滤波,发送方在发送的时间不必要考虑此位。郁闷的不行,恳请帮助!答:就把它看作像 id那样的一个 bit看待吧。问:SJ1000T 中基本模式下只能检测 8位的 ID,但发送时确有 11位 ID,请问ID2-0有什么用?答
31、:你指的是 BasicCAN模式下的“验收过滤“;其实,两种模式的所有 11位或29位都有效。问:BasicCAN 模式下的“验收过滤“只能过滤 ID103,请问 ID20 对接受有影响吗?资料显示并没有对 ID20 进行核对。答:BasicCAN 模式没有对 ID20 进行核对。问:请问在双绞线上传输的 CAN信号波形应该是怎么样的?信号的幅值和频率?另外,能否推荐使用在车辆上的电缆型号以及节点与总线相接的接插件型号!谢谢!答:汽车类型不同,应用有所不同,建议参考 SAE J1939协议内容中的规定,制定自己的规范。问:有没有 CAN控制器+单片机(不包括 CAN驱动器),成本不超过 15元
32、的方案?可付报酬!答:目前我们没有能力实现。答:io 模拟低速 can。问:请问 CAN总线是不是不能提供总线供电?如果希望总线供电该如何做?谁能提供一点关于 CAN能总线供电的资料啊?答:CAN 或 DeviceNet 都可以总线供电,根据需要选择适合的应用。CAN 没有规定物理层.是一种相当灵活的现场总线。DeviceNet、CANopen 均是基于 CAN-bus协议,自定协议也不难。问:请问远程帧的作用是什么?在什么情况下需要使用它?答:那是一种可用可不用的帧资源.问:基地址选了 0xda00,偏移量选择 0000后,sja1000 得寄存器的地址是从0xda000开始吗?答:对的。问
33、:在每次只收到一帧的情况下,我置位清除接受缓存都没问题,但是一旦在短时间内接收到 2帧或以上时(短时间指,第一帧还未完全被微控制器接收而第二帧已经到来)我收完一帧,置位清缓就会出错。然后我复位继续接收下一帧微控制器就不能从 sja1000接收了,为什么会这样那?置位清缓不是只清掉第一帧数据么?如果只清第一帧数据的话,应该第二帧可以收到的啊?这是怎么回事那?要怎么解决那?谢谢了。答:不会这样的,查查其他原因。 问:请教版主 CAN总线用于爆炸性气体环境可以吗? 在网上搜索了一下,看到的 是几年前发表的 文章说 CAN总线没有解决防爆问题,不知现在有没解决在爆炸性气体环境使用 CAN总线通信。如果
34、没有那只好用以前的 485 了 改成 hart还是更麻烦答:在现场总线控制系统的调试与开发-国防工业出版社的技术书籍第 8页,列出了 CAN-bus是本安的总线之一。问:请问 Can232和 can232B转换器的通讯协议是否必须和计算机相连才能更改我想用转换器直接与 PLC相连不知如何设置通讯协议。答:看应用场合而定,可以不用设置协议。这一份文档中有很好的说明!问:关于节点发送的问题向你请教。发现经常我的硬件复位有时不是成功的,导致发送不成功。读状态寄存器SR0x04,或 0x44;请问这种情况是怎么回事?答:“硬件复位有时不是成功的”不容易理解;建议看一下前面的贴,或网站的参考程序。问:那
35、请问:硬件复位后,我发送前读状态寄存器 SR0x04,也就是“当前请求的发送未处理完”,这种情况下发送时不能成功的。有时候硬件复位后发送前读状态寄存器 SR0x0c,这种情况下发送时可以的。请教:为什么硬件复位后还会出现像前面的那种状态寄存器 SR0x04,也就是“当前请求的发送未处理完”的情况,应该如何处理?答:硬件复位成功后 SR= 0X0C ;否则就是硬件方面存在问题。建议用网站公开的电路与程序,或者直接在 DP系列实验仪上测试。问题 1:在通讯时出现错误,用软件复位能否将错误清除?问题 2:软件复位是否将以前设置的参数改为默认值?是否需要重新初始化?答:1.可以;2 否,是 问:为什么
36、我在复位模式下 CDR寄存器写不进那?其他寄存器都可以写进去,就是 CDR写不进去。不明白为什么,和其他寄存器一样的写法,语句,但是无论写什么进去,读出来都是 00H。可以帮忙解答以下么?谢了注:无论读写都是在复位模式下答:芯片 SJA1000的硬件复位会使 CDR=0x00。求助,为何我写不了 CAN地址大于 8的寄存器?SJA1000的基地址是 BF00H,我对 SJA1000的寄存器在复位模式下进行写,写完读出(当然是对于可读写的)发现对于 CAN地址大于 8的写入一定的数之后再读出,读出的数大部分是 FF,而不是我写如的数,哪位大侠可以提供帮助?谢谢。在 PELICAN模式下。答:你在
37、 basic模式下试一下。答:也可能是硬件接线问题。问:SAE J1939 的中文资料在哪里找?答:一般不会有中文资料,看网站应用方案-通讯篇。 请问版主及各位大虾:汽车 CAN节点与工控 CAN节点的?区别在什么地方答:通讯距离、应用层协议不同,电路稍有不同,参考网站资料。 问:我现在正在做与 CAN总线相关的课题,买了 CANstarter-I 开发套件,现在差不多快看完了。不过现在有一个问题,就是各位在自己做实验时硬件是怎么做的,是自己搭手工焊接的电路板,还是用 Protel制作 PCB图后印刷出电路板来?Protel 我以前从未学过,要按电路图去自己做 PCB的话周期太长,可自己焊又不
38、能保证电路板的稳定性?答:配套光盘中有 PROTEL格式的 CAN节点原理图,PCB 可以参考实验仪。问:我用中断接受 can总线发来的数据,可是单片机怎么也进入不了外部中断程序?为什么?8051中关于外部中断 0的设置我都设置了,可就是进入不了 isr,如果我采用查询接受,int/端的电平就显示正常(低到高),一采用中断,int/端的电平就被拉低不会变高,我在 isr中设置了点灯测试,当有数据时因为灯没亮,所以我判断是进入不了 isr,各位老师看看这是为什么呢?答:设置电平触发,确保 mcu相应中断的其他设置正确。问:再用 USBCANI 时,ZLGCANTest 为什么不能设置波特率?那时
39、钟频率是多少啊?说明书上也没有说明啊 ?答:打开设备时定时器 0、定时器 1就是用于设置波特率的。详细请看相关的用户手册。16MHz,在编程接口文档中应该也有说明。问:关于 SJA1000的错误处理! 在 SJA1000的资料上可以看到,它有一个错误代码捕捉寄存器(ECC),通过查询这个寄存器我们可以知道总线错误的类型和位置信息。但在实际的应用中,我们好像对这方面 CAN总线错误处理的功能用的很少,可能有时也没考虑。一方面 CAN总线的错误很少发生,另一方面我们缺少这方面总线发生错误的的实际例子,在实际的总线应用过程中,CAN 总线的错误是应该也必须考虑的,因为这直接影响 CAN网通讯的质量和
40、可靠性。我希望各位同行能在这方面提出自己的看法。答:精华区有相关的讨论贴。问:正常模式下发送,给命令寄存器赋值 0X03,由于没有另一点的响应,这一点会一直发送(在示波器的波形可以看出),我现在问题是,这一点在重新软件复位后,就不能发送了,读状态寄存器 ,显示最后一次发送未被处理成功,假如关闭电源硬件复位重新开始又可以发送了。请教大家可以取消 CAN节点的发送命令吗?用软件怎样实现?答: 请问你所指的软件复位是什么?是进入复位模式吗?如果是的话当然不行。答:我说的软件复位是指使仿真器重新编译,程序从头运行。就是 MCU给 SJA1000复位模式初始化后退出复位模式,进入工作模式后再发送 .问:
41、大家好,我最近刚开始用 can总线设计一个项目,目前遇到一个很大的困惑,就是在设计 can智能节点时(WEE758+SJA1000+TJA1000),两者的接口通讯都有问题,初始化好像过了,但用 ZLGTEST软件调试,不能正常收发数据,我查了硬件电路,没有问题,我郁闷死了,请问大家该从哪方面下手去找原因啊,我用的电路是 CANSTART-I用户指南里面的那个程序,不知道有没有问题。请有经验的人帮帮忙啊,我的时间太紧了。答:先测试你的硬件 物理连接是否通过,可以先给 SJA1000写一个值如 0xAA,再访问 SJA1000读出来看是否是 0小 AA?答:“不能正常收发数据,我查了硬件电路,没
42、有问题.“,这不自相矛盾了吗?1,把所 sja1000当作xdata ram测试看看是否总线连接正常,sja 受控?2,发送时看看总线是否出现差分信号?物理连接是否正常?这就基本把硬件问题定位了。问:请帮忙看一下程序,谢谢! SJA1000 中地址 16 写入 0x88地址 17 写入 0x04地址18 写入 0x03地址 19 写入 0x02地址 19 写入 0x01使用 ZLGCANTEST软件得到的 ID应该是多少?怎样计算?我得出的是 0x00806020,好象是右移了五位?是否正确啊?答:工作在 PeliCAN模块的话,参照产品手册附录 2可以获得在总线上的 ID值。问:输出控制寄存
43、器的 OCMODE1和 OCMODE0可以设置为四种方式,双相、测试、正常和时钟输出,一般应该选择哪一种输出比较好,通讯可靠性高。答:常用 pushpull 模式,这比较通用,适应性较好。问:在用ZLGCANTest 1.4 版在调试程序时,下位机发送标准数据帧,USBCAN-II 智能卡收此信息下位机的号为:x00000035,如果将 ZLGCANTest的打开设备对话框中的验收码设为x00000035,屏蔽码设为x00000000,为什么不能收到信息如何在 ZLGCANTest中设置验收滤波器?(发送节点为x00000035,发送标准数据帧,接收端为 USBCAN-II智能卡)答:验收过滤
44、设置为 4个寄存器,但需要根据接收帧格式进行设置,而不是简单地对应关系。请参考提供的CAN 控制 SJA1000验收滤波器原理与应用.pdf资料。问:不好意思,因为我在调试中,下发的报文没有反应,但是能收到下位机送上来的信息,我问了我们开发装置的同事,他说可能跟 ID有关,所以我想再确认一下:frameinfo.ID = (DWORD)(Send_Groupi.Buffer0 Items-Add(“发送成功“); else ListBox1-Items-Add(“发送失败“);答:检查一下你所谓的上位机的验收滤波寄存器的设置回复:通讯成功了,谢谢各位,错误原因是我的程序中有个 BUG。问:用
45、2119做了一个CAN中继器,单向发两边都很正常,1M 无延时的发送都可以应付,可是双向发发几百帧就堵塞,很奇怪,是处理能力不够还是怎么回事?我用的是查询,主循环里查询 CAN1、CAN2 控制器的接收状态位,置位就转发。感觉已经不能再精简了,请大家帮忙诊断一下,谢谢!答;采用中断接收并压入缓冲区,主程序查询发送 OK,堵塞绝对不是芯片性能引起的,除非另一方设备接收存在问题。问:关于 SJA1000的读写时序 我看 sja1000的数据手册上是:先是 ALE锁存信号有效对地址进行锁存,然后才是/CS 片选信号有效(此时读写信号,数据也有效),我得疑问是/CS 信号在整个 CAN通信期间不是一直
46、有效吗?在地址锁存时必须是无效的吗?在 CAN使用期间我如果让/CS 一直为低可以吗?请知道的大侠不吝指教啊!答:若不需要考虑其他地址冲突和功耗因素的可以这样。 问:请教:CAN 总线收发器 PCA82C250的斜率电阻 Rs的选择问题。 是用 47k的吗?还是 4.7k啊?哪位仁兄告诉一下,谢谢!答:如果你没有什么特殊的要求,直接接地就行了答:47k 的。问:各位大侠,我想用双滤波进行通讯,我想请教一下,另一个节点是不是也必须是双滤波格式才能进行通讯?我在通讯中设置的其中一个节点的0,ACR1,ACR2,分别是 00,00,02,选择的是标准帧格式;另一个节点的发送标识 1,标识 2分别是
47、00,0 ,为什么也能够通讯呢,按照滤波器工作原理来说,只要一个滤波器通过验收就能通讯,可是上面00,0并没有通过滤波器呀!我糊涂了,请教各位大侠,非常的感谢!答:友情提醒朋友,资料很多在网站上已发表,查找一下即可。见CAN 控制器SJA1000验收滤波器原理与应用。 问:标识符确定? 假设网络中有 A、B 两个节点。A 请求 B发送数据,则 A发送远程帧(B 标识符+RTR)。B 点接收到该帧后,如何判断这是谁发来的请求帧?若是 A点,则 B点发送数据帧(A 标识符+RTR+数据长度+数据)。关键的问题是,在多个节点组成的系统中,各节点之间如何管理?相互之间如何识别和握手?答:应用层协议的建
48、立,请参考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 模式,波特率相同,发送端发出一
49、帧(扩展帧)后,SR 由 0C变成 60(表示:正在发送且出错),ECC变成 D9(表示:发送时应答时间段填充错),why? 是因为另一个节点未发出应答么?应答应由硬件自动完成吧?那时因为什么呢?(波特率100kbps,BTR0=41H,BTR1=B9H)答:应答有硬件自动完成。问:我现在没有 CAN的接收器,就简单的把 CAN的两个输入、输出连起来,发现输出有信号,输入没信号,不知这样可不可以?有没有更好的办法来检验我设计的电路?答:将CAN控制器的 TDx与 RDx连接可以进行测试,具体参考相关的 CAN控制器手册。本人不提倡这种方法,因为没有实际应用价值。询问 sja1000在 16mhz晶振下波特率问题 我看了 sja1000的总线定时寄存器 BTR0和 BTR1的设置问题,我看了多个资料上的数据,感觉不太统一,发贴确认一下,16MHZ 情况下是这