我可以给你一个思路,供你参考:
1:两个(或多个)单片机中,各自提供一个 I/O 口作为通讯用,在此公用端接一个上拉电阻。
2:通讯端口空闲时置为输入状态,通讯期间,高电平由外部的上拉电阻提供(端口仍置为输入状态),低电平时,端口转为输出状态,且设置为低电平。这是用于模仿“线与”,防止端口间电流短路。
3:所有单片机中有一个作为主机,用于发布指令,协调通讯。其它单片机(从机)不准主动发起通讯,除非被主机指定为“讲者”(象不象 USB)。
4:主从机间的通讯中,物理层协议是相同的,下面简要说明一下:
A:通讯以帧为单位,一帧可以包含多个字节的数据,这里以 8 个字节为例。
B:通讯发起方拉低总线 1600uS,发出帧起位,数据接收方收到此标志,表示一个新的数据帧将开始。
C:待发送的数据存在发送缓冲区中(一般是一个数组),发送时从第 1 个字节开始,至第 8 个字节。每一个字节从高位开始发送。共 64 位数据。
D:发送时,数据 0 由 400uS 的低电平和 800uS 的高电平组成;数据 1 由 800uS 的低电平和 400uS 的高电平组成。
E:一个数据帧的持续时间为 1600 + (400 + 800)* 64 = 78400uS,大约为 80mS,最少可以保证每 100mS 完成一次通讯,如果是双向通讯,可以保证每秒完成 5 次双向通讯。
F:发送完成后,发送方应置发送端口为输入状态,以释放总线。
5:通讯中的 8 个数据是透明的,协议设计者可以任意设定,如果是比较重要的通讯或环境干扰比较大的场合,可在最后一个或两个字节设置为校验数据(如校验和或 CRC)。剩下的字节用于传输控制数据或普通数据,具体内容由协议制定者裁决。
注意:
一定要注意第 3 点,对于双机通讯,从机不能主动发送数据,一定要等到主机发送完成后,才可以向总线传输数据;如果是多机通讯,则必须被主机指定为“发言者”的从机才可以向总线传输数据。
这个协议只适合数据量较少的通讯环境中,如果单片机的时钟足够高或任务不繁忙,上述时间值可按比例适当减少,以提高通讯速率。
|