目录:
- 1.简介
- 1.1 网络制式
- 1.2 传输速率
- 1.3操作系统
- 2. 硬件介绍
- 2.1 控制信号
- 2.2 开关机
- 3.开发方式
- 3.1固件定制部分
- 3.1.2多路复用
- 3.1.3工作模式
- 3.1.4LPG指示灯
- 3.2AT方案
- 3.2.1一些常用AT指令
- 3.2.2 升级方案
- 3.2.3 休眠方案
- 前置条件
- 3.2.4 休眠方式
- 3.2.5 唤醒
- 3.2.6上报数据
- 3.2.7 工作电流
- 3.3 openCPU方案
- 3.3.1启动流程
- 3.3.2分区
- 3.3.3 内存
- 3.3.4 cmake编译
- 3.3.4.1增加源文件
- 3.3.5升级方案
- 3.3.6 异常情况测试
写在前面的话:
广和通的4G模块可能更多的人使用的是L610,虽然用的是MC615,他们之前还是有很多相通的地方可以参考。
本文是我在做项目过程中的一下笔记,主要侧重模块升级、上网和休眠功能,其他的实际应用层的功能,都是可以通过内置封装的AT命令去实现的。
1.简介
MC615-CN-00是一款LTE Cat1 bis 无线通信模组。产品支持TDD-LTE/FDD-LTE 多种网络制式和多频段,同时支持VoLTE、Audio、 Camera、 LCD、 Keypad等功能。
下面来简单补充一点关于简介中提到的一些名词的含义。
1.1 网络制式
模组支持 FDD和TDD两种网络制式,我们使用4G模块的设备,需要送检得到认证,可以得到同时支持FDD和TDD两种网络制式的认证证书,但是不同的运营商对于网络制式的支持是不一样的。
- LTE FDD: Band 1/3/5/8
- LTE TDD: Band 34/38/39/40/41
FDD和TDD主要区别就在于采用不同的双工方式,为频分双工(FDD) 和时分双工(TDD) 是两种不同的双工方式。
-
FDD是在分离的两个对称频率信道上进行接收和发送,用保护频段来分离接收和发送信道。FDD的缺点就是必须采用成对的频率,依靠频率来区分上下行链路,其单方向的资源在时间上是连续的。FDD虽然在支持对称业务时,能充分利用上下行的频谱,但在支持非对称业务时,频谱利用率将大大降低。
-
TDD用时间来分离接收和发送信道。其就在一个通道中进行,在TDD方式的移动通信系统中, 接收和发送使用同一频率载波的不同时隙作为信道的承载,时间资源在两个方向上进行了分配。在某个时间段由基站发送信号给移动台,而中间的时间间隙由移动台发送信号给基站,基站和移动台之间必须协同一致才能顺利工作。
1.2 传输速率
Cat4和Cat1都是4G通信LTE网络下用户终端类别的一个标准。Cat全称LTE UE-Category ,Cat.X这个值就是用来衡量用户终端设备无线性能的,主要用来划分终端速率(等级)。
- LTE FDD Rel.13 : 10Mbps DL[下行]/5Mbps UL[上行]
- LTE TDD Rel.13 : 8.2Mbps DL[下行]/3.4Mbps UL[上行]
cat1的模组比cat4功耗更低,速率相对较慢,适合用在一些对功耗有要求,对速率要求不大的场合。
1.3操作系统
模组目前支持在 Linux/ Windows/Android 操作系统上开发。
2. 硬件介绍
MC615-CN的模组并不是一个单纯的上网模块,更是一个带有基带芯片的主控制器,模组内部集成有电源管理、基带部分、存储器、射频部分、外围接口等。
2.1 控制信号
MC615-CN 系列模块提供 2 路控制信号对模块进行开机/关机和复位操作,管脚定义如下表
管脚名 | I/O | 管脚 | 描述 |
---|---|---|---|
EMERG_ RST | I | 37 | 当模块在工作时,给 复位 RESET 一个 Tst(100ms)低电平,然后拉高,模块 |
PWRKEY | I | 14 | 拉低电平开机时,最短低电平持续时间 2s,拉低电平关机时,最短电平持续 时间 3.1s |
2.2 开关机
- 开机
当 MC615-CN 系列模块处于关机模式,可以通过拉低PWRKEY至少2s使模块开机。 - 自动开机
若需要模块上电自动开机,可将 PWRKEY 管脚直接对地或者通过电阻下拉到地,下拉电阻推荐 1K。
此种方式下模块关机,只能直接断电。 - 三种关机方式
关机方式 | 关机方法 | 使用场景 |
---|---|---|
低电压关机 | VBAT电压过低或者掉电时,模块会关机 | 此时模块没有走正常关机流程,没有走基站注销流程 |
硬件关机 | 拉低PWRKEY(大于3.1S),然后释放 | 正常关机 |
AT关机 | AT+CPWROFF | 软件关机 |
芯片开关机与复位设计,如果采用自动开机的设计,PWRKEY接地处理,此种模式下无法实现全部关机,用局部指令关闭射频模块,然后在进行断电处理。
3.开发方式
广和通模组有两种开发模式,不需要二次开发的AT开发模式和二次开发的openCPU方式。
- AT模式:一般到手的,内部已经烧录好的是AT固件,此种开发方式是厂商已经将模组内部的CPU开发了一部分,一般只要按照固定的方式进行操作,即可完成想要的功能。
- openCPU模式:openCPU的开发方式,内部已经有一个一部分定制好的程序,但是预留了一部分空间给用户进行开发,基于SDK进行二次开发,即利用厂商提供的SDK,通过库和头文件,完成用户自己需要的逻辑。
3.1固件定制部分
无论是AT方案的开发方式,还是open方案的开发方式,在模组上,已经固定烧录好了一个5-8M的固件包,相当于在模组内部的MCU开发,模组原厂已经完成了大部分的定制开发模块。
3.1.2多路复用
模组与CPU之前只有一路USB线相连,但是模组内部实现了多路复用的机制, 将一路USB复用传6路的串口,每个串口都有固定的用途。这部分的用法定义在模组底包固件中,我们无法去修改固件内部的协议。
3.1.3工作模式
目前模组有这几个工作模式,用于表示不同的网络状态,各个工作模式之间可以通过AT指令切换。
3.1.4LPG指示灯
在已经有的定制固件中,对应上述在不同的工作状态,有一颗对应的LPG指示灯,它的状态是不一样的。
3.2AT方案
3.2.1一些常用AT指令
AT 指令 | 预期返回 | 超时 (秒) | 超时 或者 ERROR | 描述 | 其他 |
---|---|---|---|---|---|
AT | OK | <1 | 300s | 功能:判断串口是否可用 | |
ATE0 | OK | <1 | 90s | 功能:关闭回显 \n 注意:掉电不保存 | |
AT+CFUN? | +CFUN: 1 OK | <1 | 90s | 功能:查询模块工作模式 参数 1 工作模式:1 为正常工作模式 注意:参数 1 为其它值表示工作模式异常,可以 发 AT+CFUN=1 尝试把工作模式设置为 1 | |
AT+CPIN? | +CPIN: READY OK | <1 | 90s | 功能:检查 SIM 卡状态 如果需要设置 PIN 用设置命令设置,掉电不保存 注意:SIM 卡不存在的情况下,注意控制给模块 掉电的频率,掉电之前需要先发 AT+CPWROFF 让 模块关机 | |
AT+CIMI? | +CIMI: 460042172609878OK | <1 | 90s | 功能:查询IMEI号 | |
AT+CCID? | +CCID: 89860321462090337754 OK | <1 | 90s | 功能:查询ICCID | |
at+gtusbmode? | 查询当下的USB的mode | ||||
at+msmpd? | 功能:查询是否支持热插拔 | ||||
AT+MIPCALL=1,“UNLNET” | OK +MIPCALL: 10.69.45.171 | 指令:AT+MIPCALL=1,“CMNET” 功能:设置GPRS的APN(移动CMNET,联通UNINET),并激活移动场景(拨号上网) | |||
AT+MIPNTP=“202.118.1.46”,123 | OK +MIPNTP: 1 | 90 | 3次 | 通过 NTP 协议同步当地时间 | |
AT+CCLK? | +CCLK: “21/06/18,08:37:28+00” | <1 | 90 秒 | 未使用NTP前查到的是所连接的基站赋值的时间(如果基站支持),或者默认值。NTP同步成功后是从NTP服务器获取到的时间。伦敦时间,北京时间小时加8。 | |
AT+MPING=1,“180.101.49.11” | PING | ||||
AT+MIPOPEN=1,“sz3.fibocom.com”,9000,0 | 打开一个socket, +MIPODM=<Socket_ID>,[],,,[,<Pseudo-Command Mode On/Off>] | ||||
AT+CREG=2 OK AT+CGREG=2 OK AT+CEREG=2 | //设置CS注册状态自动上报,用于检测网络变化情况,可以根据需要进行设置监控 //设置2/3G-PS注册状态自动上报,用于检测网络变化情况 //设置4G-PS注册状态自动上报,用于检测网络变化情况OK | ||||
at+msmpd=x | 设置:0:不支持热插拔 1:支持热插拔 |
3.2.2 升级方案
AT方案的开发模式下的升级方案大致分为两种,线上升级和本地升级,但不管哪种升级方式,走得都是差分升级。
-
线上升级:http/ftp服务器升级:通过AT命令+差分包的URL地址。
- AT+GTOTA=0,“http://47.110.234.36:8000/httpfota/test4/fota/MC615-CN-00/06/06_05.bin”
- AT+GTOTA=1,“111.231.250105:21”,"/upgrade/MC615-CN-00/06_05.bin",“user”,“password”
-
本地升级:通过AT指令写入“AT+UPDATE=XXX”,此命令后的XXX字节数据都为升级包,升级完成之后,“AT+CFUN=15”重启,重启后需要20s左右进行固件升级。
这种方式可以通过linux通用的api接口,open设备节点,read,write的方式写入。
3.2.3 休眠方案
前置条件
广和通4G模组在进入休眠的时候,在硬件上有前置条件,板卡上的VBUS-5V不能接入电源(对应开发板,USB不能插入,并且通过跳线帽切换成外部电源供电)。
在休眠之前的uart可以是ttyUSB0、ttyUSB5和UART发送AT指令,在休眠后,此时的USB是断开状态,只可以通过UART1发送AT指令。(这部分也是AT固件定制的,将模组的UART1用作一个特定的AT串口,其内部是将串口接收到的AT指令转化成命令发送到模组内部处理。)
3.2.4 休眠方式
-
定时休眠
使用ATS24指令进入sleep等待的时长
例如:AT+GTLPMMODE=0 ATS24=3 //3s后没有业务尝试进入休眠
-
引脚休眠
可以由wakeup_in引脚来控制模块进入或者退出休眠。
AT+GTLPMMODE=1,1 //WAKEUP_IN拉低进入休眠,拉高唤醒 AT+GTLPMMODE=1,0 //WAKEUP_IN拉高进入休眠,拉低唤醒
通过引脚休眠可以有两种方案:
-
1.在设备启动的时候,发送命令设置休眠引脚 高/低进入休眠,后续通过拉高/低引脚,控制模块的休眠唤醒。
-
2.在硬件设计的时候,固定上拉或者下拉引脚,通过uart串口改变设置休眠口令(设备休眠时,可以被串口唤醒),从而改变设备的工作模式。
-
3.2.5 唤醒
通过上文所述,pad22在作为RI脚在唤醒的时候会有电平变换,下文说的RI脚都是指pad22。
在sleep模式下,模组可以被短信、电话、和TCP数据唤醒,并且有的数据可以通过UART上报。
- 设置唤醒时的RI脚信号
AT+GTWAKE=0 | RI 脚默认为高电平,当接收到 SMS/incoming call/data 时候, 会发出低电平波形信号, 输出波形长度由 AT+WRIM 指令决定 |
---|---|
AT+GTWAKE=2,0 | RI 脚默认为低电平,当接收到 SMS/incoming call/data 时候,会输出高电平波形信号, 输出波形长度由 AT+GTPMTIME 决定 |
AT+GTWAKE=2,1 | RI 脚默认为高电平,当接收到 SMS/incoming call/data 时候,会输出低电平波形信号, 输出波形长度由 AT+GTPMTIME 决定 |
当 AT+GTWAKE 设置值非 0 时, 输出波形由 GTPMTIME 设置。
当 AT+GTWAKE 设置值为 0 时, 输出波形由 WRIM 设置。
- 设置唤醒信号的电平长度
当AT+GTWAKE=0时,可以设置唤醒信号的电平长度
AT+WRIM=0,1000 | 默认值, RI 脚在接收来电的时候波形长度为 1000 毫秒 |
---|---|
AT+WRIM=1,150 | 默认值, RI 脚在接收新短信息的时候波形长度为 150 毫 秒 |
AT+WRIM=2,500 | RI 脚在接收数据的时候波形长度为 500 毫秒 |
当AT+GTWAKE!=0时,并且 AT+GTPMTIME=200,200,1000-----------设置RI脚信号宽度为200(来电),200(短信),1000ms(网络数据)。
3.2.6上报数据
由于此时的USB是断开状态,因此所有的数据都会通过UART上报,经测试,在非定制的11版本固件,当模组休眠的时候
-
接收传呼,RI脚电平变化,并且UART上报“RING”信息
-
接收短信,RI脚电平变化,模组UART没有上报信息
-
接收网络数据,RI脚电平变化,并且UART上报信息。
3.2.7 工作电流
模块是否进入休眠,最直观的可以通过LPG指示灯得到,当蓝灯常亮的时候,模块进入了休眠状态,此外,还可以通过外接电源的数显工作电流读出,不过由于不是精确测功耗的电流表,测量数据存在偏差,不过可以大致反应模组的工作状态
- 在待机模式下,10-30mA
- 在射频工作模式下(真正有网络数据传输的时候),200-700mA
- 在休眠模式下,0-10mA
3.3 openCPU方案
-
OS: FreeRtos Kernel: V10.0.1
-
没有通用的SPI接口,只有定制好的模块SPI接口,例如flash。
-
在uart_demo中,序号0为mcu的uart1,在open方案中,UART1只作为普通串口使用,并不像在AT方案中,作为特殊串口使用。
3.3.1启动流程
客户的应用程序在 bootloader 之后,加载主程序 application 程序的时候,会去加载存放在
FLASH 0x2C0000(应用程序相对起始地址)应用程序,并对存放在此处起始地址几百 byte 的头部校验,检
验客户应用程序准确无误后,跳转至客户应用程序起始栈地址运行,即客户看到的应用程序入口函数。
Void *appimg_enter(void *param)
,此函数开机加载只从运行退出后就结束了,不会再次加载。
所以客户的应用程序必须跑在此接口内创建的线程内,线程内调API接口处理应用程序各个功能。
3.3.2分区
- 其中 FS 分区实测剩余 1.2MB 左右空间, 还会划分一部分空间给到主版本 FOTA 差分包和客户应用程
序 FOTA 升级包用, FOTA 升级包大小不固定,所以不能全部划分 FS 剩余空间给客户存储固定文件使
用 。目前 TTS(text-to-sound)的库也编译进主版本,实际存放在 application flash 空间, 会占用 700K 左右 flash 空间,导致实际剩余 application flash 空间很小, 大约 100K 左右, 如果不需要支持 TTS 的客户
对 FLASH 空间有要求的客户, 可以移除 TTS。
3.3.3 内存
由于 OpenCPU 客户应用程序可独立主版本在外部独自编译,所以必须得给这部分代码分配一块独立
的静态存储区域的 RAM 资源(默认 64K, 可改大),编译期间给代码里定义的初始化的全局变量计算可分配静态存储区域内存。
3.3.4 cmake编译
- 源外编译和源内编译
cmake的编译方式:
- 内部构建(in-source-build)
- 外部构建(out-of-source-build)
两者的区别仅仅是:内部构建将生成的编译文件和源代码、CMakeLists.txt混杂在一起;外部构建就只是创建了一个文件夹存储生成的编译文件,更好删除编译生成的文件而已(直接删文件夹)。
原文链接:https://blog.csdn.net/sandalphon4869/article/details/100589747
3.3.4.1增加源文件
目前支持此宏 CONFIG_APPIMG_LOAD_FLASH, 因此添加C文件的时候,CMakList.txt的line114
添加
if(CONFIG_APPIMG_LOAD_FLASH)set(target hello_flash)add_appimg(${target} ${flash_ldscript}hello_world.cdemo.c)
如果增加的C文件过多,可以定义一个LIB_SRC_FILE,记录C文件
if(CONFIG_APPIMG_LOAD_FLASH)set(target hello_flash)add_appimg(${target} ${flash_ldscript}${LIB_SRC_FILE})
添加h文件的时候,需要在CMakList.txt的line36
添加头文件
include_directories(components/include components/newlib/include)
3.3.5升级方案
目前我们使用广和通4G模组,并进行二次开发,因此升级分为两部分,底包升级和APP升级
-
底包差分升级方式:(底包只支持差分升级)
-
底包网络升级:http/ftp服务器升级:通过AT命令+差分包的URL地址。
- 前面的逻辑和IPC一致,通过封装AT命令,通过ttyUSB0,模组自己去云端拉升级包
- AT+GTOTA=0,“http://47.110.234.36:8000/httpfota/test4/fota/MC615-CN-00/06/06_05.bin”
- AT+GTOTA=1,“111.231.250105:21”,"/upgrade/MC615-CN-00/06_05.bin",“user”,“password”
-
APP网络升级:通过APP程序进行网络差分包升级。
- 前面的逻辑和IPC一致,通过串口,将url传给4G,4G内部程序实现,自己去云端拉升级包。
INT32 fibo_firmware_ota(UINT8 type,UINT8 *url,UINT8 *filename,UINT8 *username,UINT8 *password);
此 API 通过 HTTP 或者 FTP 方式下载主固件差分包并自动升级主固件下载完成后,会检查差分包的有效性。 如果无效,则直接返回-1;如果有效,则重启在 bootloader阶段进行主固件的升级操作。升级完成之后正常启动模块。升级过程会花费 1 到 2 分钟时间。
- 前面的逻辑和IPC一致,通过串口,将url传给4G,4G内部程序实现,自己去云端拉升级包。
-
USB本地升级:cpu通过ttyUSB0口+AT指令,写入“AT+UPDATE=sizeof(file)”。
差分包数据接收完后会先保存到文件系统固定位置,然后调用平台底层升级校验接口,校验失败删除升级包返回失败,校验成功直接重启在BootLoader阶段进行差分升级,升级过程会保存升级进度及相关数据,断电重启会继续升级
-
- 1.打开ttyUSB0,写入“AT+CGMR?”,read应答,字符串匹配出版本号“1600.1000.00.06.34.05”- 2.匹配目标版本号“1600.1000.00.06.34.05”,匹配失败,通过字符串处理,得到升级文件名“4-5.bin”- 3.通过AT指令写入“AT+UPDATE=XXX”,此命令后的XXX字节数据都为升级包,升级完成之后,“AT+CFUN=15”重启,重启后需要20s左右进行固件升级。> 一个差分包大概100-300KB,升级包如果是脏数据,升级中断,还是原始版本启动。
-
==APP全量==升级方式:(APP可以走全量也可以走差分,我们比较适合全量)
- APP网络升级:http/ftp服务器升级:通过api,
fibo_open_ota()
下载。
- APP网络升级:http/ftp服务器升级:通过api,
- INT32 fibo_open_ota(UINT8 type,UINT8 *url,UINT8 *filename,UINT8 *username,UINT8 *password);此 API 通过 HTTP 或者 FTP 方式下载并自动升级客户的 APP;所填参数为用于下载的 HTTP 或 FTP 参数,具体请参考 API 手册;一旦下载完成, 会对客户 APP 做有效性检查。检查成功,则模块自动重启进行新旧 APP 的替换工作。替换完成,模块会正常启动
- APP本地升级:通过cpu给4G传输程序,4G再自更新。
- 如果4G程序打包到dav里面,每次更新程序,都会升级固件,通过uart传输date数据,不论版本校验升级还是版本校验升级。- INT32 fibo_ota_handle(INT8 *data, UINT32 len); > 接口会做校验,成功后会写入到文件系统固定位置,然后重启,在加载APP前先擦除flash中APPIMG分区,将新APP内存写入到APPIMG分区 如果写入文件系统前断电重启需要重新调用接口升级,如果写入文件系统成功,升级过程中断电重启会继续升级,上次的app已被擦除> 传输date只能通过uart,特率115200(bps) = 115200 (位/秒) = 11.25 (KB/秒)>> ==UART回调数据上限制==,malloc数据量(xKB)>> 打包到dav包中(最小demo数据量2kb)?
3.3.6 异常情况测试
-
[底包异常升级:
✔错误升级包 -> 校验失败,不升级
发送完AT+update后,不传输文件 -> 一直等到x字节结束后才响应AT,这个时候网络是否受影响得上设备看
✔重启后升级过程中断电 -> 再次上电恢复升级
-
APP异常:
✔错误升级包 -> 校验失败,不升级
✔升级过程中断电 -> 升级过程中断电重启会继续升级