双卡单待,SIM1/SIM2

1、模组管脚;
-
SIM1;
VDD_SIM1,PIN13;
SIM1_DAT,PIN12;
SIM1_RST,PIN10;
SIM1_CLK,PIN11;
-
SIM2;
VDD_SIM2,PIN13,与VDD_SIM1共用;
SIM2_DAT,PIN26,CAM_RX0/SIM2_DAT/UART2_RXD/GPIO6四种复用选其一;
SIM2_RST,PIN76,CAM_BCLK/SIM2_RST/I2C1_SDA/GPIO4四种复用选其一;
SIM2_CLK,PIN55,CAM_CS/SIM2_CLK/I2C1_SCL/GPIO5四种复用选其一;
2、功能说明;
-
模组支持双卡,但只能单待;
-
模组SIM1(有时候也写作SIM0)为原生SIM卡接口,SIM2(有时候也写作SIM1)的数字信号为GPIO模拟,电源共用VDD_SIM1;
-
使用SIM2时就不能再使用GPIO4/5/6,包括这三个GPIO可以复用的其它功能,比如Camera、I2C、UART等,具体见GPIO复用表;

-
USIM2_CLK为什么需要上拉到Vref(PIN99:GPIO23)?
a. SIM_VDD在SIM卡初始化完成之后,只有在需要通信时才会打开,在空闲时会关闭输出以降低功耗,SIM1_VDD和SIM2_VDD都是同一路SIM_VDD;
b. SIM1_CLK是专门的SIM卡电路,SIM1_CLK在CLK Stop时保持在高电平,符合SIM卡规范;
c. SIM2_CLK是用GPIO模拟的SIM卡电路,SIM2_CLK(GPIO5)在CLK Stop时无法确定保持在高电平状态,不符合SIM卡规范,有可能会造成某些时序要求严格的SIM卡无法被识别,所以需要将SIM2_CLK(GPIO5)上拉到一个固定输出的电压,且该电压需要与SIM2_CLK(GPIO5)的电平一致;
d. AGPIO无论在正常工作状态还是休眠状态下都可以保持高电平输出,且电平跟SIM2_CLK(GPIO5)一致,所以,可以将AGPIO保持输出高电平做为SIM2_CLK(GPIO5)的上拉电平使用;
任意一个AGPIO都可以作为该上拉电平使用,我们的习惯是将模组PIN99:GPIO23默认作为该电平使用,所以该管脚也常被命名为Vref;
e. PIN99:GPIO23并不会在启用SIM2时自动设置为高电平输出,需要单独设置,设置方式同其它GPIO一样,详见LuatOS核心库GPIO中的描述;
设置GPIO23输出高电平;
-- 设置gpio23为输出,且初始化电平为高
gpio.setup(23, 1);
- SIM1支持1.8V/2.8V两种IO电平的SIM卡,SIM2由于是GPIO4/5/6复用所以可以支持的SIM卡的电平与模组IO的电平保持一致,模组IO电平设置为1.8V时,SIM2则只支持1.8V电平的SIM卡,模组IO电平设置为2.8V/3.3V时,SIM2则只支持2.8V/3.3V电平的SIM卡(就IO电平而言,2.8V和3.3V可认为电平一致);
当前运营商提供的SIM卡基本默认兼容1.8V/2.8V电平,所以大家在实际应用中很少遇到因为IO电平不一致而导致不识卡的情况;
- 插拔卡每个管脚的定义,可以通过下图形象的理解;

