can线上,这里只谈论can而不是canfd。 can线上,只能发送一帧数据。然后再发送下一帧数据。

什么是一帧数据?
就是有108个bit位。 假如是500K的位速率,则108个bit,则至少含义216us的时间,在示波器上,如果抓取数据,那么会发现有时候不仅仅有216us。

先回答第一个问题,为什么是108个bit?
因为有起始位1 bit,
11位id,占两个比特。
数据长度,占4个bit。
rtr位,Exd位,r0保留位。
64个比特的数据。
校验位16位。
两个比特的ack位.
还有7个比特的结束位。

为什么至少是108个bit,有时候可能是109,或者更多的比特呢?
因为:专业术语,叫做位填充。 can线上,接收端需要比特定时,根据如果是连续5个相同的逻辑0,那么就插入一个逻辑1,然后紧紧跟着后面的信息。我有次用示波器观察信号,因为我发送的8个字节的数据都是00 。然后观察到的信号,竟然有毛刺,很规则的毛刺,这个毛刺就是脉冲。我一看,不对啊,我发送的都是0,在示波器上应该看到一段时间的低电平才对,为什么这么有规律,每个脉冲之间的间隔还很均匀。后来经过搜索,才知道这些就是位填充导致的。

用示波器,调试的时候,canH要接示波器的信号线,canL要接示波器的地。 这样的目的是, 方便查看数据。 会看到第一个负脉冲总是起始位。然后后面跟着的就是11位id(如果是iso15765), 直接读即可,高电平,翻译成1 ,低电平翻译成0 ,就得到了这帧数据上面的所有信息。

调试can程序,一般不需要示波器,常常用到CAN总线监控仪。 这个也没多少钱,估计网上卖的就是好几百块钱,的样子。USBCAN不知道哪个厂家出的,比较好用,它可以监控can总线行的所有ECU发出的帧。 而且发出的时间点也能清晰的记录下来,单位是毫秒。 能反应前后帧之间的间隔。因为can总线是串行总线,它不是发的帧早了点,就是晚了点,可以调节帧发送的间隔,来达到两个节点通讯的目的。尤其是流控帧,有的流控帧发送的是30 00 0A这表示帧间隔是10毫秒,如果你不按照这个10毫秒的间隔时间,来发送帧。而是5毫秒,那么对方是不会接收。你发的多帧的信息的,因此也不可能接收到对方节点的正常响应。流控也是容易出错的地方。