异步串行通讯,诸如RS232、RS485等以简单实用而众所周知。同步串行通讯以异步不可比拟的高速度而应用在许多速度要求较高的通讯网络。同步通信无需开始位和停止位,直接由同步时钟对数据采样,数据传输率等同于时钟速率。其显著特点就是两端必须共享同一时钟,发送方必须将时钟和数据同时发送,接收方才能正确采样。同步模式分为字节同步和位同步。国际标准化组织的HDLC(高级数据链路控制)协议是应用最普遍的同步协议,帧结构如表1所示,其中标志字节值为7EH。
Intel8274简介
Intel8274是实现HDLC同步通信协议的最佳接口芯片,图1是其管脚定义,有以下显著特点:
·有异步、字节同步和位同步工作模式;
·2个独立的、全双工的接收器和发送器;
·和许多CPU接口兼容;
·4个独立的DMA通道;
·波特率可达880K;
·异步模式下,具备通用串口的所有信号;
·在位同步时,自动产生并识别HDLC的开标志和关标志、自动进行零位插入和删除、自动为发送数据产生CRC校验码并自动对接收数据进行CRC校验、和CCITT的X.25兼容。
Intel8274的零位插入是为了把标志字节 7EH和正式数据中的7EH( 0111.1110B)区分开来。在发送一方,除标志字节之外的所有发送字节,每碰到有五个连续的“1”就自动插入一个“0”,从而保证了两个标志字节之间的其它字节没有7EH。在接收一方,接收到标志字节之后,每碰到字节中有五个连续的“1”后的一个“0”,将这个“0”删除掉,恢复字节原值。发送方和接收方的CRC校验都不包含这个额外插入的“0”和被删除的“0”。硬件实现时很容易用锁相环电路检测出标志字节,方便地判断同步数据帧的开始和结束。
系统硬件结构
Intel8274不仅性能优越,而且和各种CPU接口比较简单。基于该芯片的某机载雷达设计的同步通信系统如图2所示,整个系统采用二级CPU结构,将主CPU从烦琐的通讯管理中解放出来。主CPU和通讯CPU共享双口RAM,在此交换数据。主CPU只需将发送的同步数据帧填入发送缓冲区,由通讯CPU监控同步帧发送。当通讯CPU正确接收到完整的数据帧时直接放入接收缓冲区,然后通过中断通知主CPU取走即可。
硬件细化设计时应该注意:
·时钟
在图2中,Intel8274的工作时钟由3.6864MHz的时钟直接输入,而2个通道的发送时钟由8254对工作时钟进行分频后给出。这样可以由软件对8254进行设置,灵活配置出各种适当的波特率。特别注意,经过差分驱动的信号应包括发送时钟,而接收时钟应该和接收数据一起由外部提供。
·中断
同步通信不能使用查询的方法,只能使用中断驱动。必须把Intel8274的中断请求信号/INT(Pin28)和中断应答/INTA(Pin27)各自上拉10KW电阻,而将菊花链的中断输入/IPI(Pin29)接地。/INT未上拉时,Intel8274不能产生有效的低电平,CPU不可能响应中断。/INTA未上拉时Intel8274可能向的数据线输出中断向量,扰乱CPU工作。而/IPI未接地时Intel8274的中断请求有可能被抑制,时有时无,破坏系统的稳定性。
软件设计
通信软件主要使用TMS320的汇编语言实现,精华在于对Intel8274的中断处理上。软件初始化8274为同步模式时,应选择CCITT的CRC,而不是CRC-16。为准确简洁,我们采用最通用的算法描述语言。
同步数据帧发送算法
为了开始同步帧的发送,在所有情况下(包括DMA)都应该由CPU向8274写入第一个字符。在HDLC协议中,第一个字符就是接收站点的节点地址,而不是开标志。开、关标志由8274自动插入。
Const // 常量定义
DONE = ... // 表示发送或接收过程已结束
DONE; // 帧发送过程尚未结束,正在运行,
RxDone := NOT_DONE; // 帧接收过程尚未结束
Reset Tx Intterrupt; // 复位发送中断
Reset Tx CRC; // 复位CRC发生器。
Send Addr; // 发送帧地址,引爆帧发送开始。
Reset TxUnder-Run/EOM; // 立即复位下溢中断,保证正确产生CRC
{此后,帧发送的实际过程由中断完成,I8274硬件接口应该在规定的最大时间内应产生“下溢/帧结束”中断,否则发生错误,应复位8274 }
while not TimeOut do
begin
if TxDone = DONE then // 由中断过程设置 TxDone标志
begin
Wait CRC; // 等待CRC发送结束
Check TxResult; // 检查发送结果是否正确。
Exit;
end;
end;
Reset 8274; // 至此,则超时退出,发生错误,复位8274。
end;
Intel8274中断响应算法
HDLC协议的同步通讯必须由中断驱动,主要是同步通讯的协议和校验由硬件完成,软硬件必须配合得当。中断主要处理4类情况,一是利用“发送缓冲器空”中断来发送帧数据,二是用“外部状态变化”中断来判断帧发送结束,三是用“数据接收”中断来接收数据帧,四是用“接收到特殊条件”中断来判断帧接收的开始和结束。在使用多个接收帧缓冲时,中断处理要注意缓冲区切换正确。
procedure IntrruptTxRxFrame
begin
Read Interrpt Type; // 从8274读中断类型
case Interrpt Type of // 检查中断类型
1:Tx Empty: // “发送缓冲器空”中断
if 数据未发送完 then
Send One byte // 从发送缓冲区读取、并发送1字节
else
Reset Tx Empty Interrupt; // 复位此中断,迫使产生下溢中断;
2:External Status Chang // “外部状态变化”中断
if 是下溢中断 then
TxDone := DONE // 帧发送结束,结果正确
else begin
TxDone := DONE; // 帧发送结束
TxResult := FAIL; // 但结果不正确
end;
3:RxChar // “接收到帧数据字符”
读入并存到接收帧缓冲区;
4:RxSpecial: // "接收到特殊条件" 中断
if End of Frame then // 帧接收结束
RxDone := DONE // 接收过程完成,结果正确
else begin
RxDone := DONE // 接收过程完成
RxResult := FAIL; // 但结果不正确.
Reset Error Interrupt
end;
else // 其余中断忽略掉。
Ignore;
end;
Send EOI; // 发中断结束命令.
end;
结语
同步通讯技术在不断地发展,席卷全球的Internet网就是采用同步协议X..25连接了不同类型的计算机。同步通讯和异步通讯相对立而存在,相比较而发展。这里只是抛砖引玉,介绍了我们实际工作的一点体会和做法。同步通讯将向更高速率发展,应用在更多的日常电子设备中。