CAN总线学习:zlg关于can帖子汇总

很值得看看

zlg关于can帖子汇总

 

SJA1000的常用标准波特率设置,为什么基本上都是单次采样?即使是低速的时候也是这样的,既然TSEG1的设置周期都很大,比如都大于10了,为什么不让他采样三次呢?
答: 是不好理解,但那是CiA推荐的值。

用51系列芯片和两个SJA1000接口还要外扩一个RAM,请问51的ALE能否同时与三个芯片的ALE管脚相连(地址不同)? 有哪位高手做过双SJA1000冗余的请指教!!!! 
答: 能同时连接。 

请问CAN总线在想传输1000m的情况下,最快的速度能到多少呢? 
答: 50kbps = 1300m。

如果一个网络中只有2个节点,其中一个处于监听模式,另一个节点发送报文会使处于监听模式的节点进入中断吗? 
答: 能进入接收中断,你自己的试验也可以证明。

想组建一个简单的CAN网络,已经有两个节点,我想问CAN总线如何组建,终端电阻安装在哪里?小弟还没有入门,大虾们指点一下。
答1:直接将节点CANH和CANL连到总线上,终端电阻接在总线两端,大约120欧。
答2: 推荐北航出版《现场总线CAN原理与应用技术》,研读一下。

请问各位老师:我是一名can总线的新手,我正在做can总线的开发,控制器用sja1000t(我自己两个控制板互通),但我在发送数据后将出现总线关闭,我看到发送错误计数器在不断增加,直到0xff,最后恢复到0x7f,谢谢各位老师帮我解答这个问题。或者对我给与启发
答1;首先调通单个节点。
答2:这是单节点发送没有成功(或者由于网络中其他节点没有收到帧并在响应场响应);建议参考网站CAN应用方案。

我想请教各位can远程贞有何作用?如何应用?在什么情况下才需要用到远程贞?谢谢了!
答:远程幀的用与不用完全取决你自己的协议,can有远程幀的功能,是可用可不用的!

用网站提供的计算波特率的工具算出的数,12k以上的都正确,无论是自接收还是两个节点通讯都没有任何问题。但是12k以下的数据一个都不能用,两个节点通讯没有成功的,自接收有10k的几个数据成功。我们的项目要求必须在10k以下,最好是5k,但是不成功,自己计算的数据也没有成功的。(我们至少试验了30多个,所有情况都考虑了。)
我现在怀疑sja1000的波特率根本达不到5k和相对应的传输10km。
或者可以谁能提供个经过实践检验的正确的总线定时器0和1的设置呢?要求低于10k。
答:PCA82C250/251可以保证5KBPS的速率;比如ZLGCAN系列接口卡。
答:tja1050在低速时好像有问题。我用1050进行5k的时候不行,用82c250很好,你可以试一试。

我本想双机调试,一边收,一边发,但跑程序后,发送方会不断进入复位模式,所以现在进行自测试模式,我先进入复位模式,设置进入PELICAN模式,对寄存器初始化后,设置接收,发送中断使能,最后设置进入自接收,单滤波模式,这样初始化就结束了,我的ACR0~ACR3 为0x55,0x55,0x55,0x50,AMR0~AMR3为0xff,之后,我就往BUFFER里填数,0x88,0x55,0x55,0x55,0x50,0x30,0x31,…..0x37,之后,启动自接收请求命令,但是程序只进入了中断一次,是发送空中断,接收中断没有产生,我读发送错误寄存器,发现有错误产生,我读接收计数寄存器,为0,说明我没有收到数,但我读接收BUFFER时,值为0x55,0x55,0x55,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,
以上测试时,我在CANH和CANL之间加入了两个120欧的匹配电阻并联在一起的,请各位高手指点呀,谢谢了
答:在总线上加个CAN接口卡会方便许多,或者加个捕获功能的示波器也可以检测波形。

仿真环境:keil uv2
编译器:keil c51 7.0
仿真器:tks-591s
cpu:p87c591
程序大小:8K左右
兄弟在一片CPU中烧写了一个,运行一个CAN总线,IIC总线测试程序能够正常运行。这个基础上加上应用程序后在仿真机中运行正常,但是烧写到cpu后插入cpu程序不能运行,请问是什么原因?
另外一个问题:
在另外一个项目中条件相同,程序只有4K,程序正常跑着,CAN接口可以检测到输出波形但是却不能正确传输数据,在一块旧板子上就可以,比较两者之后发现电路完全相同测量也正常,只是布局不同,请教原因。
答:程序已运行了吧?可能是HEX文件有错;编制程序时注意P87C591的ERAM设置、6CLK设置。

位流数据采样自发送节点的82c250的Tx管脚。
测试条件:pelican ,扩展,双滤波模式,对方ID:0x88,0x11,0x55,0x10,发送的对方ID为:0x88,0x11,0x00,0x00,发送2字节数据为:0x05,0x06
采集的位流数据如下:
01000100000101110001000001000001000001000100000110000010001101100001001110111111111111
请教位流数据的含义?
答:自行计算时要区分位,还需要进行“位填充”的逆运行;简单的方法是将此信号连接至1个CAN接口卡的RXD引脚。

用ZLGCANTEST软件调试和板卡通讯,但是板卡能够正常通讯几次后就不再上传数据,查看SJA1K的状态寄存器,发现是SJA1K正在发送,但是怎么老是出现这种问题啊,请有相同经历的高手教小弟一把啊!谢谢了!!!!
答:其中的一个原因是收不到接受应答,比如对方id错误
 
通讯实验:长度1km,同样的线路,得用ZLG公司的CAN设备(9820,5121)通讯是正常的,但是我们自已的系统,在1000米时(50K波特率)的通讯是完全正常的,但是再上加一段线路(约70米,与1公里电缆是不同线质,螺旋状),数据丢失严重.我们的硬件是完全提供的参考电路的,所以说硬件上应当没有问题.软件上有没有什么特殊处理吗?比如说发送失败,总线错误如何处理???
系统已经调试了相当长一段时间了,但还是没有头绪.就这个问题解决不了,我们在线路中加了CanRepA和CAN_REPB均不能很好的解决!!!同样的线路和硬件,ZLG公司的系统可以通信很好,而我们的系统却不呢,是不是软件处理有些要求??请大家指点!
答:检查各节点CANH和CANL之间的阻值是否在合理范围之内;CAN网络通讯故障一般是通讯电缆选择不合适。

请专家帮估计ARM CPU 的CAN口处理能力! 
在不处理复杂协议的情况下,一个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验收滤波器原理与应用》。

谁能告诉我canbus的优势?CAN vs 485
答: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)ADuC812ZLGCANADuC81289C51AD MOD812外,还需要其它的设置?如果是,怎样设置?谢谢!
答:硬同步。CAN控制器中如何执行硬同步?

我板子上的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一般也可设定。 

问:SJA1000的双相输出方式具体该如何应用,如果不接PCA250,怎么接到总线上?
答: 还是要接PCA82C250芯片。

问:关于CAN总线供电的请教: 如果用电源耦合能否实现CAN的总线供电?
答:建议用标准双绞线方式;走的人多了,不需要自己研究。

问:光靠标准双绞线怎么能实现总线供电呢?
答:总线供电另外采用独立的电缆,如 DeviceNet 规范;这是国际推荐的标准方式。

问:请问CAN总线两节点间要通信的话,他们的波特率是不是要完全一致?
答:节点有重同步的功能,允许偏差在一定范围内,比如晶振偏差,见SJA1000的位定时文档。

问:请问验收滤波器可不可以屏蔽某些位,就是说不管某些位是什么,只关心其中几位。
答:当然可以啊。


问:我现在调试通过CAN通讯的数据采集板,上位机买的是的PCI_CAN9810卡,用CANalyst分析仪调试自己开发的CAN采集板,我现在调试CAN,还没有调试通,CAN的CS接CPU(P89V51RD)的P2.7(28脚),CAN地址是7fff,应该没错吗?程序如下(用伟福仿真器仿真):
# include<AT89X51.H>
# include<SJA_BCANCONF.H>
# include<SJA_BCANFUNC.C>

# define    uchar    unsigned char

void    InitCpu(void);
void    InitT0(void);
void    Sja1000Init(void);

bit    SecFlag;
//uchar    data    a[5];
uchar    data    SendData[10],RcvData[10];
uchar    DataBuf,SecData,Second;
uchar    data    TmodData;
uchar    bdata    FlagInit;
sbit    RcvFlag=FlagInit^0;
sbit    ErrFlag=FlagInit^2;

