再上一篇:5.7.2 I2C 总线接口单元
上一篇:5.7.3 UART
主页
下一篇:5.7.5 USB 器件控制器
再下一篇:5.8 多媒体通讯器单元
文章列表

5.7.4 高速红外通讯接口 FICP

嵌入式系统(修订本)——Intel XScale 结构与开发 陈章龙 著

一、简介

FICP 工作于半双工方式,可直接与市售的IrDA 规定的LED 传送器相连。FICP 基 于4MHz IrDA 标准,使用四位置脉冲调制(4PPM)和IrDA 开发的专门串行包规程。 FICP 包括:

z 位编码/解码器。

z 串行至并行转换器。

z 一个128×8 位发送FIFO。

z 一个128×8 位接收FIFO。

FICP 与标准UART 共享发送和接收数据脚(IRTXD 和IRRXD),同时只能派一个 用途。为支持各种IrDA 传送器,发送和接收数据脚可分别设置为高或低有效。

二、FICP 操作
复位后禁止 FICP。软件在允许 FICP 前必须先设置控制寄存器。以后软件可装入 FICP 的发送 FIFO(最多为 128 字节),或让 FIFO 为空,在允许 FICP 后由 DMA 来服 务。在允许FICP 后,发送/接收数据发送至发送和接收脚上。

1. 4PPM 调制

发送/接收数据采用4PPM IrDA 标准进行调制。在4PPM 方式中,用一个128ns 光 脉冲置于四个时间段方式一次编码两位数据。这四个时间段称为片(Clip)。四个片构 成一个字节。

2. 帧格式

4Mbs 传送的帧格式见图5-20。

3. 地址场

图 5-20 4Mbs IrDA 帧格式
发送器使用8 位地址场指定一个接收器。地址可访问255 个站。0XFF 为广播地址, 用于向所有连结的站发送信息。
接收时,FICP 控制器寄存器1(ICCR1)置于编程唯一的接收地址。ICCR0 的AME
位决定地址符合功能。接收到的帧地址存放与接收FIFO 中。

4. 控制场

控制场为8 位,它由软件定义。FICP 不提供对控制字节的硬件解码支持。

5. 数据场

数据场可为0~2045 字节。软件必须决定数据的长度,如数据场不为8 位的倍数, 将产生中止。

6. CRC 场

FICP 使用 32 位循环冗余检验(CRC)来检测发送时的位错误。CRC 通过计算地 址、控制和数据得出,包括在每一帧中。发送和接收逻辑有分开的 CRC 发生器。在开 始发送或接收一帧前,CRC 计算逻辑置为全1。在进行比较或发送前,把结果取反。在 计算的CRC 值与接收的不相符时,与最后一个接收字节相关的CRC 出错位置位。如该 字节到达触发的范围,产生中断。

注意:与地址、数据场不同,32 位反向CRC 值发送和接收均为最高位在前。

CRC 计算公式为:

CRC(X)=X32+X26+X23+ X22+ X16+ X12+ X11+ X10+ X8+ X7+ X5+ X4+ X2+X+1

7. 接收操作

IrDA 标准中所有传送为半双工,故软件一次只应允许一个方向的传送。