- 需要特别指出的是,贴片SIM卡,有时也会叫做ESIM或者芯片卡,其在功能和原理上与插拔卡没有任何区别,只是一个长得像手机卡,一个长得像芯片,一个需要SIM卡座,一个需要焊接,一个很方便拆卸,一个可以防止松动,各有优缺点,但在技术上合宙的模组都支持,因为本质上没有区别;
关于贴片SIM卡,常见的规格如下,仅供参考,具体请与您实际供应商确认;
中移物联网eSIM芯片(C2X2)产品规格书V3.0.pdf
-
贴片SIM卡和虚拟机(有时也叫做vSIM或者softSIM)是两回事,合宙模组不支持虚拟卡;
-
也可以使用"SIM1+模拟开关"的方式实现双卡单待,我们验证调试过的SIM卡模拟开关为BCT4567;
SIM卡模拟开关-多路复用器_BCT4567EFE-TR_规格书.pdf
3、参考设计;
- 双卡设计时,推荐SIM1带插入检测功能,且配合SIM卡座的规格,保证在SIM卡插入后USIM_DET信号悬空而不是接地,可以进一步降低功耗;
- 双卡设计且其中之一为贴片SIM卡时,推荐使用SIM2接贴片SIM卡,SIM1接SIM卡座;
- SIM1注意事项;
a. USIM_DET为SIM卡插入检测管脚,是在需要热插拔检测,或者双卡切换时,配合软件业务逻辑时才需要;如果只有一张卡,且开机前就插入了SIM卡(也就是说不需要热插拔),这时可以不接USIM_DET,悬空即可;
b. USIM_DET推荐默认使用WAKEUP2,当然使用其它WAKEUP或GPIO中断也可以;
c. WAKEUP2被命名为USIM_DET,目的是为了引导大家默认使用WAKEUP2用作USIM_DET,当产品设计中不需要USIM_DET时,该管脚WAKEUP2与其它WAKEUP信号没有区别,也可以用作它用;
d. 虽然WAKEUP2被推荐默认用作USIM_DET,但LuatOS底层固件里并没有将WAKEUP2与SIM卡插入检测做固定关联,也就是说,WAKEUP2作为USIM_DET使用时的中断逻辑,需要自己写代码实现,比如,WAKEUP2默认为高,由高变低时SIM卡插入;
USIM_DET代码示例;
--设置防抖,USM_DET脚的常量为gpio.WAKEUP2,直接填即可
gpio.debounce(gpio.WAKEUP2,500)
--设置中断触发,拔卡进入飞行模式,插卡进出飞行模式,val值为上升沿或者下降沿触发0/1
gpio.setup(gpio.WAKEUP2,function(val)
if val==0 then
log.info("拔卡")
mobile.flymode(0,true)
else
log.info("插卡")
mobile.flymode(0,true)
mobile.flymode(0,false)
end

- SIM2注意事项;
a. 请严格按照SIM2参考设计电路进行设计,SIM2可以接SIM卡座,也可以接贴片SIM卡;
b. USIM2,无论电源还是信号(CLK/DATA/RST),均为复用模组的其它管脚;
USIM2_VDD,与USIM1_VDD使用同一个电源LDOSIM;
USIM2_RST,与CAM_BCLK(GPIO4)复用,二者不可同时使用;
USIM2_CLK,与CAM_CS(GPIO5)复用,二者不可同时使用;
USIM2_DAT,与CAM_RX0(GPIO6)复用,二者不可同时使用;
注意!
GPIO23,也就是PIN99,也常被称为Vref,需要配置为一直输出高,为USIM2_CLK提供上拉,保证USIM2_CLK在Stop时保持高电平以符合SIM卡时序规范;注意!不能用VDD_EXT代替,因为VDD_EXT在低功耗模式下不能一直保持输出,详见第十二章节关于VDD_EXT的介绍;
c. USIM2_CLK为什么需要上拉到Vref(PIN99:GPIO23)?

SIM_VDD在SIM卡初始化完成之后,只有在需要通信时才会打开,在空闲时会关闭输出以降低功耗,SIM1_VDD和SIM2_VDD都是同一路SIM_VDD;
SIM1_CLK是专门的SIM卡电路,SIM1_CLK在CLK Stop时保持在高电平,符合SIM卡规范
SIM2_CLK是用GPIO模拟的SIM卡电路,SIM2_CLK(GPIO5)在CLK Stop时无法确定保持在高电平状态,不符合SIM卡规范,有可能会造成某些时序要求严格的SIM卡无法被识别,所以需要将SIM2_CLK(GPIO5)上拉到一个固定输出的电压,且该电压需要与SIM2_CLK(GPIO5)的电平一致;
AGPIO无论在正常工作状态还是休眠状态下都可以保持高电平输出,且电平跟SIM2_CLK(GPIO5)一致,所以,可以将AGPIO保持输出高电平做为SIM2_CLK(GPIO5)的上拉电平使用;
- 任意一个AGPIO都可以作为该上拉电平使用,我们的习惯是将模组PIN99:GPIO23默认作为该电平使用,所以该管脚也常被命名为Vref;
PIN99:GPIO23并不会在启用SIM2时自动设置为高电平输出,需要单独设置,设置方式同其它GPIO一样,详见LuatOS核心库GPIO中的描述;
设置GPIO23输出高电平;
设置gpio23为输出,且初始化电平为高 gpio.setup(23, 1);
d. 使用SIM2时,必须使用API函数mobile.simid(1)进行切换,否则模组不会自动初始化SIM2;
关于mobile.simid()的详细说明,见:43 mobile - 合宙模组资料中心 ;
mobile.simid(id, priority)
功能
获取当前 SIM 卡槽,或者切换卡槽
参数
id
参数含义:SIM卡的编号, 例如0, 1, 如果支持双卡,可以填2来自适应;
如果不填就直接读取当前卡槽;
数据类型:number;
取值范围:0、1或2;
是否必选:可选传入此参数,不填为读取当前卡槽;
注意事项:Air780EXXX系列和Air8000系列模块,填写2时会占用4个IO口(gpio4/5/6/23);
参数示例:0 -- 表示使用第一张SIM卡
priority
参数含义:是否优先用SIM0;
如果不填就直接读取当前卡槽;
数据类型:boolean;
取值范围:true优先用SIM0,false则由具体平台决定;
是否必选:可选传入此参数;默认是false,必须在开机就配置,否则就无效了;
注意事项:只有SIM卡编号写2自适应才有用
参数示例:true -- 表示在自适应模式下优先使用SIM0
返回值
local result = mobile.simid(id, priority)
result
含义说明:当前sim卡槽编号;
数据类型:number;
取值范围:整数,若失败返回-1;
返回示例:0 -- 表示当前使用的是第一张SIM卡
示例
mobile.simid() -- 获取sim卡槽编号
mobile.simid(0) -- 固定使用SIM0
mobile.simid(1) -- 固件使用SIM1
mobile.simid(2) -- 自动识别SIM0, SIM1, 优先级看具体平台
mobile.simid(2, true) -- 自动识别SIM0, SIM1, 且SIM0优先
-- 提醒, 自动识别是会增加时间的
e. "SIM卡自动切换功能测试模块,实现卡1/卡2网络异常自动切换"的相关demo;

- SIM卡插拔时极易产生静电,电路上需要添加TVS保护;
推荐TVS型号如下;
样品购买链接:SIM和GPIO用,DFN1006-2封装,AR3321P1LV,应能微-淘宝网
4、特别提示;
SIM卡不识卡,使用万用表测量SIM卡电源VDD_SIM没有电压,怎么办???
a. 首先,需要明确的是,是因为模组没有识别到卡,所以VDD_SIM没有电压,并不是因为VDD_SIM没有电压所以识别不到SIM卡,因果关系不要反了,这几乎是所有新用户都会遇到的常识性的认知错误;
b. 真实原因是:
SIM卡在初始化时,系统会尝试4次与SIM卡交互,此时VDD_SIM也会打开 4 次,分别在1.8V和3.3V交替检测,若检测不到SIM卡,VDD_SIM卡就会关闭,因此在检测不到 SIM卡的情况下你用万用表测量USIM_VDD总是低电平;
下图为使用示波器测量出来的对应SIM卡未被识别到时的波形;

c. 一般来说,不识别卡的主要原因大概有如下几个;
-
SIM卡封装做错;
-
SIM卡接触不良;
-
SIM卡信号线连错;
-
SIM卡信号使用的TVS容值太大,导致SIM卡信号变形严重;
-
SIM卡信号线上的电阻(22Ω)和电容(33pF)组成的滤波网络在某些PCB上可能会影响到信号完整性,可能需要将33pF电容拿掉,电阻由22Ω更换为0Ω后测试验证,如确有影响,则在实际量产中修改即可;
-
SIM卡本身不良,一般做法是先使用个人手机SIM卡对比测试;
-
SIM2不识别时,大概率是没有设置 mobile.simid(1) 导致的,详见 43 mobile - 合宙模组资料中心;
-
SIM2由GPIO复用而来,所以模组底层软件并不会主动轮询识别SIM1和SIM2,只会默认初始化识别SIM1,初始化SIM2需要主动设置 mobile.simid(1) ,再次强调!
5、关于模组、SIM卡和运营商三者的关系;
- 不同国家、以及同一国家的不同运营商,所能支持的4G频段是不完全相同的,以中国的三大运营商为例:
| FDD | TDD | |
|---|---|---|
| 中国移动 | B3 B8 | B34 B38 B39 B40 B41 |
| 中国电信 | B1 B3 B5 | |
| 中国联通 | B1 B3 B8 |
- 其它国家运营商所能支持的频段是哪些?
我们根据网络资料整理如下,但是只能作为参考,不保证绝对正确;
a. https://docs.openluat.com/air8000/product/pinduan/
b. https://docs.openluat.com/air780ehnehu/product/air780ehnfreq/
c. https://docs.openluat.com/air780ehnehu/product/air780ehufreq/
- 为什么模组要区分为国内模组和海外模组,为什么不能支持全球通呢?
a. 不同的频段,都需要一定的射频元器件,比如双工滤波器;
b. 这些射频元器件,除了会增加成本,最重要的是占用模组PCB的空间;
c. 在模组PCB空间一定的情况下,就要对所能支持的射频频段进行排列组合;
d. 所以,以Air780Exx为例,Air780EHN支持北美频段,Air780EHU支持欧亚频段,Air780EPM等国内型号支持国内频段;
e. 需要特别说明的是,Air780EHN Air780EHU Air780EPM(代表国内型号)的区别是硬件区别,不是软件区别,并不能通过刷不同的软件变换支持不同的国家或地区;
f. 非常重要的一点,如果某个模组型号没有覆盖某个国家或地区运营商的所有频段,但是部分覆盖了,比如:
Air780EPM支持FDD B1 B3 B5 B8,其中某个国家的某个运营商支持的频段是B3 B7 B20等,我可以因为Air780EPM所支持的B3与该运营商所支持的B3相同而认为可以在该国家使用吗?
答案是:不可以;原因是你不能确保该运营商的所有基站都支持B3,大多数基站都是只支持该运营商所支持的所有频段中的1个或几个但无法保证全部覆盖,所以,不可以使用;
举个中国运营商中国移动的例子,虽然中国移动支持FDD B3 B8和TDD B34 B38 B39 B40 B41,但是你无法得知你所在区域的基站到底是支持的哪个或哪几个频段,你只有全部支持,才能确保你的产品在任何基站覆盖的地方可以联网,这也是Air780EPM为什么必须支持FDD B1 B3 B5 B8和TDD B34 B38 B39 B40 B41这么多频段才能号称国内全网通的原因(国内全网通,也就是支持中国移动 电信 联通三大运营商);
-
合宙Air700ECP Air700ECH Air700ECT三款模组是一个比较特别的存在,因为产品定义追求极致小,所以只支持中国移动,不支持中国电信和中国联通,请在选型时务必注意!
-
与其说SIM卡跟模组的关系,不如说运营商跟模组的关系,因为SIM卡都是运营商发售的、可以接入本运营商基站网络的"身份证",运营商和模组的关系在上面已经介绍过了,主要是频段的对应;
-
除了频段对应外,对海外模组和海外运营商来说,还有一个非常重要的知识点:APN,这是海外和中国非常重要的不同点:
a. 中国运营商的流量卡一般不需要设置APN,海外运营商的流量卡一般都需要设置APN,如果不设置APN就会造成无法接入;
b. 虽然我们在模组固件中提供了一定的海外APN预置,但是也没办法保证100%正确且有效,所以,在你的产品设计中务必要设计手动设置APN的方式方法;
c. 国内有很多海外流量卡的中间商,俗称卡贩子,提供了各种各样的海外流量漫游服务,相关技术和使用方法需要跟他们确认,我们作为模组供应商,只能保证频段可以满足需求,在SIM卡和运营商匹配上,需要大家跟SIM卡供应商、以及实际的场测来保证;
- 合宙的海外模组型号,只过了CE和FCC认证,没有过相关国家和地区的运营商认证,也没有在相关国家或地区组织实地场测,需要大家自行在批量发货前做好实地场测,请大家灵活评估这一点是否会对你的业务有影响;
6、关于LuatOS中SIM相关的介绍;
以下为两个常见的API,更详细的请点击:43 mobile - 合宙模组资料中心 ;
mobile.imsi(index)
功能
获取 IMSI(国际移动用户识别码)
参数
index
参数含义:编号;
数据类型:number;
取值范围:0或1,不填默认0;
是否必选:可选传入此参数;
注意事项:必须等待sim卡准备就绪后,才能获取成功;
在支持双卡的模块上才会出现0或1的情况;
参数示例:0 -- 表示获取第一张SIM卡的IMSI
返回值
local result = mobile.imsi(index)
result
含义说明:当前的IMSI值;
数据类型:string;
取值范围:IMSI字符串,若失败返回nil;
返回示例:"460111234567890" -- IMSI字符串
示例
if mobile.simPin() then
log.info("SIM卡准备就绪,开始获取imsi")
log.info("imsi", mobile.imsi())
else
log.info("SIM卡未准备就绪,可能未插入SIM卡或SIM卡有问题")
end
mobile.iccid(id)
功能
获取或设置 ICCID(集成电路卡识别码)
参数
id
参数含义:SIM卡的编号;
数据类型:number;
取值范围:0或1,不填默认0;
是否必选:可选传入此参数;
注意事项:必须等待sim卡准备就绪后,才能获取成功;
参数示例:0 -- 表示获取第一张SIM卡的ICCID
返回值
local result = mobile.iccid(id)
result
含义说明:ICCID值;
数据类型:string;
取值范围:ICCID字符串,若失败返回nil;
返回示例:"89860855102480513111" -- 一个20位的ICCID字符串
示例
if mobile.simPin() then
log.info("SIM卡准备就绪,开始获取iccid")
log.info("iccid", mobile.iccid())
else
log.info("SIM卡未准备就绪,可能未插入SIM卡或SIM卡有问题")
end