void    main(void)
{
    //int    i;
    //for(i=0;i<100;i++)
    //P1_4=1;
    Sja1000Init();
    InitT0();
    InitCpu();
//    flaginit();
    while(1)
    {
        if(RcvFlag)
        {
            RcvFlag=0;
            BCAN_DATA_RECEIVE(RcvData);
            BCAN_CMD_PRG(0x04);    //release buffer
        }
        if(SecFlag)
        {
            SecFlag=0;
            SendData[0]=0xaa;   //send canid
            SendData[1]=0x08;   //send longth
            SendData[2]=Second;  //send data
            BCAN_DATA_WRITE(SendData);
            BCAN_CMD_PRG(0x01);
        }
        if(ErrFlag)
        {
            ErrFlag=0;
            Sja1000Init();
        }
    }
}

void    Ex0Int(void) interrupt 0 using 1
{
    SJA_BCANAdr=REG_INTERRUPT;
    FlagInit=*SJA_BCANAdr;
}

void    T0Init(void)    interrupt 1 using 2
{
    TR0=0;
    SecData–;
    if(SecData==0)
    {
        SecData=0x10;
        TH0=0x80;
        TL0=0x60;
        SecFlag=1;
        Second++;
    }
    TR0=1;
}

void    InitCpu(void)
{
    PX0=1;
    IT0=1;
    EX0=1;
    ET0=1;
    EA=1;
    SecData=0x10;
}

void    InitT0(void)
{
    TmodData =TMOD;
    TmodData &=0xf0;
    TmodData │=0x01;
    TMOD =TmodData;
    TH0 =0x80;
    TL0 =0x60;
    TR0 =1;
    SecData=0x20;
    Second=0x00;
}

void    Sja1000Init(void)
{
    BCAN_ENTER_RETMODEL();
    BCAN_SET_BANDRATE(0x04); //100k
    BCAN_SET_OBJECT(0xaa,0xff);
    BCAN_SET_OUTCLK(0xaa,0x48);
    BCAN_QUIT_RETMODEL();
    SJA_BCANAdr =REG_CONTROL;
    *SJA_BCANAdr │= 0x0a;    //
}
现在用示波器测CAN_H和CAN_L,没有信号,请问是什么问题?

注:这个参考一下吧,呵呵


问: 请教各位大虾:有没有CAN局部测试程或意见?急需!!谢谢!!!
有没有人能给他的自测程序给我看看?帮帮我呀!
答:网上有basicCAN例程,CANstarter-I 工具中有PeliCAN例程。


问:我贴一下关于CAN验收滤波器的程序:哪里不对,请指教。多谢多谢了。
BPS_307K   EQU   0x00F88001  ;波特率307K
AF_RAM     EQU   0xE0038000  ;验收滤波器RAM起始地址

           LDR  R0, =CANAFMR
           MOV  R1, #0x02
           STR  R1, [R0]
           
           LDR  R0, =AF_RAM
           LDR  R1, =0x25522553
           STR  R1, [R0]
//我在上面设置了一个25522553,CAN控制1口,只接收标识符为552,553的帧,我不知道这样设置对吗?这算设置了一个表格吗?

           LDR  R0, =CANAFMR
           MOV  R1, #0x00
           STR  R1, [R0]

//这样算是启动了吧?我没有设置CANSFF_sa滤波器,可以不设置吗?如果需要设置,照我现在的情况,这个滤波器中应该填什么值呢?
//在以上设置好以后,所有的总线数据都不响应了,急死我了,我看了网上的pdf文档,不过还是没什么启发。希望高手能解答我的疑惑。谢谢了

答:参考或直接使用CANstarter-II开发套件中提供的资源。


问:请问各位高手,作为一个初学者应该如何学习CAN总线技术?应该先学习哪一些基本知识,请推荐妨相关书籍一二。谢谢!
答:现场总线CAN原理与应用技术
作者:饶运涛 邹继军 郑勇芸
出版社:北京航空航天大学出版社

问:又没有带CAN控制器的可在线编程的8位单片机呢,麻烦推荐一款吧 
答:ATMEL AT89C51CC0X 系列不错!
答:intel的89C591,89C592都是片内带can的8位单片机。

问:本来应用了CAN232,但是想提高系统的速度,想用PCI-CAN,做USB-CAN,但是想借此学习PCI,或USB,ZLG这里能想CAN232一样,如果买了板子,提供代码,原理图吗?如果没有哪种开发板有呢,能推荐一下吗?
答:系统而理论地学习CAN,建议选择CANstarter-I/II开发套件;应用的话,USBCAN、PCICAN都是非常可靠的产品。

问:请问,在SJA1000软件设计中,把发送信息送入发送缓冲区,启动发送后,为何总是会自动进入复位模式?请哪位大侠帮忙指教一番.
问:再问一下,之后我重新换了线路板和芯片,复位问题没有了,但启动发送后检测状态位,发现发送状态一直为(始终发送未完成)。需要说明一点,目前我只用了一块线路板加一个仿真器进行发送调试,并没有接上接收的线路板,请问单发行否?请大侠帮忙指点以上问题!谢谢!
答: 一个节点可以工作在自测试模式,在这个模式下的工作机制跟两点是一样的,然后启动自接收命令即可。
答: 单发送不可, 正常发送时需要网络上同一速率的工作节点响应. 

问:第一,接收信息的工作节点需要什么响应来确认?第二,接收的子程序未调好是否意味收发两方均无法调试?如何确认发送成功?
答:网络上同一速率的正常工作节点响应:1、已设定速率;2、在工作状态。完全是由硬件(比如:SJA1000芯片)完成ACK确认。

问:请问单个can 节点可以进行调试吗?是一块一路的can适配卡,使用端口地值300h,我使用winio进行读写的,可为什么,所有的单元读出来得数据都是ff?是因为只使用了单个节点can控制器不能正常工作吗?
答:sja可实现单节点调试;ff应该是地址空间错误;
问:我还是不太明白,你说的地址空间错误,是说sja1000的地址没有选通,地址没有指向sja1000的寄存器吗?
答:首先把读写片选信号产生了再去管sja1000吧。

问:我用验收滤波器来选择接收CAN2.0B的一帧数据,29位中只对其中几位进行判别,其他位又不是定值,请问这该怎么办?可不可以掩住不关心的位?用范围应该也可以实现,不过那样感觉不好,请教大家,谢谢!
答:相关/不相关位最终都可以转化为范围描述。

问:请教关于2119 can验收过滤器的问题
请问:1、在canstarter-ii应用指南第42页中提到的“fullcan标准地址”与“标准单个地址”有何区别?
     2、第45页表2.34的“值”“字”“行”“id索引”是什么概念?
答:fullcan标准地址放置的是需要自动执行接收存储的id索引表格(fullCAN功能,查看相关的介绍);标准单个地址仅仅是AF接收/屏蔽标准id的索引表格,即和一般的接收过滤理解一致。
答:fullcan模式下自动把符合的帧放在后面的ram里
   标准单个把符合的数据放在接收寄存器中

问:将“LPC 系列ARM 微控制器的CAN 接收过滤设置” 一文中的LTU.hpp加入原来的工程中(原来是用c做的),编译时有好多错误,用的确实是C++编译器,可感觉它对c++中的关键词不认识,请大家指教,谢谢!
答: 里头好像仅仅作用域符号“::”不是C的之外没什么特别之处。

问:以前我用的是485通讯,通讯协议里面都定义了包起始和包结束(CRC可以帮助验证是否包结束)。而对于CAN这个东东,比如我要发送一个信息包有100个字节,发送倒没有问题,对于接收端,我怎样去判断包起始和包结束呢?困惑ing
请斑竹和各位大虾们指教!!
答:CAN-bus由硬件完成帧的错误控制、数据处理,因此,协议比RS-485会方便许多。
比如扩展帧格式:
帧头(源地址、目的地址、命令字、辅参数)    数据场(分段码、0~7个数据)
    超过8个字节/帧时,需要分帧处理。
    具体方式,可以参考网页的《CAN应用方案》中通讯协议篇、RS-485升级篇。

问:我的应用为:一个主机(计算机)会和很多的从机连接,每个从机都将通过网络连接,所以必须使用HUB,你们的ZNE-100将接在HUB上。计算机只要和HUB连接就可以了。不知道我该如何设置ZNE-100?还有此HUB还能连接其他的计算机吗?
答:《ZNE-100嵌入式以太网转串口模块使用说明》  http://www.zlgmcu.com.cn/club/bbs/ShowAnnounce.asp?ID=45775