在允许 FICP 时,接收器从接收数据脚检测输入的片。如没发现正确的引导码
(Preamble)时,时间段计数器跳过一个8MHz 周期。这称为搜索方式。它持续至发现 正确的引导码,这指示时间段计数器达到同步。引导码可重复 16 次或连续表示空闲发 送线。
在收到 16 个引导码后,接收开始标志。开始标志为 8 个片。如开始标志错,则产 生帧错,重新进入搜索方式。
在收到正确的开始标志后,每四个片编码为一个字节,写入5 字节的暂时FIFO 中。 在暂存FIFO 满,数据值一个接一个地传送至接收FIFO。帧的第一个数据字节为地址。 如允许地址符合比较,则把接收到的地址与 ICCR1 的地址符合值进行比较。如符合或 输入地址为全 1,所有后继数据字节,包括地址字节,存入接收 FIFO 中。如不符合, 不存入接收 FIFO,查找下一个引导码。如不允许接收地址符合,则帧的第一个数据字 节作为普通数据存放于FIFO 中。帧的第二个数据字节可包含控制场,由软件使用。 在接收FIFO 到达触发阀值,允许时可产生终中断和DMA 请求(数据无错误时)。如数 据不能足够快地读出以防止 FIFO 装满,可能产生溢出错误。如 FIFO 满,丢失所有后 继数据。FIFO 内容保持不变。
如数据场包含非法片(如 0011、1010、1110),帧中止,最老的暂存 FIFO 的字节 移入接收FIFO。丢失剩余的暂存FIFO 中的数据,置位FIFO 的存放有效数据字节的帧 结束(EOF)标志,接收器开始搜索引导码。
接收逻辑继续搜索8 片结束标志。如发现结束标志,置接收FIFO 中最后字节位帧 的最后字节,使用暂存FIFO 中的数据位32 位CRC 值,并进行检验。如检验出错,则 置接收 FIFO 的最后字节为 CRC 错。帧的 CRC 不存放于接收 FIFO。如没正确收到结 束标志,则产生中止。
如软件在FICP 操作时禁止接收器,立即停止接收数据字节,清除串行移位器和接 收FIFO。

8. 发送操作

在允许 FICP 发送前,软件必须先向发送 FIFO 写入数据,或允许 FICP 由 CPU 或 DMA 来装入FIFO。在允许FICP 时,如FIFO 需要更多数据,发送逻辑产生服务请求。 在每一帧开头,至少发送16 个引导码。如在16 个引导码后,数据仍然未就绪,则再发 引导码,直至FIFO 底部有数据字节为止。
引导码后为开始标志和来自发送FIFO 的数据。数据字节编码为4 个片,装入串行 移位寄存器。它的值从发送数据脚由 8MHz 波特率时钟移位输出。引导码、开始、结 束标志、CRC 值自动发送。
在发送FIFO 有32 个更多空单元时,产生中断(允许时)和DMA 服务请求。在新 数据来不及写入时,可能引起下溢出(Overrun)。软件决定数据下溢出(缺乏数据)为 正常帧结束标志或不正常帧结束。
在软件选择下溢出为正常帧结束时,发送逻辑发送在所有帧数据传送时计算得出的

32 位CRC 值,最后发送结束标志,表示帧的结束。发送器然后连续发送引导码,直至

FIFO 再有数据,这时将开始下一帧的发送。 如软件选择下溢出为不正常帧结束,则发送中止信息,并向 CPU 发出中断。发送

器连续发中止,直至发送 FIFO 中再有数据。再有数据后,FICP 发送 16 个引导码和开 始标志,开始一个新的帧。
在每帧结束后,FICP 发送一个称为串行红外传送脉冲(SIP)。每 500ms 至少须发 一个 SIP,以保证低速器件(115.2Kps 或更低)不破坏高速传送。SIP 模拟引起使所有 低速器件在至少下一个500ms 内处于总线外的起始位。SIP 脉冲强制使发送数据脚为高

1.625us 和低7.375us(整个SIP 周期为9us)。在SIP 周期后,连续发引导码,以向片外 器件指出FICP 发送器处于空闲状态。发送引导码直至发送FIFO 中有新数据或禁止FICP 发送器。每 500ms 内应至少完成一个帧的传送,以保证能产生 SIP 使低速器件不中断 传送。最长的帧为16586 位,对4MHz,它仅需4ms 的传送时间。在第一次允许发送器 时,FICP 也发出SIP。这保证低速器件不影响FICP 发送数据。

9. 发送和接收 FIFO

