SFP+双MCU光收发模块升级的设计与实现
随着全球光通信的日益发展,光通信的发展已经取得了惊人的成就。如今的光通信已经不仅仅要解决大容量传输和宽带接入的问题,更关键的是实现光层的智能化和节点的光交换,从而建立起动态高效、扩展灵活、经济可靠的光网络,以满足信息传输的要求。
如今,大多数光通信依旧使用传统的基于固定波长光模块的光源,尤其是目前被广泛使用的10 Gbit/s光模块都使用的这种固定波长激光器,这对光模块的利用存在极大的局限性,而目前这种缺陷已经渐渐地显露出来。为了提高模块的利用率、降低网络建设的成本、减小管理的复杂性、提高网络的灵活性,SFP+波长可调谐的光模块应运而生。此可调谐光模块的实现是基于DBR可调谐半导体激光器实现的。它可以在整个C波段,100个通道上实现波长切换,从而提高了光网络的灵活性同时也降低了网络组建的成本、降低了光模块管理的复杂性。由于SFP+波长可调谐光模块功能的复杂性以及PCBA本身面积的局限性,出现了双MCU的系统,这样对于多MCU系统如何实现系统的升级更新是一个急需解决的问题。本文以AN806 I2C Download Protocol为基础,实现了SFP+波长可调谐光模块双MCU嵌入式系统的升级。
1 双MCU的嵌入式系统升级的整体设计
SFP+波长可调谐光模块主要由3个部分组成:光发射部分、光接收部分和控制部分,控制部分分别由MCU1和MCU2共同协作完成。本系统采用ADuC7023作为MCU控制模块,运行稳定可靠,实现了波长可调。其中,MCU1主要控制模块正常稳定发光,而MCU2主要用于实现波长切换。以下便设计了一种更新此嵌入式系统的升级方案,具体的整体框架如图1所示。
图1 升级系统的整体架构
1)通信协议上位机:主要通过GUI(Graphical UserInterface)下发Hex文件,通过串口发送给下载板。
2)下载板:接收到串口发送的数据之后进行判断,如果是给MCU1下载程序则下载板将接收到的数据封装为满足AN806_I2C Download Protocol for ADulC70xxBCPZxxI Models下载协议的帧结构,并按照此协议的要求更新MCU1;如果是给MCU2下载程序,则下载板将收到的数据直接通过I2C(Inter—Integrated Circuit)转发给MCU1。
3)MCU1:MCU1作为光模块的主机,MCU2作为从机。当给MCU2下载程序时,MCU1将接收到的数据封装为满足AN806_I2C Download Protocol for ADulC70xxBCPZxxI Models下载协议的帧结构,并按照此协议的要求更新MCU2;否则,MCU1执行自身的程序,控制整个模块的正常运行。
2 双MCU嵌入式系统升级的实现
双MCU嵌入式系统升级的实现可分为以下几个部分:实现串口数据收集,实现数据的封装以及按照下载协议实现系统的更新。
2.1 串口数据收集实现
上位机(GUI)将Hex文件一行一行地发送给下载板,通过协议转换模块对数据封装后通过下载协议更新需要升级的系统。而串口每次只能发送一个ASCII码字符给下载板。下载板接收到数据后将每2个ASCII码合并为1个相应的十六进制数据,从而实现数据的收集。
2.2 数据封装的实现
数据的封装可根据具体的更新哪块MCU分别在下载板(更新MCU1)或MCU1(更新MCU2)中完成。由于数据封装前是Hex的帧结构,无法满足下载协议的要求,所以在更新系统之前必须对数据进行封装,使其满足协议的要求。下面将介绍具体的实现方式。
1)Hex文件的帧结构如图2所示。
图2 Hex文件的帧结构
(1)起始符:固定为“:”用于记录一帧数据的开始。
(2)数据字节数:后面的2个字符表明记录的长度。一般情况为0x10,表明这一帧中传送的有效数据位16 byte。
(3)地址位:4个字符表明调入的起始地址。
(4)数据类型:2个字符表明记录的类型。以下为具体的字符对应的不同的数据类型:
0:数据记录。
l:记录文件结束。
2:扩展地址记录。
3:开始段地址记录。
4:扩展线性地址记录。
5:开始线性地址记录。
(5)数据:表明有效的数据。
(6)校验和:最后的2位表明校验和检查,它加上前面所有的数据为0。
2)下载协议规定的数据帧结构如图3所示。
图3发送数据的帧结构
(1)起始ID:0x07和0x0E是两个固定的有效值。
(2)数据字节数:表示数据帧中传输的数据,从Datal开始算起。最小值为5,最大值为255。
(3)数据1 CMD,如表1所示。
表1 命令功能
(4)数据2一数据5(Address:h,u,m,1):该地址字段包含一个32位地址h,u,m,l,其中h中包含最高有效位(MSB),l中包含最低有效位(LSB)。
(5)数据x(x=6~255):用户代码是按字节下载的,数据字节字段最多为250个数据字节。数据必须是扩展Hex 16字节记录格式的数据串,而且在传输到加载器之前作为上面数据表格的一部分由主机重新编译。
(6)校验和:校验和的计算方法为所有数据的和取余。
3)帧结构封装的实现
协议转换模块将收到的每2个ASCII码转化为1个对应的十六进制,并存放于特定的缓存中。当协议转换模块收到回车换行后就会开始帧结构的封装工作。按照协议规定,为数据加入Start ID;帧结构中的No.of Data Bytes的值为Hex文件中数据的个数加5(其中主要加入了CMD Byte以及4 byte的地址);Datal则是命令Byte可根据协议要求写入适当的命令,在更新系统时应使用写命令W(0x57);Data2一Data5为Hex文件中指定的地址;Data x对应Hex文件中的数据部分;Checksum则为0x00减去从Bytel~Byte x 的所有数据的和。从而实现对数据的封装。
2.3 模块更新的实现
AN806一I2C Download Protocol是一种广泛使用的ADuC70xxBCPZxxI模块的下载协议。依照协议的具体规定设计和实现了双MCU模块的升级,具体的模块更新流程如图4所示。
图4模块更新流程
1)运行微转换器加载器
为了防止I2C意外下载,I2C下载模式进人前提是在复位器件串行下载保持低电平、同时Flash/EE存储器Oxl4地址单元的内容为0xFFFFFFFF。因此,用户代码必须有一个内置机制用来擦除第0页(Flash地址0x0到0x200)和复位器件。该机制允许进入下载模式对器件重新编译。
在理想情况下,为了能够在数据重编程时出现掉电故障或出现其他错误时重新进入下载模式,Flash地址单元Oxl4应该最后编程。
在基于MCU的嵌入式系统中,程序的存储区与数据的存储区是一致的,有时只是为了更新程序而又希望可以保留原有的数据,此时往往选择只擦除程序部分。因此,在执行擦除命令时要首先确定是否需要保留数据部分,避免误操作。
2)启动下载协议
一旦加载器进入下载模式,加载器从机器件地址为0x04,因此,每次向加载器发送数据,主机必须以字节0x04(I2c写地址)开始,每次从加载器读取命令应答请求以字节0x05(I2C读地址)开始。加载器的第一个数据包的数据必须为退格符(BS=0x08)以启动该协议。
在收到退格符后,加载器发送如下24 byte ID数据包:
15 byte=产品标示符
3 byte=硬件和固件的版本号
4 byte=保留
2 byte=换行和回车
3)加载器接收数据
为了防止在重新编程过程中出现的异常故障使得MCU无法再次进入下载模式,所以Flash地址单元0x14应该最后编程。从Hex文件的帧结构中可以发现0x14在第2行Hex中,也就是说第2行Hex文件应该在其他数据传完之后再写入。由于程序的起始点在第1行,所以Hex文件的第1行和第2行应该放在最后写入。协议转换器发送数据的具体软件流程如图5所示。
图5 协议转换器发送数据的具体软件流程图
其中,若加载器为MCU1则协议转换器为下载板,即数据的封装在下载板中完成;若加载器为MCU2则协议转换器为MCU2,即数据的封装在MCU1中完成,此时下载板只起转发的作用。
4)加载器接收远程执行命令
一旦主机将所有的数据包发送到加载器,主机可以发送最后一个包以指示加载器开始执行代码。具体的软件流程如图6所示。
图6协议转换器重启加载器的软件流程图
其中有2种不同的远程运行方式:软件复位(h,u,m,l=0x1)和跳转至用户代码(h,u,m,l=0x0)。一般情况下,会选择软件复位,因为软件复位可以重置所有外设。然而在串行接口永久接地和地址0x80014被清零的情况下,有必要采用一个跳转直接到用户代码。如果采用软件复位,则最后发送的数据包的帧结构如表2所示。
表2 软件复位的帧结构
2.4 实验结果
图7是使用本设计方案升级SFP+双MCU嵌入式系统的测试结果,测试结果显示MCU2在更新之前的版本号为v101,升级之后的版本号为v102。这说明本设计方案是可行可靠的。
图7测试结果
3 结束语
本文基于ADuC7023a的硬件平台和Keil4的软件平台,设计了一种SFP+双MCU光收发模块嵌入式系统升级的方案,并具体实现了SFP+波长可调谐光模块双MCU系统的更新。这对双MCU的光模块的升级具有一定的实用价值,并对今后出现的多MCU嵌入式系统的升级具有一定的参考意义。
|