1. 为什么需要自定义双线通信协议
最近我在做一个嵌入式项目,遇到了一个很实际的问题:手头有两块不同的MCU开发板,一块是STM32F103C8T6,另一块是国产的SWM341。这两块板子需要通信,但可用的IO口非常有限,而且硬件外设不兼容。STM32板子没有串口转TTL电路,无法直接连接电脑调试,而SWM341的剩余IO都是SPI映射,不是串口。
这种情况在嵌入式开发中太常见了。你可能也遇到过类似的问题:硬件资源受限,标准通信协议用不了,但又需要可靠的数据传输。传统的SPI、IIC、UART虽然稳定,但在资源受限或者硬件不匹配的场景下就显得力不从心了。
我当时想了几个方案:用IO模拟SPI、用硬件SPI控制器、用IO模拟串口,或者干脆自己定义一个轻量级的双线通信协议。前三种方案我都试过,但都有各自的问题。IO模拟SPI的从机模式太难实现,硬件SPI控制器因为芯片差异导致数据丢失,IO模拟串口又对时序要求太苛刻。
最后我选择自己设计一个轻量级的双线通信协议。这种协议借鉴了SPI和IIC的时序逻辑,但避开了硬件差异问题。它只需要两根普通的IO线,不需要任何额外的硬件外设,特别适合资源受限的嵌入式场景。
2. 常见通信协议的局限性
2.1 IO模拟SPI/IIC的问题
用IO模拟SPI或IIC的主机模式还算简单,我之前用这种方式驱动过W25Q64闪存和AT24C04 EEPROM。但模拟从机模式就是另外一回事了了。从机需要实时响应主机的时钟信号,对时序要求极其严格。
我查了很多资料,大家都说IO模拟从机模式太复杂且容易出错。确实如此,因为没有硬件控制器来保证时序同步,完全靠软件延时来匹配时序,稍微有点偏差就会导致数据错误。在STM32和SWM341这种主频不同的芯片之间,这个问题更加明显。
2.2 硬件控制器的兼容性问题
硬件SPI控制器听起来很靠谱,对吧?我一开始也是这么想的。我配置了STM32为主机,SWM341为从机,使用了硬件SPI控制器。数据确实能传过去,但总是丢失部分数据。
我发送"ABCD"四个字符,接收端可能只能收到"AC"或者"BD",完全随机。调试了很久才



被折叠的 条评论
为什么被折叠?



