一个晴朗的晴天,需要一种廉价的CAN到以太网接口转换器。 当然,搜索是从现成的解决方案开始的,但是,经常发生的是,最终决定开发自己的样本。 自然,作者的热情无法抗拒,并将自己局限于这种“被截断的”功能。 结果如何,如何以及为什么-被削减。
概述。 上面的照片显示了我使用CAD Altium Designer开发的电路板的3D模型。 关键特性和功能:
- 10 \ 100 Mb以太网
- Rtc
- MicroSD(FAT12,FAT16,FAT32)4GB
- RS232 \ RS485
- 可以
- 蜂鸣器
- 3个用户LED
- 通用输入输出
- EEPROM 32 KB
- 闪存2 MB
- I2C
- SPI
- 串口
- SW \ JTAG
- USB串行(COM端口)
- 电源:miniUSB 5V \外部9..24V
收集到的板的成本约为5000R。该项目本质上是开源的,其资源可以在
github上找到。 最后的结果,除主要功能外,可以认为是与STM32微控制器一起工作的良好调试板。
现在到创建的细节。
硬体
对这一问题的研究始于对现成解决方案的搜索和评估。 主要要求是:
- 将传入的CAN2.0B帧转换为TCP \ IP数据包,反之亦然;
- 结果,实现了基于微控制器的设备的低成本。
来自中国的同事有几种工业解决方案,但价格却不便宜,因此国内生产的PIRS CAN-以太网接口转换器的代表已送到我们的办公室进行测试。 根据所描述的功能和特性,该设备满足了适中的T.Z.要求,实际上,我只是用Wireshark和示波器武装来检查性能。 由于某种未知的原因,当在设备输出处向应该发送CAN帧的TCP设备发送数据包时,带有物理CAN级别(差分对)但逻辑UART接口协议(带有启动和停止位)的序列会吐出。 打开外壳,打开微电路的文档并敲响电路板的线路,我发现确实确实将微控制器的RX和TX(UART)引脚连接到CAN收发器,并从其连接到外部连接器。 因此,不能期望对CAN2.0B标准的硬件支持。
这是我通过TCP \ IP发送两个字节的数据[
0xF0 ]和[
0x0A ]时在“ PIRS CAN-Ethernet”的CANL输出上看到的内容:

位的顺序是颠倒的,但是您可以通过编程方式进行处理,但是在应用程序级别通过每个字节的开始和停止位来完成某些操作已经变得更加困难,因为 它们被插入硬件中。
这是具有相同两个字节数据的“真实” CAN2.0B帧的外观:

从波形图中可以看出,除了数据字节以外,该帧还包含协议的许多服务位以及填充位,最重要的是,它们连续运行而没有任何起始位和停止位! (对于那些感兴趣的人,请在扰流板下对此包进行详细说明)。
扰流板
前4个字节是帧标识符。 您可以从
[1]了解更多有关CAN格式的信息。
因此,我无法用软件方法解决CAN和UART框架不兼容的问题,并且以令人失望的眼光看待中间研究结果,因此决定开发所需设备的我们自己的原型。
由于现在可以控制该设备的更广泛的技术特性,因此增加了以下要求:
3.能够在运输系统中从12-24 V供电;
4.存在用于存储日志的外部存储器;
5.单板尺寸不大于86x80mm。
6.工作温度范围-40..85°
臭名昭著的
STM32F407VET6平台
[2]被选为新设备的大脑,它具有对所有必需接口的硬件支持,并提供大量RAM和FLASH存储器。 经过完善的互联网,
DP83848IVV收发器
[3]被选为PHY以太网,在我看来,它具有完善的文档以及足够的连接和路由方案示例。 作为用于存储日志的外部非易失性存储器,我选择了SPI FLASH 2 MB和SPI EEPROM用于存储各种设置。 另外,增加了针对过压,极性反转的电源保护。 在N个晚上和M个周末之后,编制了第一版设备的电路图和印刷电路板的迹线。 因为 板上有足够的空间,但是我不想留下闲置的MK腿,除了主要功能外,还添加了板子:
- 调试工具SW,JTAG;
- 8-DIP开关;
- 微型USB(USB串行);
- RS-232;
- 串口
- I2C;
- 通用输入输出
想法是,如有必要,开发板已准备好通过安装其他组件来扩展功能。 而且,备用座椅不影响生产成本。 不幸的是,一方面,由于这个原因,不可能适合所有的东西,因此木板最小为86x80mm。 轨道宽度0.25mm,最小孔直径0.6mm。
PCB设计的第一个版本之后,订购了两个测试样品,并与一整套外围设备组装在一起进行研究。 为了节省金钱,该板没有掩膜,因此具有这种不常见的颜色。

