一根I/O脚怎么进行两个CPU之间的通讯?


答:我的仿真机只占用用户的一个I/O脚,即P3.5(T1).两个CPU之间通过这个I/O脚进行数据通讯.通讯是半双工的.在33兆的晶振频率时,通讯速率约为120kbps.20个机器周期可以传输一个bit.

两个CPU可以使用不同的晶振频率,主CPU会自动适应用户CPU的传输速率.

主机如何适应用户CPU的传输速率?用户CPU的晶振改变之后,传输速率也跟着变化,主CPU必须知道对方使用的频率才有可能适应它.在上电之后,用户CPU向主CPU发送一串固定长度的方波,高电平为10个机器周期(用户CPU),低电平也是10个机器周期.

主CPU通过测定方波的脉冲宽度,就可以知道对方的晶振的频率.(不是精确测定)

在接下来的通讯过程会使用合适的速率与之通讯.

用一条引脚如何传输数据?我们规定以下两种波形代表0和1,传输一个位:

使用不同的占空比来代表要传输的2进制位0或1.对方检测到由高到低的跳变之后,延时一个固定的时间后对数据线进行采样.采样的结果分别为0和1.

能够在线上传输一个位是不够的.我们规定传输的数据帧的格式为:

总线控制 数据类型 数据  
1位 1位 8位  

总线控制位为0时,用户CPU发送数据,主CPU接收数据.

总线控制位为1时,用户CPU接收数据,主CPU发送数据.总线控制位是由用户CPU发出的.

数据类型表明后面的数据是什么类型,数据类型位为1时,表示这是一个命令,数据类型位为0时,表示这是一组数据.命令主要用来控制用,主CPU和用户CPU之间通过发送命令来执行一些操作.最多支持255条不同的命令.

在进行两个CPU之间的通讯之前,必须取得两个CPU之间的位同步.两者之间的同步是通过用户CPU发送一同步帧来实现:

同步帧由4个 7EH(二进制为01111110)的命令和一个81H(二进制为10000001)的命令组成.

总线控制 数据类型 数据 总线控制 数据类型 数据 总线控制 数据类型 数据 总线控制 数据类型 数据 总线控制 数据类型 数据  
0 1 7E 0 1 7E 0 1 7E 0 1 7E 0 1 81  

总线控制为0,表示用户CPU发出数据,数据类型为1,表示是命令,7E和81是数据.

81表明同步码结束,主CPU通过检测到连续3个7EH和1个81H时取得数据同步.

从用户程序返回到监控系统后,用户CPU向主CPU发送同步码,以取得数据同步.主CPU只有检测到同步码时才会跟用户CPU通讯,否则认为用户CPU还在执行用户的程序(例如用户程序在全速运行).

在正常的数据通讯时,主CPU收到一帧数据,将会拉低数据线,表示busy.当主CPU处理完该数据之后才将数据线变高.在数据线被拉低的时候,用户CPU将等待,直到数据线变高时才继续进行传输.

这个协议包含了自动速率适应,数据流同步,流控(Busy),命令传输,数据传输.

而且能够做到较高的传输速率(100kbps以上).这是版主的精心设计.单线传输技术对读者也许有用.