问:对sja1000进行硬件复位时,要求sja1000的片选同时有效吗?比如用138译码器的y1选通sja1000的复位线,来达到使sja1000复位的目的,那么此时要求片选线有效吗?
答:见SJA1000数据,异步操作,不要求片选有效。

问:请问怎样把sja1000分时复用AD总线与pc104的数据线和地址线连接? 
答:周立功公司已经有现成的“PC104-CAN”接口卡提供。

问:DP51+上BasicCAN测试程序的问题 
在DP51+上用BasicCAN测试程序按键操作向其它节点发送数据时,总出现E-F8的错误,检查连线和波特率的设置也没有问题,真不知道是什么原因?也没法收到其它节点发送过来的数据。有可能这是收发器TJA1050T出现问题了吗?
答:可能是组建的CAN网络中有其他节点未设置正确,比如波特率.ZLG公布的代码都经过测试,附有文档说明。

问:在开发过程中遇到如下问题:(公司没有上ARM,出于对其狂热的追求,自己出银子买的DEMO板)
1:想完成自发自收,CANMOD_STMBIT=1,CANCMR_SRRBIT=1,观察寄存器窗口,接收REG
  内容没有发生变化,(自测模式是否需要搭建一个CAN总线平台??我只有一个DEMO和
  一个自己做的CAN总线收发器),接收中断也未发生,用的是周工最新的驱动.
2. 如果只想接收ID为0x1234的信息,不用FULLCAN模式,该怎样设置才对呢?是不是这样:eFullCan禁能,则只需设置标准帧单个起始地址REG,把相应的ID填入就行了呢
3. 每次调用 CanSendData(CAN1,cSlfSendCmd,TempBufPt),都将导致
CANMOD_RM=1,发送错误计数器累加,好象是总线离线状态.郁闷啊
还请斑竹和大虾们指点迷津
答:CAN总线至少需要2个节点才好调试,要不怎样才能组成总线呢? 
答:网站可以下载代码,请参照配套的文档进行测试。
至少要加CAN收发器、终端电阻,建立再在PC上安装1个CAN接口卡,比如CAN232接口卡。
回复:原来采用的总线收发器的前端光耦出了问题!
谢谢大家了!特别感谢周立功的技术支持工程师!

问:如果要在CANBUS上供电12V或27V,该怎么做?
因为CAN是平衡传输,要用差分信号来同步,现在要提高电平,该怎么做,以前请教过,但都只是说设计接口电路就可以实现,但是太模糊了,能否有过经验者提供一点有实际操作的思路。感激不尽。。。。
感谢你的关注!!!
答:1,加一组电源线;2,收发器就是差分驱动器。

问:如果加电源线那还是总线供电吗?
我的意思是两条线上既传信号又传电,请教可以做到吗?
答:在CAN应用中的总线供电常指的是通过4芯或5芯通信线缆供电;收发器出来的仍然是基带信号没有调制的所以不容易实现线缆复用。

问:请各位高手解决:SJA1000收发扩展帧正常,但是不接收标准帧
答:我认为SJA1000不会出现这种现象,除非发送方有错误.

问:对FullCAN模式不是很理解,哪位老师给详细介绍一下,谢谢! 
答:简而言之,就是验收滤波方式的增强,BasicCAN只有一种滤波,PeliCAN有2种滤波,可以加上广播信息,而FullCAN就是有更多种滤波。


问:急,请各位老师近来看看2119 CAN验收滤波器问题 
设置如下:我用的是汇编:
AF_MEM   EQU   0xE0038000

LDR   R0,=AF_MEM       ;读取验收滤波器RAM的起始地址
LDR   R1,#0x25522553   ;我需要标识为552和553的接收,CAN1控制器
STR   R1,[R0]

LDR   R0,=AFMR         ;读取验收滤波器模式寄存器地址
MOV   R1,#0x00         ;这样启动滤波器对吗?
STR   R1,[R0]

这样的情况下,CAN1接收中断不响应任何数据,这是为什么?中断机制完好,旁路滤波器时候全部响应的.关于CANSFF_sa寄存器该如何设置才能完成滤波接收?请指教。

答:修改RAM表格前应该先置位AccBP位
LDR   R0,=AFMR         ;读取验收滤波器模式寄存器地址
MOV   R1,#0x02         ;置位AccBP,以便设置过滤表格         
STR   R1,[R0]
答:参考<LPC系列ARM微控制器的CAN接收过滤设置> 

问:在使用周的底层驱动时出了点问题,不知是什么原因 
用LPC2119中断方式做了一个转发器件,中断很正常,中断程序调用写环形环形缓冲区;主程序是读环形缓冲区,但是读时发生了数据中止,不解,就是下面第二句出了问题
stcRxBUF *RxBuf;
*RxBuf = CANRcvBufApp.RcvBuf[CAN1][CANRcvBufApp.ReadPoint1];
答:网站资料已更新;查询方式会比较方便。

问:过载帧与错误帧是怎么使用的啊
对数据帧,和远程帧很好理解,也很好使用,但是对过载和错误就不知道在什么地方用了,也不知道该怎么用了啊?请各位指点
答:CAN控制器自己管理

问:错误消极中断和错误警报中断该怎么处理呢?只是简单的复位么?这两种错误有什么区别呢?不太明白
答:按流程可以不处理,参考网站示例。

问:仲裁丢失该怎么理解呢?仲裁丢失算不算是一种错误呢?仲裁丢失一般的处理是怎么样的呢?只是读取仲裁丢失捕捉寄存器么?
答:不算,仅仅提供一个网络参考信息,例如网络负载/id分配是否合理等。

问:为什么在分析仪发出第三侦后,2119才产生接收中断,而且收到的是第一侦的数据,WritePoint2 = 1。
如果分析仪只发出一侦数据,不能产生中断,怎么回事?
答:第三帧才产生中断可能是溢出中断,因为接收中断和溢出中断的额中断号是不同的,菲利普的早期资料中CAN的中断号有错,请下载最新资料!
答:我试过中断模式,没问题,可以产生中断,可是周的低层驱动关于环形缓冲区那部分可能有些问题。
中断后调用写数据缓冲区,然后在主程序里循环读环形缓冲区。忘了是在哪里会出现数据中止,按说是不应该出现的。

问:请教RTR位在滤波中的作用?
请教各位老师:滤波器中的rtr位参不参与滤波,我在实验中有两个节点,采用双滤波标准帧通信,我设置接收方的acr0,acr1,acr2,acr3寄存器为00,20,00,00,amr0,amr1,amr2,amr3分别是00,0f,00,ff.发送方ID1,ID2为00,20;但是发送方的ID2,只要是20和30,该帧数据都能接收,其它的如40,50,都不行,我不知道为什么?是不是rtr位不参与滤波,发送方在发送的时间不必要考虑此位。
郁闷的不行,恳请帮助!
答:就把它看作像id那样的一个bit看待吧。

问:SJ1000T中基本模式下只能检测8位的ID,但发送时确有11位ID,请问ID2-0有什么用?
答:你指的是BasicCAN模式下的”验收过滤”;其实,两种模式的所有11位或29位都有效。

问:BasicCAN模式下的”验收过滤”只能过滤ID10-3,请问ID2-0对接受有影响吗?资料显示并没有对ID2-0进行核对。
答:BasicCAN模式没有对ID2-0进行核对。

问:请问在双绞线上传输的CAN信号波形应该是怎么样的?信号的幅值和频率?另外,能否推荐使用在车辆上的电缆型号以及节点与总线相接的接插件型号!谢谢!!
答:汽车类型不同,应用有所不同,建议参考SAE J1939协议内容中的规定,制定自己的规范。

问:有没有CAN控制器+单片机(不包括CAN驱动器),成本不超过15元的方案?可付报酬!
答:目前我们没有能力实现。
答:io模拟低速can。

问:请问CAN总线是不是不能提供总线供电?如果希望总线供电该如何做?谁能提供一点关于CAN能总线供电的资料啊?
答:CAN 或 DeviceNet 都可以总线供电,根据需要选择适合的应用。
CAN 没有规定物理层.是一种相当灵活的现场总线。DeviceNet、CANopen均是基于CAN-bus协议,自定协议也不难。

问:请问远程帧的作用是什么?在什么情况下需要使用它?
答:那是一种可用可不用的帧资源.

问:基地址选了0xda00,偏移量选择0000后,sja1000得寄存器的地址是从0xda000开始吗?
答:对的。

