在软件中实现CAN协议层


12

背景

我正在开发一个项目,该项目将需要以下微控制器规格:

  • 8个12位10kHz ADC
  • 1kB的RAM
  • 48-QFN或更小尺寸
  • 20kbps菊花链式抗噪和纠错通信协议

信号处理要求相当低,并且大多数可以导出到系统中的主处理器。前三个规格易于满足,并且批量购买不到2美元。但是,通信将在非常嘈杂的环境中进行,因此像LIN和I2C这样的易受噪声影响的网络就不存在了。反对LIN的另一个论点是,我想将整个器件以5V或3.3V运行,而LIN收发器需要12V,因此每块传感器板需要额外的稳压器或导线。我最初选择CAN来完成此任务。但是,CAN控制器会增加可观的成本,我很好奇这是否可以通过软件完成。

CAN物理层

CAN规范定义了OSI网络参考模型的数据链路和物理层。存在许多廉价的8引脚IC,例如NXP TJA1040 / 50Maxim MAX3058 / 59Microchip MCP2551TI SN65HVD1050,以实现物理层。如果不是不可能的话,使用D / A转换器或运算放大器来实现物理层将很困难,因此这些IC的成本仅为1美元左右。

CAN数据链路/协议层

对于数据链路层,一些微控制器将CAN协议模块添加到基本UART,I2C和SPI通信层上。但是,它们比基本芯片贵得多。

CAN协议模块成本调查

为了证实这一说法,以下是一些流行的微型和微型CAN版本:

  • ATmega16-ATMEGA16M1(with CAN):$ 3.87,ATMEGA168A(no CAN):$ 3.23
  • dsPIC-DSPIC33FJ64MC802(带CAN):$ 6.14,DSPIC33FJ64GP202(无CAN):$ 5.48
  • PIC18-PIC18F2480(具有CAN):$ 6.80,PIC18F24J10(无CAN):$ 2.10
  • Cortex-M3-STM32F103C4T6A(含CAN):6.50美元,STM32F100C4T6B(无CAN):2.73美元

公平地讲,我只比较了具有相同内存大小的微控制器,但是,许多非CAN版本都可以使用较小的内存来实现。外部CAN控制器(如Microchip MCP2515)几乎为2美元,因此,如果您愿意的话,将CAN集成到微控制器中显然更具成本效益。

有趣的是,ATmega部分是Digikey库存中最便宜的配备CAN的部分。

CAN协议层的功能

dsPIC单片机中的CAN模块具有以下功能:

CAN总线模块由协议引擎和消息缓冲/控制组成。CAN协议引擎处理所有用于在CAN总线上接收和传输消息的功能。通过首先加载适当的数据寄存器来发送消息。可以通过读取相应的寄存器来检查状态和错误。检查在CAN总线上检测到的任何消息是否有错误,然后与过滤器进行匹配,以查看是否应接收该消息并将其存储在接收寄存器之一中。

这在软件中似乎相当可行。

问题

是否可以使用软件协议层仅通过廉价的配备UART的微控制器和CAN收发器来实现CAN规范?如果是这样,是否存在任何开源实现?

或者,可以将收发器与UART一起使用以实现自定义协议吗?我可以使用单主机拓扑;我了解,很难在自定义协议中进行仲裁。


CAN也是12v的,因为它是为汽车使用而开发的。
肯尼,

@Kenny-上述收发器上使用的电压电平为5V。
凯文·维米尔

如果您打算考虑STM32F系列,我是否也可以建议该NXP部分?它是Cortex-M0内核。search.digikey.com/scripts/DkSearch/…–
乔恩·L

@Jon-不一定要考虑这些因素,M0会是此用例的理想选择-但是,考虑到Nuvoton M052LAN的零件也是Cortex-M0,并且价格大约是批量价格的一半(1.21美元对2.35美元),但是没有CAN模块。这种价格差异是我的动力。
凯文·维米尔

您可能还需要考虑运营评级。对于非CAN变体,大多数具有CAN支持的零件将是工业或汽车与商业的对比。
标记

Answers:


11

我认为仅在固件中实现CAN协议将很困难,并且需要一段时间才能正确完成。这不是一个好主意。

但是,您的价格很高。我刚刚检查了一下,采用QFN封装的dsPIC 33FJ64GP802在microchipdirect上的价格为3.68美元(千片)。对于实际产量,价格会更低。

硬件CAN外设可以为您做一些实际的事情,其价格上涨远不如您所声称的那样。

添加:

由于您似乎已确定要尝试固件路由,因此以下是一些显而易见的问题。我很可能还没有出现其他问题。

