在软件中实现CAN协议层
背景 我正在开发一个项目,该项目将需要以下微控制器规格: 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 / 50,Maxim MAX3058 / 59,Microchip MCP2551和TI 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一起使用以实现自定义协议吗?我可以使用单主机拓扑;我了解,很难在自定义协议中进行仲裁。