在STM32CubeMX的帮助下,我绘制了一个测试固件,以测试该设备的主要外围模块的可操作性,并且作为一个近似值,除了从外部8 MHz石英发射MK之外,所有工作都可以进行。 事实证明,由于我在起草规格书时的错误,焊接了错误的负载电容器。 但这并不能阻止STM32F407与内部RC发生器一起工作。 当我能够ping我的设备时,就没有束缚的喜悦。 我花了最长的PHY以太网跟踪。 然后,在浏览器中,我看到了我的测试http页面,并通过测试冷静下来。
在泽列诺格勒订购了第一批木板样品。 而且,尽管“带”掩模和“不带”的成本几乎相差两倍,但即使在原型阶段,我也不建议这样做,因为通常在此阶段会弹出跟踪错误,并且会发生某些情况焊锡。 但是,要在“光秃秃的”轨道上喝醉是极其不愉快的,既省钱,又几乎没有神经。 是的,然后猜测某个地方是否有短暂的休息或走线不正确-真是高兴。 由于我的经验不足,我焊接了一个石英谐振器和负载电容器,因此杀死了一个样品。
到那时,在工作中,垃圾箱中有一块铁能够解决当前项目中的转换任务,但是,除了体积大,成本高之外,还为它编写了固件,但我遇到了与RAM大小和TCP \ IP MK堆栈的截断功能有关的问题。 LPC2368。 因此,使您的设备变得越来越强烈的愿望。
在仔细研究了第一个版本的缺点之后,我三思而后行,进入了第二个版本。 再一次,我想添加一个“未来的积压”,将以下组件合并到以前的尺寸中:
- 带有电池的RTC支持;
- RS-485;
- 微型SD;
- 蜂鸣器高音;
- 通过USB供电的能力;
- SPI至外部连接器;
- 外部连接器的5V和3.3V电源。
除其他外,用户连接器上还增加了电流电源保护和TVS二极管。
结果是一种可以连接外部模块的开发板。 这次我在中国订购了一个董事会。 组装是和我们一起进行的。

董事会第二版对于第二个版本,我发现了Altium Designer中的3D建模,这在很大程度上避免了组件在两侧的相对位置中的错误(事实证明,互联网已经有很多现成的SMD组件模型
[4] )。 因此,第一版中的所有错误均已修复,创新之处在于其效率,这让我感到非常高兴。
韧体
代码的描述超出了本部分的范围,但是我想对软件组件说几句话。 在我的设备中,我决定使用FreeRTOS + LwIP堆栈。 关于它们的文章足够多,例如
[5]和
[6] ,因此将它们与您的项目联系起来并不难。 简而言之,LwIP是用于嵌入式系统的TCP \ IP堆栈,其特征在于低RAM消耗和便捷的API(甚至还有BCD套接字外壳)。 我使用了netconn API。 通过FreeRTOS,TCP \ IP堆栈的所有工作都放置在与应用程序分开的流中。 除了主要工作(将外部TCP服务器连接到CAN总线)之外,一个单独的Web服务器还在独立的流中旋转以访问设备设置。 这种Web界面旨在监视和配置设备设置-设置不同的操作模式,传输速度,地址等。 我尚不知道是否可以通过它进行固件更新。
结论
这是我第一个(但我希望不是最后一个)如此复杂的硬件项目,尽管犯了错误,但我认为该板的第二个版本可以认为是成功的。 在每次迭代中,都有很多疑问,但是,尽管如此,我再次确信,如果您不尝试,肯定不会有任何结果。
使用的来源
1.
Wikipedia / Controller_Area_Network2.
STM32F407VET6数据表3.
DP83848数据表4.
3D模型5.
FreeRTOS简介6.
LwIP简介