本发明涉及嵌入式通信技术领域,尤其涉及一种光模块固件(firmware)的实现方法。
背景技术:
固件是一般存储于设备中的EEPROM或FLASH芯片中的程序,通俗的理解就是“固化的软件”。固件担任着一个系统最基础最底层工作的软件。在硬件设备中,固件就是硬件设备的灵魂,因为一些硬件设备除了固件以外没有其它软件组成,因此固件也就决定着硬件设备的功能及性能。
光模块是实现光电转换的器件,由光电子器件、功能电路和光接口组成。光模块固件是固化在光模块内部的PROM或EEPROM或FLASH ROM中的可执行程序,负责协调和控制整个光模块内部的各种器件,使其按照预定的功能正常工作。在生产通信光模块的过程中,需要对光模块进行各种性能参数测试。在当前光模块测试领域,通常的测试模式为:由一台上位机(一般为电脑)通过中间转接板(也可称之为协议转换转发模块,其负责将上位机发送的协议转换为待测试光模块可以识别的协议,如RS232转IIC、USB转IIC等)向待测试光模块发送测试数据。现有的这种测试数据迁移保存方式,其操作较为复杂,且数据读写效率不高,不符合现代工业对高效率及低成本的要求。
技术实现要素:
本发明的目的在于,提出一种光模块对批量测试数据整体迁移保存的方法,其操作简单灵活,且读写效率较高,可以提高生产效率,降低生产成本。
为实现上述目的,本发明提供了一种光模块对批量测试数据整体迁移保存的方法,其包括如下步骤:
步骤a,将待测光模块通过数据总线与一主机通信;
步骤b,主机通过数据总线将模块的测试数据写入到光模块,或者读取存储在光模块里面的测试数据;
步骤c,光模块通过其MCU的固件将寄存器RAM区的测试数据和存储器FLASH区的测试数据整体映射;
步骤d,映射完成后,主机将光模块RAM区和FLASH区的测试数据作为一个区域通过数据总线进行整体大批量的读写操作。
优选的,本发明中所述的数据总线采用12C总线。
进一步地,所述步骤c中,测试数据的整体映射包括:
步骤c1,固件将MCU的寄存器RAM区和存储器FLASH区以单字节物理地址方式映射;
步骤c2,模块上电后,固件将存储器FLASH区的数据复制到对应物理地址的存储器RAM数据区;
步骤c3,主机与光模块之间的I2C通信数据全部在寄存器RAM区;
步骤c4,主机通过I2C写数据到光模块,光模块MCU的固件记录收到数据的寄存器RAM区物理地址,并记录收到数据的总个数,当光模块收到主机发送的I2C通信停止STOP命令,固件开始将寄存器RAM区数据迁移入对应映射的存储器FLASH区。
更近一步地,所述将寄存器RAM区数据迁移入对应映射的存储器FLASH区的步骤还包括:
步骤c41,判断12C总线写入的数据计数器是否大于测试数据总数减FLASH区页字节数;若是,则擦除所有测试数据映射存储器FLASH区然后写入数据;若否,则进入步骤c42;
步骤c42,判断接收数据起始地址是否大于接收数据结束地址;若是,则擦除起始地址所在页到结束地址所在页的存储器FLASH区,再将镜像寄存器RAM区对应地址空间的数据更新到擦除过的存储器FLASH区;若否,则进入步骤c43;
步骤c43,擦除起始数据地址所在存储器FLASH区页一直到测试数据映射存储器FLASH区的最后一页,再擦除测试数据映射存储器FLASH区的起始页一直到结束数据地址所在FLASH区页,然后将镜像寄存器RAM区对应地址空间的数据更新到擦除过的FLASH区域;
步骤c44,更新完FLASH后,清FLASH更新标志,退出保存程序。
特别的,本发明所述主机与光模块之间的12C通信按照光模块实际测试数据的最大个数来拓展I2C总线通信的数据偏移地址,并拓展I2C总线读取和写入的计数器。
本发明的光模块对批量测试数据整体迁移保存的方法,其通过I2C总线实现光模块对批量测试大数据的整体迁移保存,其读写操作灵活简单高效,且提高了生产效率,降低生产成本。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1为本发明光模块对批量测试数据整体迁移保存的方法一种具体实施例的流程图;
图2为本发明的原理框图;
图3为本发明一种具体实施例的I2C写数据示例时序图;
图4为本发明一种具体实施例的I2C读数据示例时序图;
图5为本发明中MCU的I2C中断处理流程图;
图6位本发明中RAM区和FLASH区镜像保存流程图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
如图1所示,本发明提供了一种光模块对批量测试数据整体迁移保存的方法,其包括如下步骤:
步骤a,将待测光模块通过数据总线与一主机通信。作为本发明的一种优选实施例,所述的数据总线采用12C总线。该I2C(Inter-Integrated-Circuit)总线是由PHILIPS公司开发的两线式串行通信总线,由数据线SDA和时钟线SCL构成同步串行总线,可接收和发送数据,最高速率可支持到400KHz。I2C作为一种两线串行总线,具有通信速率较高,占用硬件资源少的特点,并且I2C总线减少了PCB板空间和芯片管脚,降低了互联成本,而且它具有多主控特性。
步骤b,主机通过数据总线将模块的测试数据写入到光模块,或者读取存储在光模块里面的测试数据。
步骤c,光模块通过其MCU的固件将寄存器RAM区的测试数据和存储器FLASH区的测试数据整体映射。进一步地,该步骤c中,测试数据的整体映射包括:步骤c1,固件将MCU的寄存器RAM区和存储器FLASH区以单字节物理地址方式映射;步骤c2,模块上电后,固件将存储器FLASH区的数据复制到对应物理地址的存储器RAM数据区;步骤c3,主机与光模块之间的I2C通信数据全部在寄存器RAM区;步骤c4,主机通过I2C写数据到光模块,光模块MCU的固件记录收到数据的寄存器RAM区物理地址,并记录收到数据的总个数,当光模块收到主机发送的I2C通信停止STOP命令,固件开始将寄存器RAM区数据迁移入对应映射的存储器FLASH区。
在本发明具体实施例中,为了保证通信的实时性,光模块集成的MCU采用中断方式处理I2C总线通信。为了保证存储器FLASH程序正常运行,MCU在中断里面必须把I2C需要读写的数据缓存在寄存器RAM,等待I2C的Master主设备完成数据写操作,MCU再将寄存器RAM缓存数据保存到对应的存储器FLASH空间。因此必须建立寄存器RAM区和存储器FLASH区的物理地址映射关系。
需要注意的是,由于存储器FLASH区是按页的物理格式,所以将寄存器RAM区数据迁移入对应映射的存储器FLASH区必须按FLASH页格式处理。因此本发明中将寄存器RAM区数据迁移入对应映射的存储器FLASH区的步骤还包括:
步骤c41,判断12C总线写入的数据计数器是否大于测试数据总数减FLASH区页字节数;若是,则擦除所有测试数据映射存储器FLASH区然后写入数据;若否,则进入步骤c42;
步骤c42,判断接收数据起始地址是否大于接收数据结束地址;若是,则擦除起始地址所在页到结束地址所在页的存储器FLASH区,再将镜像寄存器RAM区对应地址空间的数据更新到擦除过的存储器FLASH区;若否,则进入步骤c43;
步骤c43,擦除起始数据地址所在存储器FLASH区页一直到测试数据映射存储器FLASH区的最后一页,再擦除测试数据映射存储器FLASH区的起始页一直到结束数据地址所在FLASH区页,然后将镜像寄存器RAM区对应地址空间的数据更新到擦除过的FLASH区域;
步骤c44,更新完FLASH后,清FLASH更新标志,退出保存程序。
步骤d,映射完成后,主机将光模块RAM区和FLASH区的测试数据作为一个区域通过数据总线进行整体大批量的读写操作。
特别的,本发明所述主机与光模块之间的12C通信按照光模块实际测试数据的最大个数来拓展I2C总线通信的数据偏移地址,并拓展I2C总线读取和写入的计数器。MCU在I2C通信过程中将接收到的数据缓存在寄存器RAM,记录接收数据的数据地址和数据个数,并判断数据地址是否大于寄存器RAM边界尾地址,若大于,则将数据地址重置为寄存器RAM边界首地址。MCU在主循环程序中读取I2C状态寄存器,判断I2C总线是否空闲。若I2C总线忙,说明此次I2C通信还未结束,主程序跳过存储器FLASH保存操作;若I2C总线空闲,则主程序执行存储器FLASH数据保存操作,将接收到的数据从寄存器RAM整体映射到对应的存储器FLASH区域。
如图2所示,为本发明的原理框图,光模块的MCU将存储器FLASH区测试数据映射到寄存器RAM区,I2C总线读写数据全部缓存在寄存器RAM区,当有数据写入寄存器RAM区时,MCU将寄存器RAM区数据映射到对应的存储器FLASH区。具体的,I2C主设备发送I2C从器件设备地址和“写”操作,等待I2C从器件应答信号ACK后,I2C主设备发送数据偏移地址RegAddr,RegAddr可为单字节或多字节,每发送一个字节偏移地址,I2C从器件接受成功都会返回应答信号ACK,若为多字节地址,则I2C从器件在接受完数据偏移地址后,必须按约定时序计算数据偏移地址,并且将起始地址缓存记忆;I2C主设备成功发送完数据偏移地址后,I2C主设备继续发送数据Data,I2C从器件每接收到一个字节数据后,将数据Data缓存到对应数据偏移地址的寄存器RAM并返回应答信号ACK,并自动将数据偏移地址加1,并记录写入数据个数.当数据偏移地址达到最大值后,数据偏移地址会自动翻转,即数据偏移地址变成最小值。I2C主设备发送I2C从器件设备地址和“读”操作,I2C从器件正确的I2C地址后会返回应答信号ACK,I2C从器件根据记录的数据偏移地址将对应的寄存器RAM区数据跟随I2C主设备紧接的一个字节SCL时钟将数据发送给I2C主设备;I2C主设备依据自己需求,如果需要继续读取数据则给I2C从器件下发应答信号ACK,I2C从器件则会把下一地址数据在I2C主设备的紧接的一个字节SCL时钟发送给I2C主设备;如果不需要继续读数据I2C主设备则下发无应答信号NO ACK。I2C主设备不需要再进行读写数据后,向I2C从器件发送停止命令STOP。模块在判断到写数据和停止命令STOP,开始保存数据,步骤如下:
在保存数据函数里面,根据缓存记忆的起始地址将该地址的寄存器RAM区数据起始地址和存储器FLASH区数据起始地址一一映射,并根据写入数据个数计算出寄存器RAM区数据结束地址和相对应的存储器FLASH区数据结束地址;由于FLASH是按页擦除,所以存储器FLASH区数据起始地址和数据结束地址必须偏移至其该页的起始地址。然后根据起始地址和结束地址,将对应的寄存器RAM区数据按存储器FLASH区页方式整体迁移并保存到存储器FLASH区中。
图3是以测试数据为0到64K字节为例的I2C写时序图。I2C主设备发送开始命令START后,发送I2C从器件地址和“写”控制位;I2C从器件成功接收正确的I2C器件地址后返回应答信号ACK,I2C主设备在发送下一SCL时钟会收到该ACK信号,然后再连续发送两个字节的数据偏移地址;然后I2C主设备依据实际测试数据量发送N(1-64K)个字节,I2C从机器件在收到字节数据后都会在紧随的SCL时钟返回ACK。I2C主设备发送完数据后,发送停止命令STOP。
图4是以测试数据为0到64K字节为例的I2C读时序图,I2C主设备发送开始命令START后,发送I2C从器件设备地址和“写”控制位,I2C从器件接收到正确的器件地址后返回应答信号ACK;I2C主设备在发送下一SCL时钟会收到该ACK信号,然后发送开始命令RESTART和I2C从器件设备地址带“读”控制位,I2C从器件接收到正确的器件地址后返回应答信号ACK;I2C主设备下一SCL时钟收到该ACK信号后,根据自己实际需要读取N(1-64K)个字节数据,I2C主设备在读取最后一个字节数据之前,每接收完一个字节数据返回应答信号ACK给I2C从器件,最后一个字节则返回非应答信号NO ACK;然后I2C主设备发送停止命令STOP。
图5是模块MCU固件里I2C中断处理程序流程图:固件进入I2C中断子程序后,会根据I2C中断状态进行不同的处理。接收中断时,会记录接收起始数据偏移地址DataAdr,并将接收数据保存到DataAdr数据地址对应的寄存器RAM区;并将数据地址DataAdr加1,判断数据地址是否超过测试数据偏移地址最大值,是则将地址DataAdr清零,实现数据偏移地址自动翻转功能;接收计数器CNT加1;标记FLASH更新标志,以便在I2C通信结束后更新存储器FLASH区数据;最后退出中断。
MCU产生I2C从器件发送数据中断时,同样先记录待发送数据的起始地址DataAdr,将DataAdr数据地址对应的RAM D处数据赋给数据发送寄存器;并将数据地址DataAdr加1,而且判断地址是否超过测试数据偏移地址最大值,是则将数据地址DataAdr清零,实现数据偏移地址自动翻转功能;然后退出中断。
图6是固件将寄存器RAM区更新的数据到保存到映射的FLASH区的程序流程图。程序会先判断存储器FLASH区更新标志开关是否置位;否则无需更新FLASH区数据,返回主程序;是则开始更新存储器FLASH区数据。更新流程如下:
判断I2C写入的数据计数器是否大于测试数据总数减FLASH区页字节数;是则擦除所有测试数据映射存储器FLASH区域然后写入数据;如果不是,则判断接收数据起始地址是否大于接收数据结束地址;如果是,则擦除起始地址所在页到结束地址所在页的存储器FLASH区域,然后将镜像寄存器RAM区对应地址空间的数据更新到擦除过的存储器FLASH区域;如果否,则在接收数据的过程中发生了地址翻转,擦除起始数据地址所在存储器FLASH页一直到测试数据映射存储器FLASH区的最后一页,再擦除测试数据映射存储器FLASH的起始页一直到结束数据地址所在FLASH页,然后将镜像寄存器RAM区对应地址空间的数据更新到擦除过的FLASH区域;更新完FLASH区数据后,清FLASH区更新标志,退出保存程序。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。