您想以20 kbit / s的速度进行CAN。对于CAN来说,这是一个非常慢的速率,在至少十米的时间内,其速率高达1Mbit / s。为了给您一个数据点,NMEA 2000船上信令标准在CAN上以200 kbits / s的速率分层,这意味着从大型船的一端到另一端。

您可能会认为,您需要的只是每位中断一个,并且您可以执行该中断中需要执行的所有操作。这是行不通的,因为在每个CAN位时间内都有几件事发生。在子位级别上特别需要做两件事。第一个是检测冲突,第二个是即时调整比特率。

CAN总线上有两种信号状态,即隐性和显性。隐性是什么都没有驱动公交时发生的情况。两条线的总和为60。由MCP2551等通用芯片实现的普通CAN总线两端应具有120Ω终结器,因此,总共60Ω的电阻将两条差分线无源地拉在一起。主导状态是两条线被主动拉开时,如果我没记错的话,它距隐性状态大约900mV。基本上,这类似于集电极开路总线,不同之处在于它是通过差分对实现的。如果CANH-CANL <900mV,则总线处于隐性状态;当CANH-CANL> 900mV时,总线处于显性状态。显性状态信号为0,隐性信号为1。

每当节点向总线“写入” 1(放开)时,它都会检查其他节点是否正在写入0。当您发现总线处于显性状态(0)时,就认为您正在发送,并且您要发送的当前比特为1,则表示其他人也在发送。冲突仅在两个发送者不同意时才重要,并且规则是发送隐性状态的发送者退回并中止其消息。发送主导状态的节点甚至都不知道发生了这种情况。这就是在CAN总线上进行仲裁的方式。

CAN总线仲裁规则意味着您必须在发送途中的每一位都以1的方式观察总线,以确保其他人未发送0。此检查通常在位的2/3左右进行是CAN总线长度的基本限制。比特率越慢,最坏情况下从总线的一端传播到另一端的时间就越多,因此总线可能越长。必须在您认为拥有总线并发送1位的所有位置进行此检查。

另一个问题是比特率调整。与RS-232相比,总线上的所有节点都必须就比特率达成一致。为了防止微小的时钟差异累积成明显的错误,每个节点必须能够执行比其标称值更长或更短的位。在硬件中,这是通过运行比比特率快9到20倍的时钟来实现的。此快速时钟的周期称为时间量子。有一些方法可以检测到新位的开始是否在您认为应该出现的位置上。然后,硬件实现会稍微增加或跳过一次时间量以重新同步。只要您可以调整期望的比特时间与实际测量的比特时间之间的相位差,您就有其他方法可以实现此目的。

无论哪种方式,这些机制都需要在一秒钟内的不同时间完成各种事情。这种时序在固件中将变得非常棘手,或者将要求总线运行非常缓慢。假设您以20 kbits / s的速度在固件中实现了时间量子系统。每位最少有9个时间量子,则需要180 kHz中断。诸如dsPIC 33F之类的东西当然可以实现,但会消耗掉处理器的很大一部分。以最大40 MHz的指令速率,每个中断可获得222个指令周期。不需要花费那么长的时间来完成所有检查,而是大概需要50-100个周期,这意味着25-50%的处理器将用于CAN,并且它将需要抢占其他所有正在运行的处理器。这会阻止这些处理器经常运行的许多应用程序,例如通过开关电源或电动机驱动器的逐脉冲控制。对于我使用此类芯片完成的许多操作,每隔一个中断的50-100个周期的延迟将是一个完整的显示停止器。

因此,您将花费这些钱以某种方式进行CAN。如果不在专用于此目的的专用硬件外设中,则需要使用更大的处理器来处理大量固件开销,然后应对其他所有事物的无法预测的和可能的大中断延迟。

然后是前期工程。CAN外设工作正常。根据您的评论,该外设的增量成本似乎为$ 0.56。对我来说,这似乎很划算。除非您有非常大量的产品,否则您将无法收回仅在固件中实施CAN所花费的大量时间和金钱。如果您的数量如此之高,那么我们一直提到的价格将不现实,并且添加CAN硬件的差异将更低。

我真的觉得这没有道理。


我很珍惜您的意见,但对于为什么没人尝试解决这些困难感到好奇-每个项目都会遇到这些问题!如果最终尝试尝试,结果会告诉您。
凯文·维米尔

数量为1000时,我发现来自microchipdirect的dsPIC33FJ64GP202的价格为3.12美元-总价值相差560美元!至少值得尝试。我每次报价只是每个的价格,因为它,而无需担心晕晕的,标准包装数量等是容易得到的单件数
凯文·维米尔

