背景
我正在开发一个需要适度微控制器规格的项目:
- 8 个 12 位、10kHz ADC
- 1kB 内存
- 48-QFN 或更小的占位面积
- 20kbps 菊花链式抗噪和纠错通信协议
信号处理要求相当低,大部分可以输出到系统中的主处理器。前三个规格很容易满足,并且可以以不到 2 美元的数量完成。然而,通信将发生在一个非常电噪声的环境中,因此像 LIN 和 I2C 这样的易受噪声影响的网络已经不存在了。反对 LIN 的另一个论点是,我希望在 5V 或 3.3V 下运行整个设备,而 LIN 收发器需要 12V,因此每个传感器板都需要额外的稳压器或电线。我最初选择 CAN 来完成这项任务。然而,CAN 控制器增加了相当大的成本,我很好奇这是否可以在软件中完成。
CAN物理层
CAN 规范定义了 OSI 网络参考模型的数据链路和物理层。许多廉价的 8 引脚 IC,例如NXP TJA1040/50、Maxim MAX3058/59、Microchip MCP2551和TI SN65HVD1050用于实现物理层。使用 D/A 转换器或运算放大器实现物理层即使不是不可能,也很困难,因此这些 IC 非常值得 1 美元左右的成本。
CAN 数据链路/协议层
对于数据链路层,一些微控制器将 CAN 协议模块添加到基本的 UART、I2C 和 SPI 通信层。然而,这些芯片比基本芯片贵得多。
CAN协议模块成本调查
为了证实这一说法,这里有一些流行的 CAN 和非 CAN 版本的 micros,来自:
- ATmega16 - ATMEGA16M1(带 CAN):3.87 美元,ATMEGA168A(无 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 规范?如果是这样,是否存在任何开源实现?
或者,CAN 收发器可以与 UART 一起使用来实现自定义协议吗?我可以使用单主拓扑;我知道在自定义协议中很难进行仲裁。