发送 FIFO 为 128 单元深 8 位宽。接收 FIFO 为 128 单元深 11 位宽。接收 FIFO 使 用每单元的3 位作为标志位。发送FIFO 和接收FIFO 使用两个分开的专用DMA 请求。 在发送 FIFO 有 32 个或更多空单元时,产生发送 DMA 请求和中断(允许时),应用处 理机把更多数据写入 FIFO。在发送 FIFO 满时,将丢失处理机写入的多余数据。在接 收FIFO 到达触发阀值(编程入ICCR2),产生接收DMA 请求(无错误时)和中断(允 许时),告诉处理机从FIFO 中读走数据。如FIFO 触发范围内数据发生错误,禁止DMA 请求,产生中断以保证DMAC 不读入错误字节。
三、FICP 寄存器

FICP 共有6 个寄存器,见表5-30。

表 5-30 FICP 寄存器

地址

名称

描述

0x4080_0000

ICCR0

FICP 控制寄存器0

0x4080_0004

ICCR1

FICP 控制寄存器1

0x4080_0008

ICCR2

FICP 控制寄存器2

0x4080_000C

ICDR

FICP 数据寄存器

0x4080_0010

保留

0x4080_0014

ICSR0

FICP 状态寄存器0

0x4080_0018

ICSR1

FICP 状态寄存器1

1. FICP 控制寄存器 0 ICCR0


位31~8:保留。
位7:AME——地址符合允许。

0=禁止接收地址符合功能。在接收FIFO 中存放接收数据。

1=允许接收地址符合功能。仅在地址符合或位广播地址时才能把数据存入接收

FIFO。

位6:TIE——发送FIFO 中断允许。

0=禁止中断。

1=允许发送FIFO 服务请求TFS 产生中断。

位5:RIE——接收FIFO 中断允许。

0=禁止中断。

1=允许接收FIFO 服务请求RFS 产生中断。 位4:RXE——接收器允许。

0=禁止FICP 接收逻辑。

1=允许FICP 接收逻辑。 位3:TXE——发送器允许。

0=禁止FICP 发送逻辑。

1=允许FICP 发送逻辑。

位2:TUS——发送FIFO 下溢出选择。

0=发送FIFO 下溢出引起发送CPC、结束标志和SIP。

1=发送FIFO 下溢出引起发送中止,并产生中断。 位1:LBM——反馈方式。

0=允许正常FICP 操作。

1=发送串行移位器输出连至接收移位器输入。 位0:ITR——IrDA 传送。

0=禁止FICP 单元。

1=允许FICP 单元。

2. FICP 控制寄存器 1 ICCR1

ICCR1 为 32 位寄存器,仅低 8 位有效,存放 FICP 用于选择输入帧的 8 位地址符 合值。

3. FICP 控制寄存器 2 ICCR2


位31~4:保留。
位3:RXP——接收脚极性选择。

0=从接收数据脚来的数据取反后加至FICP 单元。

1=从接收数据脚来的数据直接加至FICP 单元。 位2:TXP——发送脚极性选择。

0=从FICP 来的数据取反后发送至发送数据脚。

1=从FICP 来的数据直接发送至发送数据脚。 位1、0:TRIG——接收FIFO 触发阀值。

00=在接收FIFO 有8 个或更多字节时产生FIFO 服务请求。

01=在接收FIFO 有16 个或更多字节时产生FIFO 服务请求。

10=在接收FIFO 有32 个或更多字节时产生FIFO 服务请求。

11=保留。

4. FICP 数据寄存器 ICDR

ICDR 是一个32 位寄存器,写入时它的低8 位为发送FIFP 的顶部单元;读出时为 接收FIFO 的底部单元。