2
@Kevin,低数量价格并不总是与高数量价格成正比。我不知道您打算制造多少这样的东西,但是560美元将不会开始为在固件中进行CAN的工程支付费用。我将在可能回答的问题上加些解释,您将遇到的一些困难。
奥林·拉斯洛普

WTF !?我只是在回答中添加了一些内容,大部分段落中断都消失了。有肯定在编辑窗口,我在打字的空行。
奥林莱思罗普

1
答案是可以的,但我在这里完全同意奥林。我实际上在这个领域全职工作。我使用dsPIC33FJ256芯片。花时间让事情写成比特爆炸的方法,这剥夺了由硬件为您完成并重新发明轮子的成本优势。更不用说您在硬件上所做的任何事情都需要在所有事情上精心计划。另外,我想知道您是否正在寻找其他更高级别的协议,例如ISO14229或OSEK / Autosar NetworkManagement的需求?
埃里克M

2

我们使用PIC18F25K80。它没有DSP,但数量约为2美元。它几乎是您提到的PIC18F2480的直接替代品。我们将CCS编译器及其软件堆栈用于CAN,这可能是从Microchip移植的。它非常适合我需要和尝试的一切。


没有搜索ECAN。Microchip的名字很傻,但是下次我将不得不仔细阅读!就像我说的那样,我的信号处理需求很低,所以我认为我不需要真正的DSP。
凯文·维米尔

2

如果我没看错,这听起来好像您想仅使用UART和一些精巧的固件来对CAN功能进行位冲击。相信我,这将永远行不通-我建议您阅读有关CAN或CANopen复杂性的好文章。通过这条路线,您将消除正在寻找的任何成本节省。

我要么使用一个微控制器与CAN模块并通过对额外的$ 2,你有没有想过一个不同的协议,该协议是一个UART兼容,比如的ModbusRS-485


您没有看错。我已经阅读了有关CAN的Vector培训手册。看起来每个消息都需要对CRC进行一些预处理,但是数据包的其余部分应该相同,而我只需要继续检查接收行是否有冲突。确实看起来并不像人们想像的那么难,但是我一定会考虑您的建议。
凯文·维米尔

我确实喜欢Modbus over RS485的想法。看来,大多数收发器也是5V电源。我的印象是它需要像RS232这样的+/-输入电压。将不得不调查。
凯文·维米尔

一点敲打肯定会起作用!这并非像上面的Olin所说的那样琐碎,但是可以做到。我个人已经在PIC18F系列和dsPIC33系列单片机上实现了它。如果您真的想查看PIC18F源代码,我可以上载它。但是,我无法给出dsPIC的源代码,因为它是我正在从事的商业项目的一部分。在这两种情况下,我们都使用MCP2551,我也有LIN代码。LIN在协议层稍微简单一些,但是实现LIN调度却有点困难...
Eric M

1
@EricM-比特率是多少,您能够在软件中实现完整的CAN规范吗?我很乐意为此看到PIC18F代码。
Rocketmagnet 2012年

是的,实施了完整的CAN规范,以至于在dsPIC上不复制ECAN模块,因为它在很多方面都得到了照顾。在PIC18实施方案中,我对总线进行了完整的规范化修改,之后,该代码将在使用GPIO线的dsPIC上工作。我将在几天后通过代码链接进行更新。
Eric M

0

我也在考虑在PIC µC上对CAN协议进行位撞击,因此请EricM,如果您确实这样做,请回答并至少告诉您,您在PIC18F或DSPic的核心频率上获得了什么比特率。谢谢!

总的来说:RS 485是解决主要问题的解决方案,但是也可以使用具有非全双工UART通信(第2点)的CAN(甚至FlexRay)收发器作为所有协议使用NRZ编码。

但是在UART / V24 / RS232中,全双工通常是在没有详细考虑的情况下使用的,因此也许您需要在应用程序的超级循环或状态机上投入一些精力...

但是回到CAN-bitbanging:我在CAN上工作了很多年,从未见过bitbanging的实现,但是据我认为,这应该适用于用DSPic或ARM等现代µC对tp 100kBit进行位定时。 (具有80MHz或更高频率的内核...)

至少如果只考虑回读...发送将意味着准备位结构时会产生一些开销,因此无法实现100%的总线负载,但是在CAN中根本不会超过65%...


2
欢迎来到电气工程StackExchange。答案的第一部分根本不是一个答案,因此您要提出一个新问题。OP专门询问了有关CAN协议的软件实现的问题,您的答案似乎在不解决该问题的情况下徘徊。请尝试保持问题的主题。
Joe Hass
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.