问:在每次只收到一帧的情况下,我置位清除接受缓存都没问题,但是一旦在短时间内接收到2帧或以上时(短时间指,第一帧还未完全被微控制器接收而第二帧已经到来)我收完一帧,置位清缓就会出错。然后我复位继续接收下一帧微控制器就不能从sja1000接收了,为什么会这样那?置位清缓不是只清掉第一帧数据么?如果只清第一帧数据的话,应该第二帧可以收到的啊?这是怎么回事那?要怎么解决那?谢谢了。
答:不会这样的,查查其他原因。 

问:请教版主CAN总线用于爆炸性气体环境可以吗? 
在网上搜索了一下,看到的 是几年前发表的 文章说CAN总线没有解决防爆问题,不知现在有没解决在爆炸性气体环境使用CAN总线通信。如果没有那只好用以前的 485了 改成hart还是更麻烦
答:在《现场总线控制系统的调试与开发》–国防工业出版社的技术书籍第8页,列出了CAN-bus是本安的总线之一。

问:请问Can232和can232B转换器的通讯协议是否必须和计算机相连才能更改我想用转换器直接与PLC相连不知如何设置通讯协议。
答:看应用场合而定,可以不用设置协议。这一份文档中有很好的说明!

问:关于节点发送的问题向你请教。
    发现经常我的硬件复位有时不是成功的,导致发送不成功。读状态寄存器SR=0x04,或0x44;请问这种情况是怎么回事??
答:“硬件复位有时不是成功的”不容易理解;建议看一下前面的贴,或网站的参考程序。

问:那请问:硬件复位后,我发送前读状态寄存器SR=0x04,也就是“当前请求的发送未处理完”,这种情况下发送时不能成功的。
有时候硬件复位后发送前读状态寄存器SR=0x0c,这种情况下发送时可以的。
请教:为什么硬件复位后还会出现像前面的那种状态寄存器SR=0x04,也就是“当前请求的发送未处理完”的情况,
应该如何处理???
答:硬件复位成功后 SR= 0X0C ;否则就是硬件方面存在问题。建议用网站公开的电路与程序,或者直接在DP系列实验仪上测试。

问题1:在通讯时出现错误,用软件复位能否将错误清除?
问题2:软件复位是否将以前设置的参数改为默认值?是否需要重新初始化?
答:1.可以;2否,是 

问:为什么我在复位模式下CDR寄存器写不进那?其他寄存器都可以写进去,就是CDR写不进去。。
不明白为什么,和其他寄存器一样的写法,语句,但是无论写什么进去,读出来都是00H。可以帮忙解答以下么?谢了
注:无论读写都是在复位模式下
答:芯片SJA1000的硬件复位会使CDR=0x00。

求助,为何我写不了CAN地址大于8的寄存器?
SJA1000的基地址是BF00H,我对SJA1000的寄存器在复位模式下进行写,写完读出(当然是对于可读写的)发现对于CAN地址大于8的写入一定的数之后再读出,读出的数大部分是FF,而不是我写如的数,哪位大侠可以提供帮助?谢谢。在PELICAN模式下。
答:你在basic模式下试一下。
答:也可能是硬件接线问题。

问:SAE J1939的中文资料在哪里找?
答:一般不会有中文资料,看网站《应用方案-通讯篇》。 

请问版主及各位大虾:汽车CAN节点与工控CAN节点的?区别在什么地方
答:通讯距离、应用层协议不同,电路稍有不同,参考网站资料。 

问:我现在正在做与CAN总线相关的课题,买了CANstarter-I 开发套件,现在差不多快看完了。不过现在有一个问题,就是各位在自己做实验时硬件是怎么做的,是自己搭手工焊接的电路板,还是用Protel制作PCB图后印刷出电路板来?Protel我以前从未学过,要按电路图去自己做PCB的话周期太长,可自己焊又不能保证电路板的稳定性?
答:配套光盘中有PROTEL格式的CAN节点原理图,PCB可以参考实验仪。

问:我用中断接受can总线发来的数据,可是单片机怎么也进入不了外部中断程序?为什么?
8051中关于外部中断0的设置我都设置了,可就是进入不了isr,如果我采用查询接受,int/端的电平就显示正常(低到高),一采用中断,int/端的电平就被拉低不会变高,我在isr中设置了点灯测试,当有数据时因为灯没亮,所以我判断是进入不了isr,各位老师看看这是为什么呢?
答:设置电平触发,确保mcu相应中断的其他设置正确。

问:再用USBCAN-I时,ZLGCANTest为什么不能设置波特率?那时钟频率是多少啊?说明书上也没有说明啊 ?
答:打开设备时定时器0、定时器1就是用于设置波特率的。详细请看相关的用户手册。16MHz,在编程接口文档中应该也有说明。

问:关于SJA1000的错误处理! 
在SJA1000的资料上可以看到,它有一个错误代码捕捉寄存器(ECC),通过查询这个寄存器我们可以知道总线错误的类型和位置信息。但在实际的应用中,我们好像对这方面CAN总线错误处理的功能用的很少,可能有时也没考虑。一方面CAN总线的错误很少发生,另一方面我们缺少这方面总线发生错误的的实际例子,
在实际的总线应用过程中,CAN总线的错误是应该也必须考虑的,因为这直接影响CAN网通讯的质量和可靠性。
我希望各位同行能在这方面提出自己的看法。。。。。。
答:精华区有相关的讨论贴。

问:正常模式下发送,给命令寄存器赋值0X03,由于没有另一点的响应,这一点会一直发送(在示波器的波形可以看出),
我现在问题是,这一点在重新软件复位后,就不能发送了,读状态寄存器 ,显示最后一次发送未被处理成功,假如关闭电源硬件复位重新开始又可以发送了。请教大家可以取消CAN节点的发送命令吗?用软件怎样实现?
答: 请问你所指的软件复位是什么?是进入复位模式吗?如果是的话当然不行。
答:我说的软件复位是指使仿真器重新编译,程序从头运行。就是MCU给SJA1000复位模式初始化后退出复位模式,进入工作模式后再发送 .

问:大家好,我最近刚开始用can总线设计一个项目,目前遇到一个很大的困惑,就是在设计can智能节点时(WEE758+SJA1000+TJA1000),两者的接口通讯都有问题,初始化好像过了,但用ZLGTEST软件调试,不能正常收发数据,我查了硬件电路,没有问题,我郁闷死了,请问大家该从哪方面下手去找原因啊,我用的电路是CANSTART-I用户指南里面的那个程序,不知道有没有问题。请有经验的人帮帮忙啊,我的时间太紧了。
答:先测试你的硬件 物理连接是否通过,可以先给SJA1000写一个值如0xAA,再访问SJA1000读出来看是否是0小AA?
答:”不能正常收发数据,我查了硬件电路,没有问题…”,这不自相矛盾了吗?
1,把所sja1000当作xdata ram测试看看是否总线连接正常,sja受控?
2,发送时看看总线是否出现差分信号?物理连接是否正常?
这就基本把硬件问题定位了。

问:请帮忙看一下程序,谢谢! 
SJA1000中
地址16  写入0x88
地址17  写入0x04
地址18  写入0x03
地址19  写入0x02
地址19  写入0x01
使用ZLGCANTEST软件得到的ID应该是多少?怎样计算?
我得出的是0x00806020,好象是右移了五位?是否正确啊?
答:工作在PeliCAN模块的话,参照产品手册附录2可以获得在总线上的ID值。

问:输出控制寄存器的OCMODE1和OCMODE0可以设置为四种方式,双相、测试、正常和时钟输出,一般应该选择哪一种输出比较好,通讯可靠性高。
答:常用push-pull模式,这比较通用,适应性较好。

问:在用ZLGCANTest 1.4版在调试程序时,下位机发送标准数据帧,USBCAN-II智能卡收此信息.下位机的ID号为:0x00000035,如果将ZLGCANTest的"打开设备"对话框中的验收码设为0x00000035,屏蔽码设为0x00000000,为什么不能收到信息.如何在ZLGCANTest中设置验收滤波器?(发送节点ID为0x00000035,发送标准数据帧,接收端为USBCAN-II智能卡)
答:验收过滤设置为4个寄存器,但需要根据接收帧格式进行设置,而不是简单地对应关系。请参考提供的《CAN控制SJA1000验收滤波器原理与应用.pdf》资料。


问:不好意思,因为我在调试中,下发的报文没有反应,但是能收到下位机送上来的信息,我问了我们开发装置的同事,他说可能跟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

答: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晶振;网站有一个波特率计算工具下载;

问:设波特率是不是用“打开设备-》定时器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(模式及分频)的;
千万不要引脚连错!!!这样类似的问题不止是听过一两次了

很值得看看