在 8 位数据进入接收 FIFO 的顶部时,位 10~8 用于指示接收该数据发生的条件标 志。这些标志与数据一起写入 FIFO。在数据到达接收 FIFO 的底部时,与它对应的标 志位8 传至帧结束(EOF)标志,位9 传至CRC 错误(CRE)标志,位10 传至接收器 溢出(ROR)标志。所有这些标志在 FICP 状态寄存器 1 种。可读出他们决定 FIFO 底 部的数据是否为帧的最后字节或接收时是否发生错误。在检查这些标志后,可通过读出 ICDR 访问接收FIFO 底部单元的低8 位。这使接收FIFO 的下一个单元传送至底部单元, 而它的EOF、CRE 和ROR 传送至状态寄存器。
在接收 FIFO 底部 8、16 或 32 单元(由触发阀值决定)中任何一个标志置位时, 置位状态寄存器0 的FIFO 结束/出错标志(EIF)。在FIFO 底部这些单元中无错误标志 时,清0 EIF 标志。在EIF 置位时产生中断,禁止接收FIFO DMA 请求。软件必须清洗 FIFO,并从FIFO 中移出每个数据时检查ICSR1 的EOF、CRE 和ROR 标志。在移出每 一个单元后,必须检查EIF 位以决定它是否还有错误标志。重复以上步骤,至所有置位 的标志从FIFO 底部单元中清洗出去。EIF 清0 后,重新允许接收FIFO 的DMA 请求。

5. FICP 状态寄存器 0 ICSR0

位31~6:保留。
位5:FRE——帧错误。

0=在接收来数据时没发生帧错误。

1=发生帧错误,可产生中断。

位4:RFS——接收FIFO 服务请求(只读)。

0=接收FIFO 没到达触发阀值,或禁止接收器。

1=接收FIFO 到达触发阀值且允许接收器。产生DMA 服务请求,允许时可产生中 断。

位3:TFS——发送FIFO 服务请求(只读)。

0=发送FIFO 有多于96 个数据单元或禁止发送器。

1=发送 FIFO 有 96 个或更少个数据且允许发生器,产生 DMA 服务请求,允许时 可产生中断。

位2:RAB——接收器中止。

0=输入帧没发生中止。

1=在接收输入帧时检测到中止,即两个或更多片包含无脉冲或在接收脚检测到非 法片。可产生中断。

位1:TUR——发送FIFO 下溢处。

0=发送FIFO 没发生下溢出。

1=发送逻辑试图从空的发送 FIFO 中取数据。允许时可产生中断。在第一次允许

FICP 发送器和处于空闲时不产生下溢出。 位0:EIF——FIFO 结束/出错(只读)。

0=在接收FIFO 的触发阀值之下的单元的位10~8 无置位。允许接收FIFO DMA 请 求。

1=在接收FIFO 的触发阀值之下的单元的标志位(位10~8)有一个或更多位置位。 产生中断,禁止接收FIFO DMA 服务。这个中断不可由FICP 屏蔽。一旦出错字节 从FIFO 中移出,自动允许DMA 请求。

6. FICP 状态寄存器 1 ICSR1


位31~7:保留。
位6:ROR——接收FIFO 溢出(只读)。

0=接收FIFO 没发生溢出。

1=接收逻辑试图把数据写入满的接收FIFO,丢失该数据。 位5:CRE——CRC 错(只读)。

0=没遇到CRC 或在已收到数据中没发生CRC 检验错。

1=从输入数据计算的CRC 与接收帧中的CRC 不相符。 位4:EOF——帧结束(只读)。

0=没完成现行帧。

1=本帧的接收FIFO 底部的数据是数据的最后字节。 位3:TNF——发送FIFO 没满(只读)。

0=发送FIFO 满。

1=发送FIFO 不满(不产生中断)。 位2:RNE——接收FIFO 不空(只读)。

0=接收FIFO 为空。

1=接收FIFO 不空(不产生中断)。 位1:TBY——发送器忙标志(只读)。

0=发送器为空或禁止。

1=发送逻辑正在发送一个帧(地址、控制、数据、CRC 或开始/结束标志)(不产 生中断)。

位0:RSY——接收同步标志(只读)。

0=接收器处于搜索方式或禁止。

1=接收逻辑与输入数据同步(不产生中断)。