摘要:某应用蓝牙技术的医疗监控系统中,单片机是其数据传输瓶颈。本设计采用FPGA取代了原系统的单片机和8255芯片,使数据传输速率提高了近10倍。文中讨论了设计的一些关键问题。
1 引言
在蓝牙体系的实现方案中, HCI意义重大,它以一个统一的接口实现主机设备与蓝牙模块之间的互操作。蓝牙HCI层定义了数据、命令、事件三类消息,规定了数据如何在蓝牙模块和蓝牙主机间进行传输,以及每一类消息数据如何封装和通过接口硬件进行复用。HCI传输层有四个协议: UART协议、RS232协议和USB协议和PC卡传输层协议。其中UART和RS232传输层都采用异步串行通信方式在蓝牙模块和蓝牙主机间进行数据传输。两者间的区别在于它们所适用的环境,UART传输层适用于板级互连,没有规定信号特殊的电气特性,也没有定义波特率协商机制。UART方式比较灵活,并且可以直接采用TTL、LV-CMOS等IC端电压,应用较多。
某医疗监控设备中,使用蓝牙的HCI-UART接口实现监控数据到计算机并口卡的无线传输,蓝牙模块ROK-101-008的数据传输由MCS51单片机控制。在实时监控时,数据速率较低,单片机可以很好的完成传输控制任务;但是在监控结束需要一次性下载数据时,该单片机的56Kbps最高UART传输速率就成为数据传输的瓶颈,远远低于该蓝牙模块的UART数据传输上限460.8Kbps(蓝牙1.1的单向最高传输速率为723.2Kbps)。我们使用 FPGA代替单片机对该接口做了改进设计,取得了较好效果。
ACL链路建立后,用户通过应用软件向计算机并口卡发出实时监控或者瞬时数据读取命令,此命令经过Slave端的单片机、8255和蓝牙传输至Host端蓝牙、8255、单片机和监控仪,监控仪返回应答,随后即为监控数据。
对这个系统分析可知,单片机具有低成本、编程灵活的优点,在ACL链路建立过程中很方便,但是ACL链路建立以后,所有的数据仍然通过单片机进行中转和串并转换,而普通51单片机在11.0592M晶振频率时执行一条单周期指令就需要1微秒以上,由于在蓝牙通信过程中,要加入许多事件、分支判断,所以这种指令执行方式固有的低速特性就使单片机成为系统的速度瓶颈。我们使用FPGA取代原系统中的单片机和8255,将蓝牙ACL链路建立指令存入FPGA中的 ROM,以状态机控制ACL指令读取、事件判断和ACL数据接收,同样在11.0592M的主时钟频率下,达到了该蓝牙模块的最高UART传输速度 460.8Kbps。
3 FPGA控制接口设计
本接口模块在Host和Slave端各有一个,除ROM内容外,都采用相同的模块和层次设计。这里以计算机端的接口设计为例叙述。
顶层模块在状态机里根据不同的状态调用单字节并串转换和单字节串并转换模块,ROM模块部分仅在ACL链路建立时有用。各个模块都使用11.0592MHz 的主时钟,24分频后为460.8KHz,作为UART收发的位时钟。这里单字节发送和接收模块是关键的设计模块,以下予以详细介绍。
单字节并串模块在ACK信号上升沿时读入一个并行字节,再转换为串行数据输出,OBF信号有效时表示接收端正在忙于处理数据。测得计算机上的8255并口卡输出数据的时序如图2:
该模块的主要代码中,data_flag为'1'表示FPGA正在处理读入数据的标志;obf_flag为'1'是表示并串转换处理结束;bitcnt为对 460.8KHz的位时钟clk2计数的位计数器。另外,ACK信号的下降沿作为模块的复位信号,上升沿作为读数标志。
IF obf_flag='1' THEN
data_flag<='0';
ELSIF ack'event and ack='1' THEN
data_buff<='1'& data_p & '0'; --读入并行字节数据,拼装起始位和停止位
data_flag<='1';
END IF;
……
IF clk2='1' and clk2'event THEN -- 并串转换
IF data_flag='1' THEN
IF bitcnt="0" THEN
obf_flag<='0';
END IF;
tx<=data_buff(bitcnt);
bitcnt<=bitcnt+1;
IF bitcnt="10" THEN
tx<='1'; --空闲位
obf_flag<='1';
bitcnt<=0;
END IF;
END IF;
END IF;
单字节串并模块在IBF信号为'1'(表示计算机空闲,可以接收数据)时接收一个串行字节,再以并行方式在STB下降沿输出到并口卡。测得计算机上的8255并口卡输入数据的时序如图3:
串并接收过程中,要辨别Rx线上输入的异步码流的第一个下降沿去同步本地时钟,并作为模块的复位信号。主时钟连续检测到Rx的12次低表示收到可靠的起始位。同样,串并模块的主要代码中,rcv_flag为'1'表示FPGA正在处理读入数据的标志;stop_flag下降沿表示串并转换处理结束;cnt 计数器的低5位对主时钟计数产生460.8KHz,高4位为位计数器。
IF clk'event and clk='1' THEN
IF rcv_flag='1' THEN
IF conv_integer(cnt)<12 THEN
temp<=(temp OR rx); -- Rx连续的12次低表示可靠的起始位
END IF;
IF conv_integer(cnt)>=12 and temp='0' THEN
CASE cnt IS
WHEN "000101011" => -- LSB
data_buff(0)<=rx;
…… --读取1~6位,略去
WHEN "100001011" =>
data_buff(7)<=rx;
stb<='0';
stop_flag<='1';
WHEN "100001100" =>
data_p<=data_buff;
WHEN "100101011" => -- stop bit
stb<='1';
stop_flag<='0';
WHEN OTHERS =>
END CASE;
END IF;
END IF;
END IF;
4 结语
本设计用FPGA替代了原系统的单片机和8255芯片,消除了数据传输瓶颈,使得蓝牙ACL链路的数据传输速率由57.6Kbps轻松的提高到了该芯片的 UART速度上限460.8Khz。从设计分析过程可以看出,即使11M主时钟不变,FPGA的UART处理速度仍有较大的提升空间。以上设计在 ALTERA公司的Maxplus2上编译综合,下载到EP1K10芯片,在系统中验证通过。
在较早的许多智能设备中,单片机被大量使用。单片机虽然拥有软件灵活性,但是处理能力相当有限,成为许多系统的性能瓶颈。以上面的设计为例子,在任务不复杂、但是数据量很大的场合,使用FPGA或者CPLD取代单片机,是系统升级的好办法。