zlg关于can帖子汇总

 

SJA1000的常用标准波特率设置,为什么基本上都是单次采样?即使是低速的时候也是这样的,既然TSEG1的设置周期都很大,比如都大于10了,为什么不让他采样三次呢?
答: 是不好理解,但那是CiA推荐的值。

用51系列芯片和两个SJA1000接口还要外扩一个RAM,请问51的ALE能否同时与三个芯片的ALE管脚相连(地址不同)? 有哪位高手做过双SJA1000冗余的请指教!!!! 
答: 能同时连接。 

请问CAN总线在想传输1000m的情况下,最快的速度能到多少呢? 
答: 50kbps = 1300m。

如果一个网络中只有2个节点,其中一个处于监听模式,另一个节点发送报文会使处于监听模式的节点进入中断吗? 
答: 能进入接收中断,你自己的试验也可以证明。

想组建一个简单的CAN网络,已经有两个节点,我想问CAN总线如何组建,终端电阻安装在哪里?小弟还没有入门,大虾们指点一下。
答1:直接将节点CANH和CANL连到总线上,终端电阻接在总线两端,大约120欧。
答2: 推荐北航出版《现场总线CAN原理与应用技术》,研读一下。

请问各位老师:我是一名can总线的新手,我正在做can总线的开发,控制器用sja1000t(我自己两个控制板互通),但我在发送数据后将出现总线关闭,我看到发送错误计数器在不断增加,直到0xff,最后恢复到0x7f,谢谢各位老师帮我解答这个问题。或者对我给与启发
答1;首先调通单个节点。
答2:这是单节点发送没有成功(或者由于网络中其他节点没有收到帧并在响应场响应);建议参考网站CAN应用方案。

我想请教各位can远程贞有何作用?如何应用?在什么情况下才需要用到远程贞?谢谢了!
答:远程幀的用与不用完全取决你自己的协议,can有远程幀的功能,是可用可不用的!

用网站提供的计算波特率的工具算出的数,12k以上的都正确,无论是自接收还是两个节点通讯都没有任何问题。但是12k以下的数据一个都不能用,两个节点通讯没有成功的,自接收有10k的几个数据成功。我们的项目要求必须在10k以下,最好是5k,但是不成功,自己计算的数据也没有成功的。(我们至少试验了30多个,所有情况都考虑了。)
我现在怀疑sja1000的波特率根本达不到5k和相对应的传输10km。
或者可以谁能提供个经过实践检验的正确的总线定时器0和1的设置呢?要求低于10k。
答:PCA82C250/251可以保证5KBPS的速率;比如ZLGCAN系列接口卡。
答:tja1050在低速时好像有问题。我用1050进行5k的时候不行,用82c250很好,你可以试一试。

我本想双机调试,一边收,一边发,但跑程序后,发送方会不断进入复位模式,所以现在进行自测试模式,我先进入复位模式,设置进入PELICAN模式,对寄存器初始化后,设置接收,发送中断使能,最后设置进入自接收,单滤波模式,这样初始化就结束了,我的ACR0~ACR3 为0x55,0x55,0x55,0x50,AMR0~AMR3为0xff,之后,我就往BUFFER里填数,0x88,0x55,0x55,0x55,0x50,0x30,0x31,…..0x37,之后,启动自接收请求命令,但是程序只进入了中断一次,是发送空中断,接收中断没有产生,我读发送错误寄存器,发现有错误产生,我读接收计数寄存器,为0,说明我没有收到数,但我读接收BUFFER时,值为0x55,0x55,0x55,0xff,0xff,0xff,0xff,0xff,0,0,0,0,0,
以上测试时,我在CANH和CANL之间加入了两个120欧的匹配电阻并联在一起的,请各位高手指点呀,谢谢了
答:在总线上加个CAN接口卡会方便许多,或者加个捕获功能的示波器也可以检测波形。

仿真环境:keil uv2
编译器:keil c51 7.0
仿真器:tks-591s
cpu:p87c591
程序大小:8K左右
兄弟在一片CPU中烧写了一个,运行一个CAN总线,IIC总线测试程序能够正常运行。这个基础上加上应用程序后在仿真机中运行正常,但是烧写到cpu后插入cpu程序不能运行,请问是什么原因?
另外一个问题:
在另外一个项目中条件相同,程序只有4K,程序正常跑着,CAN接口可以检测到输出波形但是却不能正确传输数据,在一块旧板子上就可以,比较两者之后发现电路完全相同测量也正常,只是布局不同,请教原因。
答:程序已运行了吧?可能是HEX文件有错;编制程序时注意P87C591的ERAM设置、6CLK设置。

位流数据采样自发送节点的82c250的Tx管脚。
测试条件:pelican ,扩展,双滤波模式,对方ID:0x88,0x11,0x55,0x10,发送的对方ID为:0x88,0x11,0x00,0x00,发送2字节数据为:0x05,0x06
采集的位流数据如下:
01000100000101110001000001000001000001000100000110000010001101100001001110111111111111
请教位流数据的含义?
答:自行计算时要区分位,还需要进行“位填充”的逆运行;简单的方法是将此信号连接至1个CAN接口卡的RXD引脚。

用ZLGCANTEST软件调试和板卡通讯,但是板卡能够正常通讯几次后就不再上传数据,查看SJA1K的状态寄存器,发现是SJA1K正在发送,但是怎么老是出现这种问题啊,请有相同经历的高手教小弟一把啊!谢谢了!!!!
答:其中的一个原因是收不到接受应答,比如对方id错误
 
通讯实验:长度1km,同样的线路,得用ZLG公司的CAN设备(9820,5121)通讯是正常的,但是我们自已的系统,在1000米时(50K波特率)的通讯是完全正常的,但是再上加一段线路(约70米,与1公里电缆是不同线质,螺旋状),数据丢失严重.我们的硬件是完全提供的参考电路的,所以说硬件上应当没有问题.软件上有没有什么特殊处理吗?比如说发送失败,总线错误如何处理???
系统已经调试了相当长一段时间了,但还是没有头绪.就这个问题解决不了,我们在线路中加了CanRepA和CAN_REPB均不能很好的解决!!!同样的线路和硬件,ZLG公司的系统可以通信很好,而我们的系统却不呢,是不是软件处理有些要求??请大家指点!
答:检查各节点CANH和CANL之间的阻值是否在合理范围之内;CAN网络通讯故障一般是通讯电缆选择不合适。

请专家帮估计ARM CPU 的CAN口处理能力! 
在不处理复杂协议的情况下,一个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验收滤波器原理与应用》。

谁能告诉我canbus的优势?CAN vs 485
答: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)ADuC812ZLGCANADuC81289C51AD MOD812外,还需要其它的设置?如果是,怎样设置?谢谢!
答:硬同步。CAN控制器中如何执行硬同步?

我板子上的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一般也可设定。 

问:SJA1000的双相输出方式具体该如何应用,如果不接PCA250,怎么接到总线上?
答: 还是要接PCA82C250芯片。

问:关于CAN总线供电的请教: 如果用电源耦合能否实现CAN的总线供电?
答:建议用标准双绞线方式;走的人多了,不需要自己研究。

问:光靠标准双绞线怎么能实现总线供电呢?
答:总线供电另外采用独立的电缆,如 DeviceNet 规范;这是国际推荐的标准方式。

问:请问CAN总线两节点间要通信的话,他们的波特率是不是要完全一致?
答:节点有重同步的功能,允许偏差在一定范围内,比如晶振偏差,见SJA1000的位定时文档。

问:请问验收滤波器可不可以屏蔽某些位,就是说不管某些位是什么,只关心其中几位。
答:当然可以啊。


问:我现在调试通过CAN通讯的数据采集板,上位机买的是的PCI_CAN9810卡,用CANalyst分析仪调试自己开发的CAN采集板,我现在调试CAN,还没有调试通,CAN的CS接CPU(P89V51RD)的P2.7(28脚),CAN地址是7fff,应该没错吗?程序如下(用伟福仿真器仿真):
# include<AT89X51.H>
# include<SJA_BCANCONF.H>
# include<SJA_BCANFUNC.C>

# define    uchar    unsigned char

void    InitCpu(void);
void    InitT0(void);
void    Sja1000Init(void);

bit    SecFlag;
//uchar    data    a[5];
uchar    data    SendData[10],RcvData[10];
uchar    DataBuf,SecData,Second;
uchar    data    TmodData;
uchar    bdata    FlagInit;
sbit    RcvFlag=FlagInit^0;
sbit    ErrFlag=FlagInit^2;

