天线|RF射频
直播中

余英姿

7年用户 216经验值
私信 关注
[问答]

怎样去设计一种SFP+双MCU光收发模块嵌入式系统?

本文基于ADuC7023a的硬件平台和Keil4的软件平台,设计了一种SFP+双MCU光收发模块嵌入式系统升级的方案。

回帖(1)

杨芳

2021-5-24 14:18:59
  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嵌入式系统的升级具有一定的参考意义。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分