所谓单线通信,其实还是需要两根导线,否则形不成电流回路。这里的意思是,共用CPU电源线完成信号的传递,而不需要单独的信号线。
两根线,既要给CPU供电,又要传递信号,供电电压需要稳定,信号电压需要交变,看起来是矛盾的。
解决方法无非是折中:供电电压稳定性做点牺牲,让信号调制上来,再加一个低通滤波器将其消除;信号的调制方法做点让步,尽量减少对电源的影响,借用电源通道传输,再加一个高通滤波器将信号提取出来。在电力线上传输信号已经是成熟技术,在此我不想讨论,我只想做一个简单的方案,能够使CPU之间以不太低的速率可靠传输数据即可。
方案如图所示。
1.DC是供电电源,L1是电感,GND和COM是公用线,既给CPU供电,又供CPU间传递信号。
2.C1是滤波电容,储存电能给CPU供电。
3.D2有两个作用,一是截止作用:当COM线上的电位由高变低时,C1上的电能不会回灌到COM;二是导通作用:当COM线上的电位由低变高时,L1上会感应出高电压,导致COM线电位高于C1电位,D2起到泄压作用。
4.D1的作用是防止多个CPU同时发送数据时造成电流短路。
原理:
没有数据发送时,COM线高电平;有CPU发送数据时,COM线电平随发送CPU的Tx信号高低变化,因为所有Rx(包括发送CPU的)都连在一起,因此都可以接收到该数据,这样就完成了数据的发送与接收。
通信协议可以自定义,我提出两个例子。
协议1:主从协议
只有一个CPU做主,其余都是从,所有通信都由主CPU发起,其余只能被动应答。通信过程分三步:1)主CPU发送命令,2)从CPU回应数据,3
)主CPU回应ACK。或,1)主CPU发送命令,2)主CPU发送数据,3)从CPU回应ACK。
命令格式:2字节同步码+1字节标记码+1字节从CPU地址码+1字节命令码+2字节参数码+1字节CRC校验码
数据格式:2字节同步码+1字节标记码+1字节数据长度码+N字节数据+1字节CRC校验码
ACK格式:2字节同步码+1字节标记码+1字节回应码(0x55表示接收正确,否则失败)+1字节CRC校验码
侦错与纠错机制:靠同步码进行帧同步,靠CRC校验码进行帧检错,接收方发现错误丢弃错误帧,发送方等待数据超时重发,连续重发3次失败,放弃发送。
协议2:竞争协议
借用以太网的机制,每个CPU都是平等地位,都可以随时发送数据。步骤如下,当任何一个CPU想发送数据时,
1)探听COM线1ms时间,之内若无数据接收,则转2),否则继续探听。
2)向COM线发送数据,同时接收回来,一旦发现接收数据和发送数据不相同,则转3),否则一直发送数据直到数据发送完毕,返回。
3)停止发送,等待一个随机时间Nms,转1)。
发送数据格式:2字节同步码+1字节源CPU地址码+1字节目的CPU地址码+1字节数据长度码+N字节数据+1字节CRC校验码
侦错与纠错机制:靠同步码进行帧同步,靠CRC校验码进行帧检错,靠高层协议进行纠错,高层协议略。
疑问解答:发送数据时Tx变成低电平,电源岂不对地短路啦?
如果不接电感L1,COM又接地,确实会发生电源对地短路,但是接了L1后就不会了,COM接地相当于此时电源只接了L1一个负载,电源消耗的
电能随着L1电流增加变成了储存在L1中的磁能,当COM又变回高电平时,这部分磁场能量会随着D2的泄压作用转移到电容C1中,变成电场能量,
最终被CPU消耗掉,是不是和升压DC-DC有点像?因此可以预期在通信期间,CPU供电电压(即C1电压)会有所升高。
疑问解答:为何选择串口(Tx、Rx)作为数据收发口?
从原理上看,调制信号占空比应该越大越好,占空比越大,每个周期内低电平时间相对越短,因DC-DC效应对CPU电源电压影响就越小;凡事不能走极端,占空比也不能太小,否则抗干扰能力就差了。
另外,通信速率也不宜太低,速率太低,造成发送1bit时COM线电平被拉低时间太长,L1电流过大,会造成L1储能饱和,电源效率降低。
因此,使用串口不是最好选择,串口信号调制占空比为‘1’100%可以,‘0’0%太小了;串口速率普遍较低,最高才115Kbps。但是,因为单片机上一般不集成有专门适用于我这个方案的硬件收发器,软件模拟或外挂CPLD又太麻烦,所以干脆用串口算了,硬件简单,成本还低,软件也不复杂,直接操作串口就行了。
初步做过实验,L1取100uH-1mH,D1D2取1N5819,C1取220uF电解电容,速率在100Kbps-1Mbps,示波器看COM线波形良好。
这个目前有专用的芯片,国产的和进口的都有,这个东西的原理与目前所推广的MBUS实质是一样的。