void    main(void)
{
    //int    i;
    //for(i=0;i<100;i++)
    //P1_4=1;
    Sja1000Init();
    InitT0();
    InitCpu();
//    flaginit();
    while(1)
    {
        if(RcvFlag)
        {
            RcvFlag=0;
            BCAN_DATA_RECEIVE(RcvData);
            BCAN_CMD_PRG(0x04);    //release buffer
        }
        if(SecFlag)
        {
            SecFlag=0;
            SendData[0]=0xaa;   //send canid
            SendData[1]=0x08;   //send longth
            SendData[2]=Second;  //send data
            BCAN_DATA_WRITE(SendData);
            BCAN_CMD_PRG(0x01);
        }
        if(ErrFlag)
        {
            ErrFlag=0;
            Sja1000Init();
        }
    }
}

void    Ex0Int(void) interrupt 0 using 1
{
    SJA_BCANAdr=REG_INTERRUPT;
    FlagInit=*SJA_BCANAdr;
}

void    T0Init(void)    interrupt 1 using 2
{
    TR0=0;
    SecData–;
    if(SecData==0)
    {
        SecData=0x10;
        TH0=0x80;
        TL0=0x60;
        SecFlag=1;
        Second++;
    }
    TR0=1;
}

void    InitCpu(void)
{
    PX0=1;
    IT0=1;
    EX0=1;
    ET0=1;
    EA=1;
    SecData=0x10;
}

void    InitT0(void)
{
    TmodData =TMOD;
    TmodData &=0xf0;
    TmodData │=0x01;
    TMOD =TmodData;
    TH0 =0x80;
    TL0 =0x60;
    TR0 =1;
    SecData=0x20;
    Second=0x00;
}

void    Sja1000Init(void)
{
    BCAN_ENTER_RETMODEL();
    BCAN_SET_BANDRATE(0x04); //100k
    BCAN_SET_OBJECT(0xaa,0xff);
    BCAN_SET_OUTCLK(0xaa,0x48);
    BCAN_QUIT_RETMODEL();
    SJA_BCANAdr =REG_CONTROL;
    *SJA_BCANAdr │= 0x0a;    //
}
现在用示波器测CAN_H和CAN_L,没有信号,请问是什么问题?

注:这个参考一下吧,呵呵


问: 请教各位大虾:有没有CAN局部测试程或意见?急需!!谢谢!!!
有没有人能给他的自测程序给我看看?帮帮我呀!
答:网上有basicCAN例程,CANstarter-I 工具中有PeliCAN例程。


问:我贴一下关于CAN验收滤波器的程序:哪里不对,请指教。多谢多谢了。
BPS_307K   EQU   0x00F88001  ;波特率307K
AF_RAM     EQU   0xE0038000  ;验收滤波器RAM起始地址

           LDR  R0, =CANAFMR
           MOV  R1, #0x02
           STR  R1, [R0]
           
           LDR  R0, =AF_RAM
           LDR  R1, =0x25522553
           STR  R1, [R0]
//我在上面设置了一个25522553,CAN控制1口,只接收标识符为552,553的帧,我不知道这样设置对吗?这算设置了一个表格吗?

           LDR  R0, =CANAFMR
           MOV  R1, #0x00
           STR  R1, [R0]

//这样算是启动了吧?我没有设置CANSFF_sa滤波器,可以不设置吗?如果需要设置,照我现在的情况,这个滤波器中应该填什么值呢?
//在以上设置好以后,所有的总线数据都不响应了,急死我了,我看了网上的pdf文档,不过还是没什么启发。希望高手能解答我的疑惑。谢谢了

答:参考或直接使用CANstarter-II开发套件中提供的资源。


问:请问各位高手,作为一个初学者应该如何学习CAN总线技术?应该先学习哪一些基本知识,请推荐妨相关书籍一二。谢谢!
答:现场总线CAN原理与应用技术
作者:饶运涛 邹继军 郑勇芸
出版社:北京航空航天大学出版社

问:又没有带CAN控制器的可在线编程的8位单片机呢,麻烦推荐一款吧 
答:ATMEL AT89C51CC0X 系列不错!
答:intel的89C591,89C592都是片内带can的8位单片机。

问:本来应用了CAN232,但是想提高系统的速度,想用PCI-CAN,做USB-CAN,但是想借此学习PCI,或USB,ZLG这里能想CAN232一样,如果买了板子,提供代码,原理图吗?如果没有哪种开发板有呢,能推荐一下吗?
答:系统而理论地学习CAN,建议选择CANstarter-I/II开发套件;应用的话,USBCAN、PCICAN都是非常可靠的产品。

问:请问,在SJA1000软件设计中,把发送信息送入发送缓冲区,启动发送后,为何总是会自动进入复位模式?请哪位大侠帮忙指教一番.
问:再问一下,之后我重新换了线路板和芯片,复位问题没有了,但启动发送后检测状态位,发现发送状态一直为(始终发送未完成)。需要说明一点,目前我只用了一块线路板加一个仿真器进行发送调试,并没有接上接收的线路板,请问单发行否?请大侠帮忙指点以上问题!谢谢!
答: 一个节点可以工作在自测试模式,在这个模式下的工作机制跟两点是一样的,然后启动自接收命令即可。
答: 单发送不可, 正常发送时需要网络上同一速率的工作节点响应. 

问:第一,接收信息的工作节点需要什么响应来确认?第二,接收的子程序未调好是否意味收发两方均无法调试?如何确认发送成功?
答:网络上同一速率的正常工作节点响应:1、已设定速率;2、在工作状态。完全是由硬件(比如:SJA1000芯片)完成ACK确认。

问:请问单个can 节点可以进行调试吗?是一块一路的can适配卡,使用端口地值300h,我使用winio进行读写的,可为什么,所有的单元读出来得数据都是ff?是因为只使用了单个节点can控制器不能正常工作吗?
答:sja可实现单节点调试;ff应该是地址空间错误;
问:我还是不太明白,你说的地址空间错误,是说sja1000的地址没有选通,地址没有指向sja1000的寄存器吗?
答:首先把读写片选信号产生了再去管sja1000吧。

问:我用验收滤波器来选择接收CAN2.0B的一帧数据,29位中只对其中几位进行判别,其他位又不是定值,请问这该怎么办?可不可以掩住不关心的位?用范围应该也可以实现,不过那样感觉不好,请教大家,谢谢!
答:相关/不相关位最终都可以转化为范围描述。

问:请教关于2119 can验收过滤器的问题
请问:1、在canstarter-ii应用指南第42页中提到的“fullcan标准地址”与“标准单个地址”有何区别?
     2、第45页表2.34的“值”“字”“行”“id索引”是什么概念?
答:fullcan标准地址放置的是需要自动执行接收存储的id索引表格(fullCAN功能,查看相关的介绍);标准单个地址仅仅是AF接收/屏蔽标准id的索引表格,即和一般的接收过滤理解一致。
答:fullcan模式下自动把符合的帧放在后面的ram里
   标准单个把符合的数据放在接收寄存器中

问:将“LPC 系列ARM 微控制器的CAN 接收过滤设置” 一文中的LTU.hpp加入原来的工程中(原来是用c做的),编译时有好多错误,用的确实是C++编译器,可感觉它对c++中的关键词不认识,请大家指教,谢谢!
答: 里头好像仅仅作用域符号“::”不是C的之外没什么特别之处。

问:以前我用的是485通讯,通讯协议里面都定义了包起始和包结束(CRC可以帮助验证是否包结束)。而对于CAN这个东东,比如我要发送一个信息包有100个字节,发送倒没有问题,对于接收端,我怎样去判断包起始和包结束呢?困惑ing
请斑竹和各位大虾们指教!!
答:CAN-bus由硬件完成帧的错误控制、数据处理,因此,协议比RS-485会方便许多。
比如扩展帧格式:
帧头(源地址、目的地址、命令字、辅参数)    数据场(分段码、0~7个数据)
    超过8个字节/帧时,需要分帧处理。
    具体方式,可以参考网页的《CAN应用方案》中通讯协议篇、RS-485升级篇。

问:我的应用为:一个主机(计算机)会和很多的从机连接,每个从机都将通过网络连接,所以必须使用HUB,你们的ZNE-100将接在HUB上。计算机只要和HUB连接就可以了。不知道我该如何设置ZNE-100?还有此HUB还能连接其他的计算机吗?
答:《ZNE-100嵌入式以太网转串口模块使用说明》  http://www.zlgmcu.com.cn/club/bbs/ShowAnnounce.asp?ID=45775

问:对sja1000进行硬件复位时,要求sja1000的片选同时有效吗?比如用138译码器的y1选通sja1000的复位线,来达到使sja1000复位的目的,那么此时要求片选线有效吗?
答:见SJA1000数据,异步操作,不要求片选有效。

问:请问怎样把sja1000分时复用AD总线与pc104的数据线和地址线连接? 
答:周立功公司已经有现成的“PC104-CAN”接口卡提供。

问:DP51+上BasicCAN测试程序的问题 
在DP51+上用BasicCAN测试程序按键操作向其它节点发送数据时,总出现E-F8的错误,检查连线和波特率的设置也没有问题,真不知道是什么原因?也没法收到其它节点发送过来的数据。有可能这是收发器TJA1050T出现问题了吗?
答:可能是组建的CAN网络中有其他节点未设置正确,比如波特率.ZLG公布的代码都经过测试,附有文档说明。

问:在开发过程中遇到如下问题:(公司没有上ARM,出于对其狂热的追求,自己出银子买的DEMO板)
1:想完成自发自收,CANMOD_STMBIT=1,CANCMR_SRRBIT=1,观察寄存器窗口,接收REG
  内容没有发生变化,(自测模式是否需要搭建一个CAN总线平台??我只有一个DEMO和
  一个自己做的CAN总线收发器),接收中断也未发生,用的是周工最新的驱动.
2. 如果只想接收ID为0x1234的信息,不用FULLCAN模式,该怎样设置才对呢?是不是这样:eFullCan禁能,则只需设置标准帧单个起始地址REG,把相应的ID填入就行了呢
3. 每次调用 CanSendData(CAN1,cSlfSendCmd,TempBufPt),都将导致
CANMOD_RM=1,发送错误计数器累加,好象是总线离线状态.郁闷啊
还请斑竹和大虾们指点迷津
答:CAN总线至少需要2个节点才好调试,要不怎样才能组成总线呢? 
答:网站可以下载代码,请参照配套的文档进行测试。
至少要加CAN收发器、终端电阻,建立再在PC上安装1个CAN接口卡,比如CAN232接口卡。
回复:原来采用的总线收发器的前端光耦出了问题!
谢谢大家了!特别感谢周立功的技术支持工程师!

问:如果要在CANBUS上供电12V或27V,该怎么做?
因为CAN是平衡传输,要用差分信号来同步,现在要提高电平,该怎么做,以前请教过,但都只是说设计接口电路就可以实现,但是太模糊了,能否有过经验者提供一点有实际操作的思路。感激不尽。。。。
感谢你的关注!!!
答:1,加一组电源线;2,收发器就是差分驱动器。

问:如果加电源线那还是总线供电吗?
我的意思是两条线上既传信号又传电,请教可以做到吗?
答:在CAN应用中的总线供电常指的是通过4芯或5芯通信线缆供电;收发器出来的仍然是基带信号没有调制的所以不容易实现线缆复用。

问:请各位高手解决:SJA1000收发扩展帧正常,但是不接收标准帧
答:我认为SJA1000不会出现这种现象,除非发送方有错误.

问:对FullCAN模式不是很理解,哪位老师给详细介绍一下,谢谢! 
答:简而言之,就是验收滤波方式的增强,BasicCAN只有一种滤波,PeliCAN有2种滤波,可以加上广播信息,而FullCAN就是有更多种滤波。


问:急,请各位老师近来看看2119 CAN验收滤波器问题 
设置如下:我用的是汇编:
AF_MEM   EQU   0xE0038000

LDR   R0,=AF_MEM       ;读取验收滤波器RAM的起始地址
LDR   R1,#0x25522553   ;我需要标识为552和553的接收,CAN1控制器
STR   R1,[R0]

LDR   R0,=AFMR         ;读取验收滤波器模式寄存器地址
MOV   R1,#0x00         ;这样启动滤波器对吗?
STR   R1,[R0]

这样的情况下,CAN1接收中断不响应任何数据,这是为什么?中断机制完好,旁路滤波器时候全部响应的.关于CANSFF_sa寄存器该如何设置才能完成滤波接收?请指教。

答:修改RAM表格前应该先置位AccBP位
LDR   R0,=AFMR         ;读取验收滤波器模式寄存器地址
MOV   R1,#0x02         ;置位AccBP,以便设置过滤表格         
STR   R1,[R0]
答:参考<LPC系列ARM微控制器的CAN接收过滤设置> 

问:在使用周的底层驱动时出了点问题,不知是什么原因 
用LPC2119中断方式做了一个转发器件,中断很正常,中断程序调用写环形环形缓冲区;主程序是读环形缓冲区,但是读时发生了数据中止,不解,就是下面第二句出了问题
stcRxBUF *RxBuf;
*RxBuf = CANRcvBufApp.RcvBuf[CAN1][CANRcvBufApp.ReadPoint1];
答:网站资料已更新;查询方式会比较方便。

问:过载帧与错误帧是怎么使用的啊
对数据帧,和远程帧很好理解,也很好使用,但是对过载和错误就不知道在什么地方用了,也不知道该怎么用了啊?请各位指点
答:CAN控制器自己管理

问:错误消极中断和错误警报中断该怎么处理呢?只是简单的复位么?这两种错误有什么区别呢?不太明白
答:按流程可以不处理,参考网站示例。

问:仲裁丢失该怎么理解呢?仲裁丢失算不算是一种错误呢?仲裁丢失一般的处理是怎么样的呢?只是读取仲裁丢失捕捉寄存器么?
答:不算,仅仅提供一个网络参考信息,例如网络负载/id分配是否合理等。

问:为什么在分析仪发出第三侦后,2119才产生接收中断,而且收到的是第一侦的数据,WritePoint2 = 1。
如果分析仪只发出一侦数据,不能产生中断,怎么回事?
答:第三帧才产生中断可能是溢出中断,因为接收中断和溢出中断的额中断号是不同的,菲利普的早期资料中CAN的中断号有错,请下载最新资料!
答:我试过中断模式,没问题,可以产生中断,可是周的低层驱动关于环形缓冲区那部分可能有些问题。
中断后调用写数据缓冲区,然后在主程序里循环读环形缓冲区。忘了是在哪里会出现数据中止,按说是不应该出现的。

问:请教RTR位在滤波中的作用?
请教各位老师:滤波器中的rtr位参不参与滤波,我在实验中有两个节点,采用双滤波标准帧通信,我设置接收方的acr0,acr1,acr2,acr3寄存器为00,20,00,00,amr0,amr1,amr2,amr3分别是00,0f,00,ff.发送方ID1,ID2为00,20;但是发送方的ID2,只要是20和30,该帧数据都能接收,其它的如40,50,都不行,我不知道为什么?是不是rtr位不参与滤波,发送方在发送的时间不必要考虑此位。
郁闷的不行,恳请帮助!
答:就把它看作像id那样的一个bit看待吧。

问:SJ1000T中基本模式下只能检测8位的ID,但发送时确有11位ID,请问ID2-0有什么用?
答:你指的是BasicCAN模式下的”验收过滤”;其实,两种模式的所有11位或29位都有效。

问:BasicCAN模式下的”验收过滤”只能过滤ID10-3,请问ID2-0对接受有影响吗?资料显示并没有对ID2-0进行核对。
答:BasicCAN模式没有对ID2-0进行核对。

问:请问在双绞线上传输的CAN信号波形应该是怎么样的?信号的幅值和频率?另外,能否推荐使用在车辆上的电缆型号以及节点与总线相接的接插件型号!谢谢!!
答:汽车类型不同,应用有所不同,建议参考SAE J1939协议内容中的规定,制定自己的规范。

问:有没有CAN控制器+单片机(不包括CAN驱动器),成本不超过15元的方案?可付报酬!
答:目前我们没有能力实现。
答:io模拟低速can。

问:请问CAN总线是不是不能提供总线供电?如果希望总线供电该如何做?谁能提供一点关于CAN能总线供电的资料啊?
答:CAN 或 DeviceNet 都可以总线供电,根据需要选择适合的应用。
CAN 没有规定物理层.是一种相当灵活的现场总线。DeviceNet、CANopen均是基于CAN-bus协议,自定协议也不难。

问:请问远程帧的作用是什么?在什么情况下需要使用它?
答:那是一种可用可不用的帧资源.

问:基地址选了0xda00,偏移量选择0000后,sja1000得寄存器的地址是从0xda000开始吗?
答:对的。

问:在每次只收到一帧的情况下,我置位清除接受缓存都没问题,但是一旦在短时间内接收到2帧或以上时(短时间指,第一帧还未完全被微控制器接收而第二帧已经到来)我收完一帧,置位清缓就会出错。然后我复位继续接收下一帧微控制器就不能从sja1000接收了,为什么会这样那?置位清缓不是只清掉第一帧数据么?如果只清第一帧数据的话,应该第二帧可以收到的啊?这是怎么回事那?要怎么解决那?谢谢了。
答:不会这样的,查查其他原因。 

问:请教版主CAN总线用于爆炸性气体环境可以吗? 
在网上搜索了一下,看到的 是几年前发表的 文章说CAN总线没有解决防爆问题,不知现在有没解决在爆炸性气体环境使用CAN总线通信。如果没有那只好用以前的 485了 改成hart还是更麻烦
答:在《现场总线控制系统的调试与开发》–国防工业出版社的技术书籍第8页,列出了CAN-bus是本安的总线之一。

问:请问Can232和can232B转换器的通讯协议是否必须和计算机相连才能更改我想用转换器直接与PLC相连不知如何设置通讯协议。
答:看应用场合而定,可以不用设置协议。这一份文档中有很好的说明!

问:关于节点发送的问题向你请教。
    发现经常我的硬件复位有时不是成功的,导致发送不成功。读状态寄存器SR=0x04,或0x44;请问这种情况是怎么回事??
答:“硬件复位有时不是成功的”不容易理解;建议看一下前面的贴,或网站的参考程序。

问:那请问:硬件复位后,我发送前读状态寄存器SR=0x04,也就是“当前请求的发送未处理完”,这种情况下发送时不能成功的。
有时候硬件复位后发送前读状态寄存器SR=0x0c,这种情况下发送时可以的。
请教:为什么硬件复位后还会出现像前面的那种状态寄存器SR=0x04,也就是“当前请求的发送未处理完”的情况,
应该如何处理???
答:硬件复位成功后 SR= 0X0C ;否则就是硬件方面存在问题。建议用网站公开的电路与程序,或者直接在DP系列实验仪上测试。

问题1:在通讯时出现错误,用软件复位能否将错误清除?
问题2:软件复位是否将以前设置的参数改为默认值?是否需要重新初始化?
答:1.可以;2否,是 

问:为什么我在复位模式下CDR寄存器写不进那?其他寄存器都可以写进去,就是CDR写不进去。。
不明白为什么,和其他寄存器一样的写法,语句,但是无论写什么进去,读出来都是00H。可以帮忙解答以下么?谢了
注:无论读写都是在复位模式下
答:芯片SJA1000的硬件复位会使CDR=0x00。

求助,为何我写不了CAN地址大于8的寄存器?
SJA1000的基地址是BF00H,我对SJA1000的寄存器在复位模式下进行写,写完读出(当然是对于可读写的)发现对于CAN地址大于8的写入一定的数之后再读出,读出的数大部分是FF,而不是我写如的数,哪位大侠可以提供帮助?谢谢。在PELICAN模式下。
答:你在basic模式下试一下。
答:也可能是硬件接线问题。

问:SAE J1939的中文资料在哪里找?
答:一般不会有中文资料,看网站《应用方案-通讯篇》。 

请问版主及各位大虾:汽车CAN节点与工控CAN节点的?区别在什么地方
答:通讯距离、应用层协议不同,电路稍有不同,参考网站资料。 

问:我现在正在做与CAN总线相关的课题,买了CANstarter-I 开发套件,现在差不多快看完了。不过现在有一个问题,就是各位在自己做实验时硬件是怎么做的,是自己搭手工焊接的电路板,还是用Protel制作PCB图后印刷出电路板来?Protel我以前从未学过,要按电路图去自己做PCB的话周期太长,可自己焊又不能保证电路板的稳定性?
答:配套光盘中有PROTEL格式的CAN节点原理图,PCB可以参考实验仪。

问:我用中断接受can总线发来的数据,可是单片机怎么也进入不了外部中断程序?为什么?
8051中关于外部中断0的设置我都设置了,可就是进入不了isr,如果我采用查询接受,int/端的电平就显示正常(低到高),一采用中断,int/端的电平就被拉低不会变高,我在isr中设置了点灯测试,当有数据时因为灯没亮,所以我判断是进入不了isr,各位老师看看这是为什么呢?
答:设置电平触发,确保mcu相应中断的其他设置正确。

问:再用USBCAN-I时,ZLGCANTest为什么不能设置波特率?那时钟频率是多少啊?说明书上也没有说明啊 ?
答:打开设备时定时器0、定时器1就是用于设置波特率的。详细请看相关的用户手册。16MHz,在编程接口文档中应该也有说明。

问:关于SJA1000的错误处理! 
在SJA1000的资料上可以看到,它有一个错误代码捕捉寄存器(ECC),通过查询这个寄存器我们可以知道总线错误的类型和位置信息。但在实际的应用中,我们好像对这方面CAN总线错误处理的功能用的很少,可能有时也没考虑。一方面CAN总线的错误很少发生,另一方面我们缺少这方面总线发生错误的的实际例子,
在实际的总线应用过程中,CAN总线的错误是应该也必须考虑的,因为这直接影响CAN网通讯的质量和可靠性。
我希望各位同行能在这方面提出自己的看法。。。。。。
答:精华区有相关的讨论贴。

问:正常模式下发送,给命令寄存器赋值0X03,由于没有另一点的响应,这一点会一直发送(在示波器的波形可以看出),
我现在问题是,这一点在重新软件复位后,就不能发送了,读状态寄存器 ,显示最后一次发送未被处理成功,假如关闭电源硬件复位重新开始又可以发送了。请教大家可以取消CAN节点的发送命令吗?用软件怎样实现?
答: 请问你所指的软件复位是什么?是进入复位模式吗?如果是的话当然不行。
答:我说的软件复位是指使仿真器重新编译,程序从头运行。就是MCU给SJA1000复位模式初始化后退出复位模式,进入工作模式后再发送 .

问:大家好,我最近刚开始用can总线设计一个项目,目前遇到一个很大的困惑,就是在设计can智能节点时(WEE758+SJA1000+TJA1000),两者的接口通讯都有问题,初始化好像过了,但用ZLGTEST软件调试,不能正常收发数据,我查了硬件电路,没有问题,我郁闷死了,请问大家该从哪方面下手去找原因啊,我用的电路是CANSTART-I用户指南里面的那个程序,不知道有没有问题。请有经验的人帮帮忙啊,我的时间太紧了。
答:先测试你的硬件 物理连接是否通过,可以先给SJA1000写一个值如0xAA,再访问SJA1000读出来看是否是0小AA?
答:”不能正常收发数据,我查了硬件电路,没有问题…”,这不自相矛盾了吗?
1,把所sja1000当作xdata ram测试看看是否总线连接正常,sja受控?
2,发送时看看总线是否出现差分信号?物理连接是否正常?
这就基本把硬件问题定位了。

问:请帮忙看一下程序,谢谢! 
SJA1000中
地址16  写入0x88
地址17  写入0x04
地址18  写入0x03
地址19  写入0x02
地址19  写入0x01
使用ZLGCANTEST软件得到的ID应该是多少?怎样计算?
我得出的是0x00806020,好象是右移了五位?是否正确啊?
答:工作在PeliCAN模块的话,参照产品手册附录2可以获得在总线上的ID值。

问:输出控制寄存器的OCMODE1和OCMODE0可以设置为四种方式,双相、测试、正常和时钟输出,一般应该选择哪一种输出比较好,通讯可靠性高。
答:常用push-pull模式,这比较通用,适应性较好。

问:在用ZLGCANTest 1.4版在调试程序时,下位机发送标准数据帧,USBCAN-II智能卡收此信息.下位机的ID号为:0x00000035,如果将ZLGCANTest的"打开设备"对话框中的验收码设为0x00000035,屏蔽码设为0x00000000,为什么不能收到信息.如何在ZLGCANTest中设置验收滤波器?(发送节点ID为0x00000035,发送标准数据帧,接收端为USBCAN-II智能卡)
答:验收过滤设置为4个寄存器,但需要根据接收帧格式进行设置,而不是简单地对应关系。请参考提供的《CAN控制SJA1000验收滤波器原理与应用.pdf》资料。


问:不好意思,因为我在调试中,下发的报文没有反应,但是能收到下位机送上来的信息,我问了我们开发装置的同事,他说可能跟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

答: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晶振;网站有一个波特率计算工具下载;

问:设波特率是不是用“打开设备-》定时器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(模式及分频)的;
千万不要引脚连错!!!这样类似的问题不止是听过一两次了


  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值