Air780Exx系列模组管脚说明
作者:陆相成
零,写在前面;
-
合宙Air780Exx模组,主要是指合宙支持LuatOS二次开发的Air780Exx系列模组;
-
本文默认以Air780EPM为例进行说明,当遇到Air780EPM无法支持的管脚或功能时才会特别说明;
-
Air780Exx系列支持LuatOS二次开发的模组,截止到现在共包含:Air780EPM Air780EHM Air780EHV Air780EGP Air780EGG Air780EGH ;
一,管脚分类;

Air780EPM 共有 109 个管脚,大致可以分为如下几类:
1. 对内供电输入管脚,VBAT;
2. 对外供电输出管脚,VDD_EXT;
3. 开机键管脚,PWRKEY;
4. 复位键管脚,RESET;
5. 下载使能管脚,USB_BOOT,也常被简称为 BOOT;
6. 模数转换管脚,ADC;
- ADC1;
- ADC2;
- ADC3;
- ADC4;
7. USB 管脚;
- VBUS ;
- USB_DP;
- USB_DM ;
8. SIM 卡管脚,包括 SIM1 和 SIM2;
- SIM1;
- VDD_SIM1;
- SIM1_DAT;
- SIM1_CLK;
- SIM1_RST;
- SIM2;
- VDD_SIM2;
- SIM2_DAT;
- SIM2_CLK;
- SIM2_RST;
9. 天线管脚,LTE_ANT,4G 和 WiFi Scan 共用;
10. NC 管脚,因为各种原因,或者为了兼容之前,或者为了兼容其它型号,虽然存在但是并没有实际功能的管脚,这些管脚通常被标注为 NC、Reserved、悬空或不标注任何文字;
11. 数字 IO 管脚,比如 GPIO、PWM、UART、ONEWIRE、SPI、I2C、LCD、Camera、CAN 接口等; 这类管脚,因为最常用的功能是 GPIO,所以也常被称作 GPIO 管脚,实际可以复用为多种功能; 下表是 LuatOS 已经支持的 IO 管脚的复用关系,我们会在后面的章节里详细介绍。

二,对内供电,VBAT;

1. 模组管脚:PIN42/43;
2. 电源特性;
- 电压范围:3.3V-4.35V;
- 电流需求:1A以上,所以通常需要并联搭配220uF电解电容或者22uF钽电容以用于瞬时大电流的输出响应;
3. 电池供电; - 常规型锂电池的放电范围是一般是3.2V-4.2V,为了更好地保护锂电池,一般将放电截止电压规定为3.3V; - 高压型锂电池的放电范围是一般是3.2V-4.35V,一样的原因,为了更好地保护锂电池,一般将放电截止电压规定为3.3V; - 其它类型的电池,比如锂锰电池、锂亚电池,放电截止电压可能低至2.0V,这种类型的电池需要在系统中增加升压DCDC,使其在放电期间供给模组的电压保持在3.3V以上; 用于这种场景下的升压型DCDC我们使用过的是ETA1161; ETA1161
4. 电源供电;
- 这里说的电源,指的是类似于充电器这样的、通过AC/DC转换器为系统供电的电源形式,后面我们统一称这种电源形式为直流电源;
- 直流电源的供电电压,市场上常见的有5V/9V/12V/18V/24V等,不同的输入电压,选择不同的降压型DCDC;
- DCDC的输出电压,建议设置在3.8V,且需要特别注意的是:
有些DCDC在上电初始时的输出电压有可能会上窜到超出设置的输出电压值很多,比如,设置输出电压为3.8V,上电初始时的输出电压高达6V甚至7V以上,非常大概率的将模组的芯片或射频PA打坏,务必特别注意!
用于这种场景下的降压型DCDC我们使用过的是JW5357和JW5103;
JW5357,用于输入电压低于 18V 以下的场景;
JW5357
JW5103,用于输入电压低于 36V 以下的场景;
JW5103
5. 耐压特性;
- 长时间的正常工作,不能高于4.5V,包括偶尔的尖峰电压;
为了兼容电池和直流电源两种供电形式,电池电压一般低于4.35V,直流电源经过DCDC降压后一般设置为3.8V输出,因此,模组的正常工作电压范围一般规定为3.3V-4.35V;
- 短时的浪涌尖峰电压,不能高于5V,否则有可能将模组损坏;
- VBAT处使用的TVS选型建议:
TVS应保证VRWM略大于芯片最大工作电压(4.5V),VBR典型值在5.3V左右,最大VBR值建议不超过6V,钳位电压VC尽量小,建议浪涌IPP大于160A,IPP=100A (8*20uS脉冲)的钳位电压约为7.5V;
建议型号,芯禾微 XESD317D-4V5;
XESD317D-4V5
6. 特别提醒! - 虽然模组正常工作建议的电压范围是3.3V-4.35V,但是模组实际可以开机运行的电压最低可以到2.1V,但是,请特别注意如下提示: 1. 当模组IO电平设置为1.8V和VBAT供电为2.1V且模组可以开机运行时,此时IO电平可以正常保持1.8V,但射频指标,包括发射功率和接收灵敏度,已经严重恶化,甚至无法正常驻网; 2. 当模组IO电平设置为3.3V和VBAT供电为2.1V且模组可以开机运行时,此时IO电平实际输出为2.0V,且射频指标,包括发射功率和接收灵敏度,已经严重恶化,甚至无法正常驻网; 3.因此,再次强调,模组正常工作建议的电压范围是3.3V-4.35V,过低电压会导致射频指标恶化甚至无法正常驻网; - 模组上电开机时,需确保VBAT上电时的起始电压小于0.5V,否则可能会因电压临界状态造成模组时序混乱而无法正常开机;关于这一点的详细介绍,会在“开机时序”章节进行详细介绍;
1. 实际应用中最常见的问题是:
掉电关机后短时间内再上电,但是在此期间系统上大电容的电未放完,导致VBAT电压停留在0.5V至2.0V中间,模组主芯片部分功能无法完全关闭,导致再上电时开机时序不符合要求而无法正常开机;
2. 记忆中有客户做的项目,大电容完全放电完毕用时需要将近30秒左右,非常容易导致陷入"为何无法开机、模组是不是坏了"的长时间分析中;
3. 常见的余电快速放电电路有两种;
第一种,优势是电路简单,缺点是功耗较高且会一直损耗,进而导致放电速度无法设置的太快(放电电阻R4不能使用阻值太小的电阻);

第二种,优势是只有在断电的情况下才会放电,不会产生额外的功耗,缺点是电路相对复杂,且由于单向导电电路(二极管 D1)的存在会导致工作端电压有损耗(二极管压降 0.3V);

7. VBAT 电压可以检测,具体见 LuatOS 核心库"ADC"章节的介绍 1 adc - 合宙模组资料中心 ; adc.CH_VBAT
常量含义:VBAT供电电压的通道id;
数据类型:number;
常量取值:-2;
示例代码:adc.open(adc.CH_VBAT);
常量含义:VBAT 供电电压的通道 id; 数据类型:number; 常量取值:-2; 示例代码:adc.open(adc.CH_VBAT);
adc.open(adc.CH_VBAT)--打开adc.CH_VBAT通道
local data6 = adc.get(adc.CH_VBAT)--获取adc.CH_VBAT计算值,将获取到的值赋给data6
adc.close(adc.CH_VBAT)--关闭adc.CH_VBAT通道
log.info("VBAT", data6)--打印adc.CH_VBAT计算值
三,开机键,PWRKEY;

1. 模组管脚:PIN7;
2. 功能说明;
-
模组工作电压范围 3.3V-4.35V,PWRKEY 为开机键, 内部上拉至 VBAT;
-
如果 PWRKEY 接地,芯片上电即开机;
-
PWRKEY 可以直接接地,也可以串联电阻接地;
- 串联电阻接地时,最大阻值不应该超过 10K,否则有可能无法正常开机;
- 相对于直接接地,串联电阻的作用是 PWRKEY 因内部上拉到 VBAT 而引起的漏电流可以进一步减小;
PWRKEY 不接地时:
1. 模组关机状态下,检测到 PWRKEY 下降沿,模组启动上电流程;
2. 当系统在启动状态下检测到 PWRKEY 下降沿时触发中断,是否进入关机过程或其他动作由软件决定;
3. 模组上电开机时,需确保 VBAT 上电时的起始电压小于 0.5V,否则可能会因低电压造成模组时序混乱而无法正常开机;关于这一点的详细介绍,会在“开机时序”章节进行详细介绍;
3. 关于PWRKEY的详细参数介绍,见下表;
| 参数 | 描述 | 规格 | 单位 | ||
|---|---|---|---|---|---|
| Min | Typ. | Max | |||
| PWRKEY | |||||
| 高电平 | High-level input voltage | 1.7 | 3.6 | V | |
| 低电平 | Low-level input voltage | 1.1 | V | ||
| 低功耗模式 pm.WORK_MODE,1 | LowPower Voltage | 1.7 | 1.9 | 2.1 | V |
| PSM+模式 pm.WORK_MODE,3 | PSM+ Voltage | 1.7 | 1.9 | 2.1 | V |
| 上拉电阻 | Pull-up Resistance | 130k | 180k | 230k | Ω |
4. 当PWRKEY接实体按键进行拉低执行开机、关机或中断输入动作检测时,实体按键键帽与底座接触时极易产生静电,因此,需要增加TVS进行保护;
推荐物料,芯禾微 XESD100N-3V3;XESD100N-3V3
5. 开机前,PWRKEY是开机键;开机后,PWRKEY就是一个中断输入,执行什么动作取决于软件的设置;
关于 PWRKEY 作为中断输入的 LuatOS 库函数介绍,详见:21 gpio - 合宙模组资料中心;
| 常量 | 类型 | 常量取值 | 解释 | 参数示例 | 适用产品型号 |
|---|---|---|---|---|---|
| gpio.LOW |
number |
0 | 低电平 |
gpio.set(17, gpio.LOW) | 全支持 |
| gpio.HIGH | number |
1 | 高电平 | gpio.set(17, gpio.HIGH) | 全支持 |
| gpio.PULLUP | number |
1 | 上拉 | gpio.setup(17, nil, gpio.PULLUP) | 全支持 |
| gpio.PULLDOWN | number |
2 | 下拉 |
gpio.setup(17, nil, gpio.PULLDOWN | 全支持 |
| gpio.RISING |
number |
0 | 上升沿触发 |
gpio.setup(27, irqFunc, gpio.PULLUP, gpio.RISING) | 全支持 |
| gpio.FALLING | number | 1 | 下降沿触发 | gpio.setup(27, irqFunc, gpio.PULLUP, gpio.FALLING) | 全支持 |
| gpio.BOTH |
number |
2 | 双向触发 |
gpio.setup(27, irqFunc, gpio.PULLUP, gpio.BOTH) | 仅Air780EXXX系列/Air8000系列支持 |
| gpio.WAKEUP0 | number | 39 | 休眠唤醒脚0,不支持输出 | gpio.setup(gpio.WAKEUP0, nil) | 仅Air780EXXX系列/Air8000系列支持 |
| gpio.WAKEUP1 |
number |
40 | VBUS,USB唤醒脚,不支持输出 |
gpio.setup(gpio.WAKEUP1, nil) | 仅Air780EXXX系列/Air8000系列支持 |
| gpio.WAKEUP2 |
number |
41 | USIM热插拔脚,不支持输出 |
gpio.setup(gpio.WAKEUP2, nil) | 仅Air780EXXX系列/Air8000系列支持 |
| gpio.WAKEUP3 |
number |
42 | 休眠唤醒脚3,与GPIO20是同一个引脚 |
gpio.setup(gpio.WAKEUP3, nil) | 仅Air780EXXX系列/Air8000系列支持 |
| gpio.WAKEUP4 |
number |
43 | 休眠唤醒脚4,与GPIO21是同一个引脚 |
gpio.setup(gpio.WAKEUP4, nil) | 仅Air780EXXX系列/Air8000系列支持 |
| gpio.WAKEUP5 |
number |
44 | 休眠唤醒脚5,与GPIO22是同一个引脚 |
gpio.setup(gpio.WAKEUP5, nil) | 仅Air780EXXX系列/Air8000系列支持 |
| gpio.WAKEUP6 |
number |
45 | 休眠唤醒脚6,不支持输出 |
gpio.setup(gpio.WAKEUP6, nil) | 仅Air8000系列支持 |
| gpio.AUDIOPA_EN |
number |
22 | 音频PA使能脚,仅Air780EHV特有的引脚 |
gpio.setup(gpio.AUDIOPA_EN, 0) | 仅Air780EHV支持 |
| gpio.PWR_KEY | number | 46 | 开机前:开机键,下降沿时触发; 开机后:双向触发中断,不支持输出; |
gpio.setup(gpio.PWR_KEY, nil) | 仅Air780EXX系列/Air8000系列支持 |
四,复位键,RESET;

1. 模组管脚:PIN15;
2. 功能说明;
-
模组 Reset 管脚为系统硬复位,低有效;
-
模组 Reset 高电平应大于 1.3V 且不大于 3.6V;
-
如果 MCU GPIO 通过三极管连接到模块的 RESET,则要求三极管的截止漏电流小于 0.5uA。否则,由于 RESET 内部上拉微弱,大漏电可能会将 RESET 拉到 1.3V 以下进而造成模组无法正常工作;
-
在三极管漏电流不能保证的情况下,可使用 MOS 管代替三极管, 大多数 MOS 漏电流相对较低;
-
如果外部高电平可能将 RESET 拉至 1.3V 以下,则需要外加上拉电阻使其在合理范围内;
-
模组 Reset 容易受到干扰而引起异常复位,如有必要可在 Reset 引脚上添加 RC 滤波电路;

3. 关于 RESET 的详细参数介绍,见下表;
| 参数 | 描述 | 规格 | 单位 | ||
|---|---|---|---|---|---|
| Min | Typ. | Max | |||
| RESET | |||||
| 高电平 | Input High Voltage | 1 | 3.6 | V | |
| 低电平 | Input Low Voltage | 0.3 | V | ||
| 低功耗模式 pm.WORK_MODE,1 | LowPower Voltage | 1 | 1.15 | 1.3 | V |
| PSM+模式 pm.WORK_MODE,3 | PSM+ Voltage | 1 | 1.15 | 1.3 | V |
| 上拉电阻 | Pull-up Resistance | 80k | 120k | 160k | Ω |
4. 当RESET接实体按键进行拉低执行开机、关机或中断输入动作检测时,实体按键键帽与底座接触时极易产生静电,因此,需要增加TVS进行保护;
推荐物料,芯禾微 XESD100N-3V3;XESD100N-3V3
5. 注意!RESET是硬件重启,不是软件重启,也不是关机;
RESET只接受外部输入,模组软件无法直接操作RESET;
五,复位键,RESET;

1. 模组管脚:PIN15;
2. 功能说明;
-
模组Reset管脚为系统硬复位,低有效;
-
模组Reset高电平应大于1.3V且不大于3.6V;
-
如果MCU GPIO通过三极管连接到模块的RESET,则要求三极管的截止漏电流小于0.5uA。否则,由于RESET内部上拉微弱,大漏电可能会将RESET拉到1.3V以下进而造成模组无法正常工作;

-
在三极管漏电流不能保证的情况下,可使用MOS管代替三极管, 大多数MOS漏电流相对较低;
-
如果外部高电平可能将RESET拉至1.3V以下,则需要外加上拉电阻使其在合理范围内;
-
模组Reset容易受到干扰而引起异常复位,如有必要可在Reset引脚上添加RC滤波电路;

3.关于RESET的详细参数介绍,见下表;

4.当RESET接实体按键进行拉低执行开机、关机或中断输入动作检测时,实体按键键帽与底座接触时极易产生静电,因此,需要增加TVS进行保护;
推荐物料,芯禾微XESD100N-3V3;XESD100N-3V3 5. 注意!RESET是硬件重启,不是软件重启,也不是关机; RESET只接受外部输入,模组软件无法直接操作RESET;
六,BOOT 键,USB_BOOT;

1. 模组管脚:PIN82;
2. 功能说明;
- USB_BOOT,顾名思义通过操作该管脚从而使模组 Boot from USB,也就是进入 USB 下载模式;
- USB_BOOT,软件初始化完成之前默认 I&PD 状态,即"输入 + 下拉",因此,该管脚: 悬空或外部下拉时,Boot from Flash; 上拉至 VDD_EXT 时,Boot from USB;
- USB_BOOT 管脚可以复用为 GPIO0,但需要注意: 开机初始化完成之前,固定为 USB_BOOT 功能; 开机初始化完成之后,可以复用为 GPIO0 功能; 在设计硬件电路时,需要避免在开机初始化之前对该管脚形成事实性的上拉效果,否现会导致模组等待 Boot from USB 至少 30 秒后才可以启动 Boot from Flash 正常开机流程;
- USB_BOOT 管脚的详细描述如下图所示;

3. USB_BOOT 复用为 GPIO0 时的详细参数介绍,见下表;
| 参数 | 描述 | 规格 | 单位 | ||
|---|---|---|---|---|---|
| Min | Typ | MAX | |||
| GPIO0,VDD_EXT=1.8V | |||||
| VDD | IO Supply Voltage | 1.8 | V | ||
| 输入高电平 | High-level input voltage | 0.7*VDD | V | ||
| 输入低电平 | Low-level input voltage | 0.2*VDD | V | ||
| 输出高电平 | High-level output voltage | 0.8*VDD | V | ||
| 输出低电平 | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式 pm.WORK_MODE,1 | LowPower Voltage | 0 | V | ||
| PSM+模式 pm.WORK_MODE,3 | PSM+ Voltage | 0 | V | ||
| 输出高电平时的驱动能力 | Digital High, Output Current | 4 | 6 | 9 | mA |
| 输出低电平时的驱动能力 | Digital Low, Output Current | 4 | 6 | 9 | mA |
| 上拉电阻 | Pull-up Resistance | 110k | 160k | 210k | Ω |
| 下拉电阻 | Pull-down Resistance | 160k | 210k | 260k | Ω |
| GPIO0,VDD_EXT=2.8V | |||||
| VDD | IO Supply Voltage | 2.8 | V | ||
| 输入高电平 | High-level input voltage | 0.7*VDD | V | ||
| 输入低电平 | Low-level input voltage | 0.2*VDD | V | ||
| 输出高电平 | High-level output voltage | 0.8*VDD | V | ||
| 输出低电平 | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式 pm.WORK_MODE,1 | LowPower Voltage | 0 | V | ||
| PSM+模式 pm.WORK_MODE,3 | PSM+ Voltage | 0 | V | ||
| 输出高电平时的驱动能力 | Digital High, Output Current | 5.3 | 14 | 29.1 | mA |
| 输出低电平时的驱动能力 | Digital Low, Output Current | 4.2 | 18 | 25.4 | mA |
| 上拉电阻 | Pull-up Resistance | 55k | 85k | 115k | Ω |
| 下拉电阻 | Pull-down Resistance | 70k | 100k | 130k | Ω |
| GPIO0,VDD_EXT=3.3V | |||||
| VDD | IO Supply Voltage | 3.3 | V | ||
| 输入高电平 | High-level input voltage | 0.7*VDD | V | ||
| 输入低电平 | Low-level input voltage | 0.2*VDD | V | ||
| 输出高电平 | High-level output voltage | 0.8*VDD | V | ||
| 输出低电平 | Low-level output voltage | 0.15*VDD | V | ||
| 低功耗模式 pm.WORK_MODE,1 | LowPower Voltage | 0 | V | ||
| PSM+模式 pm.WORK_MODE,3 | PSM+ Voltage | 0 | V | ||
| 输出高电平时的驱动能力 | Digital High, Output Current | 9.6 | 14.9 | 20.8 | mA |
| 输出低电平时的驱动能力 | Digital Low, Output Current | 11.6 | 22.4 | 36.3 | mA |
| 上拉电阻 | Pull-up Resistance | 58k | 77k | 109k | Ω |
| 下拉电阻 | Pull-down Resistance | 49k | 78k | 138k | Ω |
4. 当RUSB_BOOT接实体按键进行拉低执行开机、关机或中断输入动作检测时,实体按键键帽与底座接触时极易产生静电,因此,需要增加TVS进行保护;
推荐物料,芯禾微 XESD100N-3V3;
5. 注意!USB_BOOT只接受外部输入,模组软件无法直接操作RESET;
七,USB 接口;

1. 模组管脚;
-
VBUS,PIN61;
-
USB_DM,PIN60;
-
USB_DP,PIN59; 说明: 图中所示的 USB_DN 正确的写法应该是 USB_DM,历史原因一直将错误写法延续到了现在; USB_DM,USB Data Minus,USB 数据负信号; USB_DP,USB Data Positive,USB 数据正信号;
2. 功能说明;
-
支持 USB Full speed,全速模式,最高支持 12Mbps,即 1.5MB/s;
-
支持 USB High speed,高速模式,最高支持 480Mbps,即 40MB/s;
-
支持 USB 下载软件,Boot from USB;
-
支持 USB RNDIS,搭配 Windows/Linux 实现快速上网;
-
仅支持 USB Slave,不支持 USB HOST;
3. 相关提示;
与 USB 相关的操作,重点关注如下几个方面:
- 上电开机前将 USB_BOOT(GPIO0)上拉至 VDD_EXT,模组将进入 USB 下载模式(Boot from USB);
- 模组内部用于 USB 部分供电的电源是 LDO33USB(3.3V 输出),该 LDO 只为 USB 功能提供电源,模组管脚未引出;
- 低功耗模式 pm.WORK_MODE,1 和 PSM+ 模式 pm.WORK_MODE,3 下会将 LDO33USB 关闭;
- 模组 VBAT 最低 2.3V 左右(实测最低可至 2.1V)时仍可工作,但因此时 LDO33USB 的输入(2.3V)已远低于输出(3.3V)所以 USB 已无法正常工作;
- VBUS,在模组内部实际接的是 WAKEUP1,USB_VBUS 的 5V 经过分压后接到 WAKEUP1,用于 USB 插入检测;
4. 硬件参考设计;

-
USB 接口的 PCB 设计中,差分信号线(USB_DP/USB_DM)的阻抗需控制在 90Ω±10%(即 81Ω~99Ω),这是保证信号完整性的关键参数,阻抗不匹配将会导致信号反射、眼图闭合、误码率上升,甚至通信失败;
-
布线原则: 1. 差分对等长匹配:长度差控制在 5mil 以内,避免时序偏差和共模干扰; 2. 减少换层过孔:每次换层加一对回流地过孔,维持信号回流路径连续性,降低阻抗不连续风险; 3. 保持完整参考平面:避免跨分割,优先内层布线,包地处理减少串扰;
-
USB 接口容易引入静电干扰,因此需要在电路上增加 TVS 保护; USB High speed 差分数据线选择 TVS 的最关键参数是结电容容值,需要小于 1pF; 我们验证使用过的是芯禾微 XESD124N-5V0 ; XESD124N-5V0
-
VBUS 电源上使用的 TVS 我们使用过的是 XESD307D-5V0 ; XESD307D-5V0
5. 与USB相关的LuatOS API;
- pm 库 52 pm - 合宙模组资料中心 ;
pm.USB
常量含义:USB的供电使能;
数据类型:number;
常量取值:0;
适用产品:Air780E系列、Air700E系列、Air8000系列;
示例代码:--如下方所示,关闭USB的供电使能,即可关闭USB功能;
pm.power(pm.USB ,false)
-
mobile库 43 mobile - 合宙模组资料中心 ;
mobile.CONF_USB_ETHERNET
常量含义:蜂窝网络模块的USB以太网卡控制;
数据类型:number;
常量取值:11;
取值范围:0x01:开启RNDIS功能;
0x03:开启RNDIS功能,使用NAT模式(基站分配ip);
0x05:开启ECM功能;
0x07:开启ECM功能,使用NAT模式(基站分配ip);
注意事项:控制设备的USB以太网卡功能,通过位操作来控制不同的功能;
仅在开启前可以修改;bit2:协议选择(1ECM协议,0RNDIS协议);
必须在飞行模式下设置才能生效;
仅支持Air780EXXX系列和Air8000系列模块;
示例代码:-- 进入飞行模式
mobile.flymode(0, true)
-- 设置开启RNDIS协议(bit0=1, bit1=1, bit2=0 → 0x03)
mobile.config(mobile.CONF_USB_ETHERNET, 0x03)
-- 退出飞行模式
mobile.flymode(0, false)
-
UART 库 66 uart - 合宙模组资料中心 ;
uart.VUART_0
常量含义:usb虚拟端口(适用于Air780EXX系列和Air8000系列模组);
数据类型:number;
常量取值:32;
示例代码: uart.setup(uart.VUART_0, 115200, 8, 1);
八,上电/下载/复位/WakeUp时序;
上电时序、复位时序、下载时序,主要跟几个主要因素有关:
VBAT,供电;
时钟,系统运行的Clock信号;
PWRKEY,开机键;
RESET,复位键;
硬件BOOT,即USB_BOOT管脚的硬件操作,悬空或上拉;
软件BOOT,即软件开始执行BOOT动作,Boot from USB、UART or Flash;
说明:
虽然模组可以支持UART下载,本章节后面的内容也会简单说明UART下载,但建议请默认仅支持USB下载进行电路设计和实际操作;
1. 上电时序(PWRKEY不接地);

2. 上电时序(PWRKEY接地);

3. 上电下载时序(PWRKEY不接地);

4. 上电下载时序(PWRKEY接地);

5. 复位时序;

6. WakeUp时序; 说明:
1. WAKEUP主要用于模组处于 低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 下的休眠唤醒功能;
2. 关于WAKEUP的作用,在接下来的后续章节会详细说明,本处先仅作简单的时序介绍;

九,双卡单待,SIM1/SIM2;

1. 模组管脚;
-
SIM1; VDD_SIM1,PIN14; SIM1_DAT,PIN11; SIM1_RST,PIN12; SIM1_CLK,PIN13;
-
SIM2; VDD_SIM2,PIN65; SIM2_DAT,PIN64; SIM2_RST,PIN63; SIM2_CLK,PIN62;
2. 功能说明;
-
模组支持双卡,但只能单待;
-
模组SIM1为原生SIM卡接口,SIM2的数字信号为GPIO模拟,电源共用SIM1;
-
复用为SIM2的GPIO,在硬件上同时被引到了不同的模组管脚上,比如: USIM2_RST,与CAM_BCLK(GPIO4)复用,二者不可同时使用; USIM2_CLK,与CAM_CS(GPIO5)复用,二者不可同时使用; USIM2_DAT,与CAM_RX0(GPIO6)复用,二者不可同时使用; 这里的不可同时使用,是指在同一个硬件产品上,使用SIM2时就不能再使用GPIO4/5/6,包括这三个GPIO可以复用的其它功能,比如Camera、I2C、UART等,具体见GPIO复用表;

-
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电平不一致而导致不识卡的情况;
-
也可以使用"SIM1+模拟开关"的方式实现双卡单待,我们验证调试过的SIM卡模拟开关为BCT4567; BCT4567
3. 参考设计;
-
双卡设计时,推荐SIM1带插入检测功能,且配合SIM卡座的规格,保证在SIM卡插入后USIM_DET信号悬空而不是接地,可以进一步降低功耗;
-
双卡设计且其中之一为贴片SIM卡时,推荐使用SIM2接贴片SIM卡,SIM1接SIM卡座;
-
SIM1注意事项; 1. USIM_DET为SIM卡插入检测管脚,不需要时可以不接; 2. USIM_DET推荐默认使用WAKEUP2,当然使用其它WAKEUP或GPIO中断也可以; 3. WAKEUP2被命名为USIM_DET,目的是为了引导大家默认使用WAKEUP2用作USIM_DET,当产品设计中不需要USIM_DET时,该管脚WAKEUP2与其它WAKEUP信号没有区别,也可以用作它用; 4. 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
end)
5.USIM_DET需上拉至某一AGPIO,比如AGPIO3(GPIO23,软件可以控制一直高电平输出,此管脚在某些文档中也常被称为Vref),不能使用VDD_EXT(低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 下不能一直输出,后续的章节中会详细介绍);

SIM2 注意事项; 1. 请严格按照 SIM2 参考设计电路进行设计,SIM2 可以接 SIM 卡座,也可以接贴片 SIM 卡;
2. USIM2,无论电源还是信号(CLK/DATA/RST),均为复用模组的其它管脚;
USIM2_VDD,与 USIM1_VDD 使用同一个电源 LDOSIM;
USIM2_RST,与 CAM_BCLK(GPIO4)复用,二者不可同时使用;
USIM2_CLK,与 CAM_CS(GPIO5)复用,二者不可同时使用;
USIM2_DAT,与 CAM_RX0(GPIO6)复用,二者不可同时使用;
3. 使用 SIM2 时,必须使用 API 函数 mobile.simid(1)进行切换,否则模组不会自动初始化 SIM2;
关于 mobile.simid(2)的详细说明,见:[43 mobile - 合宙模组资料中心](https://docs.openluat.com/osapi/core/mobile/) ;
4. SIM 卡插拔时极易产生静电,电路上需要添加 TVS 保护;
推荐 TVS 型号为芯禾微 XESD100N-3V3 ;
[XESD100N-3V3](file/XESD100N-3V3 Rev. 0.1.pdf){:target="_blank"}
4. 特别提示; - SIM 卡不识卡,使用万用表测量 SIM 卡电源 VDD_SIM 没有电压,怎么办???
1. 首先,需要明确的是,是因为模组没有识别到卡,所以 VDD_SIM 没有电压,并不是因为 VDD_SIM 没有电压所以识别不到 SIM 卡,因果关系不要反了,这几乎是所有新用户都会遇到的常识性的认知错误;
2. 真实原因是:
SIM 卡在初始化时,系统会尝试 4 次与 SIM 卡交互,此时 VDD_SIM 也会打开 4 次,分别在 1.8V 和 3.3V 交替检测,若检测不到 SIM 卡,VDD_SIM 卡就会关闭,因此在检测不到 SIM 卡的情况下你用万用表测量 USIM_VDD 总是低电平;
下图为使用示波器测量出来的对应 SIM 卡未被识别到时的波形;
3. 一般来说,不识别卡的主要原因大概有如下几个;
- SIM 卡封装做错;
- SIM 卡接触不良;
- SIM 卡信号线连错;
- SIM 卡信号使用的 TVS 容值太大,导致 SIM 卡信号变形严重;
- SIM 卡本身不良,一般做法是先使用个人手机 SIM 卡对比测试;
- SIM2 不识别时,大概率是没有设置 mobile.simid(1) 导致的,详见 [43 mobile - 合宙模组资料中心](https://docs.openluat.com/osapi/core/mobile/#mobilesimidid-priority);
- SIM2 由 GPIO 复用而来,所以模组底层软件并不会主动轮询识别 SIM1 和 SIM2,只会默认初始化识别 SIM1,初始化 SIM2 需要主动设置 mobile.simid(1) ,再次强调!
5. 关于 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
十,模数转换,ADC;

1. 模组管脚;
-
ADC0,PIN9;
-
ADC1,PIN96;
-
ADC2,PIN77;
-
ADC3,PIN76;
2. 功能说明;
- 虽然我们习惯在沟通和交流中习惯称为 ADC,但更为准确的称呼应该是 AUXADC,AUXADC 是芯片内部的辅助 ADC 通道,主要用于温度监测、电池电量检测等;
- 模组共有 4 个 AUXADC 通道,包含以下三个主要功能:
1. 外接模拟电压信号检测通路;
- 选择内部分压电路,适用于外接信号电压范围为 0~3.3V;
- 选择直通 AUXADC 输入端的通路, 适用于电压范围 0-1.6V,或经外部分压后在 1.6V,分压后电压范围需控制在 0~1.6V;
2. VBAT 电压检测通路;
- VBAT 电压经过分压电路到达 AUXADC 输入口;
3. 温度传感器检测通路;
- 模组芯片内部温度检测:芯片温度发生变化时,片内 Thermal Sensor 的电压信号也会随之变化,将 THM_VBE 信号送至 AUXADC 测试;
ADC 内部框图;

注意!
-
图中用 AIO 表示从外部输入到模组内部 AUXADC 的部分,可以理解为直接连接到模组 ADC 管脚的电平;
-
片内电阻绝对偏差 MAX= ±8.5%(-40~85 ℃),片内电阻的相对偏差,阻值比误差 MAX=+/-0.15%(-40~85 ℃);
-
AUXADC 可以选择内部分压,也可以选择外部分压,不管选择外部分压还是内部分压,都需要调整合适的分压比,保证 AUXADC 输入端电压在 0~1.6V 范围;
-
当被测电压低于 1.6V 时,外部无需分压,内部也无需分压,LuatOS ADC 函数对应选择 adc.ADC_RANGE_MIN 常量;
-
当被测电压低于 3.3V 时,外部无需分压,内部需要分压至 1.6V 以内,LuatOS 已将该部分在底层做好,ADC 函数对应选择 adc.ADC_RANGE_MAX 常量即可;
-
当被测电压大于 3.3V 时,内部无需分压,外部需要分压至 1.6V 以内,LuatOS 已将该部分在底层做好,ADC 函数对应选择 adc.ADC_RANGE_MAX 常量即可;
-
读取模组芯片温度的常量为 adc.CH_CPU ,可检测温度范围为 -40 °C ~ 85 °C ,外部硬件电路上无需任何操作;
-
读取 VBAT 电压的常量为 adc.CH_VBAT ,电压范围为 2.2V-4.8V,在 VBAT 输入电压范围 3.3V-4.35V 之内,外部硬件电路上无需任何操作;
-
关于以上说明,汇总表格如下:
| Channel | Application | Input Range | 外部分压 | 内部分压 | ADC函数常量 |
|---|---|---|---|---|---|
| AIO1~4 | Input signal come from the outside direct signal. | 0V ~ 1.6V | 不需要 | 不需要 | adc.ADC_RANGE_MIN |
| AIO1~4 | Input signal comes from the outside divided signal. | 0V ~ 3.3V以上 | 需要分压至1.6V以内 | 不需要 | adc.ADC_RANGE_MIN |
| AIO1~4 | Input signal come from the outside direct signal. | 0V ~ 3.3V | 不需要 | 需要,LuatOS底层操作 | adc.ADC_RANGE_MAX |
| 温度 | Inner thermal sensor generate the signal | -40 °C ~ 85 °C | 无需任何操作 | 无需任何操作 | adc.CH_CPU |
| VBAT | VBAT voltage input | 2.2V ~ 4.5V | 不需要 | 需要,LuatOS底层操作 | adc.CH_VBAT |
10. 关于 LuatOS 中 ADC 的介绍,详见:[1 adc - 合宙模组资料中心](https://docs.openluat.com/osapi/core/adc/)
3.ADC 的详细参数介绍,如下表;

4.特别注意事项;
-
AUXADC 的有效输入范围为 0.1V~1.5V,在 0~0.1V 和 1.5V~1.6V 范围可能存在较大误差,不建议使用;
-
外部分压时,如果 AUXADC 输入电压无法满足低于 1.6V,以 NTC 电阻为例,可使用如下图右侧所示电路进行分压设计;

-
如果不希望 ADC 变化太快,可以通过软件算法处理,过滤掉变化较大的数值,也可以在硬件电路上增加滤波电路; 比如,外部分压时,可以增加滤波电容增加 ADC 输入稳定性,但缺点是 ADC 的细微变化会被过滤掉,请根据实际需要谨慎选择; 说明:R300 可以增加 ESD 能力,阻值建议为 510Ω,不建议使用 K 级阻值的电阻;

5.关于 LuatOS 中 ADC 的介绍,详见:1 adc - 合宙模组资料中心 ; 特别说明:
-
所有 ADC 共用一个通道,同时只能调用一路 ADC 采样,包括芯片温度、VBAT 电压;
-
ADC 打开( adc.open() )后,会产生约 500uA 的功耗,如需低功耗控制,请将 ADC 关闭( adc.close() ); .
local function adc_all_task() while 1 do sys.wait(1000)--延时1S adc.setRange(adc.ADC_RANGE_MIN)--设置ADC引脚的测量范围0-1.5V,这种方式被测电压可以经过外部电阻分压后再挂在ADC上; adc.open(0)--打开ADC通道0 local data0 = adc.get(0)--获取adc计算值,将获取到的值赋给data0 adc.close(0)--关闭ADC通道0 log.info("adc通道0", data0)--打印adc计算值 adc.open(1)--打开ADC通道1 local data1 = adc.get(1)--获取adc计算值,将获取到的值赋给data1 adc.close(1)--关闭ADC通道1 log.info("adc通道1", data1)--打印adc计算值 adc.open(2)--打开ADC通道2 local data2 = adc.get(2)--获取adc计算值,将获取到的值赋给data2 adc.close(2)--关闭ADC通道2 log.info("adc通道2", data2)--打印adc计算值 adc.open(3)--打开ADC通道3 local data3 = adc.get(3)--获取adc计算值,将获取到的值赋给data3 adc.close(3)--关闭ADC通道3 log.info("adc通道3", data3)--打印adc计算值 adc.open(adc.CH_CPU)--打开adc.CH_CPU通道 local data5 = adc.get(adc.CH_CPU)--获取adc.CH_CPU计算值,将获取到的值赋给data5 adc.close(adc.CH_CPU)--关闭adc.CH_CPU通道 log.info("CPU TEMP", data5)--打印adc.CH_CPU计算值 adc.open(adc.CH_VBAT)--打开adc.CH_VBAT通道 local data6 = adc.get(adc.CH_VBAT)--获取adc.CH_VBAT计算值,将获取到的值赋给data6 adc.close(adc.CH_VBAT)--关闭adc.CH_VBAT通道 log.info("VBAT", data6)--打印adc.CH_VBAT计算值 end end sys.taskInit(adc_all_task)
十一,对外电源,VDD_EXT;

1. 模组管脚; * VDD_EXT,PIN24;
2. 功能说明;
- VDD_EXT,是模组主芯片内部的一个LDO,其主要作用是为模组大部分IO(或者叫做GPIO)提供电源;
- VDD_EXT,是模组主芯片内部的一个LDO,但并不是唯一一个LDO,也并不是模组所有的IO都由VDD_EXT负责供电;
- 大家可以看到和可以使用的模组IO,共有内部的两个LDO负责供电,一个是VDD_EXT,一个是LDO_AON,其中,LDO_AON仅供内部使用,未在模组管脚引出;
- VDD_EXT和LDO_AON分别负责哪些IO?二者有什么区别?见下表;
- VDD_EXT和LDO_AON都是上电后自动开启,也都无法软件自定义关闭,不同的是:
1. LDO_1.8V,开机后一直保持1.8V,不可更改电压数值大小;
2. LDO_AON,开机后一直开启,低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 不关闭,因此,其电压域下的IO,包括AGPIO、AGPIOWU、WAKEUP和Reset,在 低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 下都可以保持工作;
LDO_AON的详细状态,如下表所示;
| VDD_EXT | 电压可调 | 输出状态 |
| --------------------- | ------------------- | ----------------------------------------------------------------------------------------- |
| 常规模式pm.WORK_MODE,0 | 完全开启1.8V/2.8V/3.3V | 1)上电开机后自动开启,初始电压为1.8V,之后调整至模组定义的IO默认电平3.3V;如需自定义调整,可通过pm.ioVol()配置;<br><br>2)电流输出上限200mA; |
| 低功耗模式 pm.WORK_MODE,1 | 间歇性输出1.8V/2.8V/3.3V | 3)低功耗模式pm.WORK_MODE,1 状态下间歇性输出,频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个; |
| PSM+模式 pm.WORK_MODE,3 | 完全关闭 | 4)PSM+模式(pm.WORK_MODE,3)下完全掉电; |
3. VDD_EXT,开机后的状态比较复杂,如下表所示:
| VDD_EXT | 电压可调 | 输出状态 |
| --------------------- | ------------------- | ----------------------------------------------------------------------------------------- |
| 常规模式pm.WORK_MODE,0 | 完全开启1.8V/2.8V/3.3V | 1)上电开机后自动开启,初始电压为1.8V,之后调整至模组定义的IO默认电平3.3V;如需自定义调整,可通过pm.ioVol()配置;<br><br>2)电流输出上限200mA; |
| 低功耗模式 pm.WORK_MODE,1 | 间歇性输出1.8V/2.8V/3.3V | 3)低功耗模式pm.WORK_MODE,1 状态下间歇性输出,频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个; |
| PSM+模式 pm.WORK_MODE,3 | 完全关闭 | 4)PSM+模式(pm.WORK_MODE,3)下完全掉电; |
VDD_EXT,由于在 低功耗模式 pm.WORK_MODE,1 下状态为间线性输出,既不是完全打开,也不是完全关闭,因此,其电压域下的IO,GPIO0-19和GPOIO29-38,在低功耗模式 pm.WORK_MODE,1 下也会跟VDD_EXT一样,随着系统间歇性唤醒与基站交互而频繁产生高脉冲(重点是无法保持高电平或低电平),间歇性唤醒频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个;
4. VDD_EXT和LDO_AON都是通过函数 pm.ioVol() 设置输出电压,且 pm.ioVol() 对二者同时进行修改,所以大家看到的模组的所有IO,包括VDD_EXT电压域和LDO_AON电压域,电平都是同时修改且保持一致;
3. VDD_EXT详细参数;

4. 特别注意事项;
-
VDD_EXT标称输出电流最大至200mA,但是,VDD_EXT同时用于模组芯片内部和外部,为了保证内部该电压域负载的使用稳定性,请保证外部负载消耗电流不要超过50mA;
-
VDD_EXT在 低功耗模式pm.WORK_MODE,1 状态下间歇性输出,频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个,因此,在可能影响低功耗模式pm.WORK_MODE,1 下中断唤醒的场合,要避免使用VDD_EXT做上拉电平用,比如UART1电平转换电路(UART1为LPUART,低功耗模式pm.WORK_MODE,1 下可被唤醒); 如下图所示,如果VREF使用VDD_EXT,那么低功耗模式pm.WORK_MODE,1 下模组的UART1_RX频繁的高低电平变化就会将模组唤醒,进而导致模组退出低功耗模式而功耗无法降低;

5. VDD_EXT相关LuatOS API;
-
VDD_EXT相关LuatOS API,请看pm库:52 pm - 合宙模组资料中心 ;
-
配置IO电平,其实就是配置给IO供电的LDO,包括VDD_EXT和LDO_AON; 相应的,配置VDD_EXT,就可以通过配置IO电平来实现;
-
pm.ioVol(id, val)
id
含义说明:需要配置高电平电压的对象;
数据类型:number;
取值范围:0;
注意事项:对象id仅有pm.IOVOL_ALL_GPIO,如命名含义,指配置所有GPIO的高电压电平,调用该接口时模块会以该接口配置的高电压电平调整,无视固件的默认配置和硬件100脚IO_Volt_Set的拉高和拉低配置;
参数示例:--如下方所示,第一个参数为**pm.IOVOL_ALL_GPIO**,所有GPIO高电平输出1.8V;
pm.ioVol(pm.IOVOL_ALL_GPIO, 1800)
val
含义说明:需要配置对象的电压值;
数据类型:number;
取值范围:1650 ~ 2000,2650~3400 , 单位毫伏, 步进50mv;
注意事项:模块会有1.8V和3.3V默认高电平电压的版本,也可调用该接口手动调整,以外围电路要求为主;
参数示例:--如下方所示,第二个参数为**3300**,所有GPIO高电平输出3.3V;
pm.ioVol(pm.IOVOL_ALL_GPIO, 3300)
返回值
local result = pm.ioVol(id, val)
有一个返回值 result
result
含义说明:判断高电平电压调整是否正确执行;
数据类型:boolean;
取值范围:成功时返回true,失败时返回false;
注意事项:注意电压变化前后的外部电阻匹配;
参数示例:--如下方所示,第二个参数为3300,模块所有IO的高电平电压配置为为3.3V;
--result返回true则模块电压转为3.3V;
local result = pm.ioVol(pm.IOVOL_ALL_GPIO, 3300)
示例
pm.ioVol(pm.IOVOL_ALL_GPIO, 3300) -- 所有GPIO高电平配置为3.3V
pm.ioVol(pm.IOVOL_ALL_GPIO, 1800) -- 所有GPIO高电平配置为1.8V
十二,LuatIO,IO初始化配置工具;
1. LuatIO,是一个用于配置合宙模组IO初始化功能的配置工具,也就是说,合宙模组的IO可以复用为多种功能,你的产品里用到的是哪种,你就要先指定使用哪种,比如: Air780EPM,PIN66,如果你要是用其PWM1功能,你就需要在LuatIO工具里先进行指定该管脚使用PWM功能; 说明!PIN66在Air780EPM的管脚图上标注的是I2C1_SDA,为推荐功能,但并不是唯一功能,该管脚可以复用为多种功能,具体见各模组型号的GPIO复用表说明; 当然,其它管脚也一样,模组管脚名仅为选择的一种典型功能做推荐,但并不是唯一功能,各模组型号的GPIO复用表均有详细说明;

2.LuatIO工具详细使用说明:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;
3.以Air780EPM为例,通过LuatIO工具,生产一份json文件:pins_Air780EPM.json,直接跟随项目其它Lua代码下载到Air780EPM模组即可,main代码无需做任何包括类似require的操作;
4.再次强调!合宙任何模组都必须下载各自的pins_Air780EPM.json(以Air780EPM举例说明)文件,否则,对各个IO的操作将无法正常工作;
5.LuatIO工具可以通过LuaTools工具进入,相关截图如下(截图仅为示例说明);



6.让我们再看一次合宙Air780系列模组GPIO复用表,加深印象;
十三,GPIO/AGPIO/AGPIOWU/WAKEUP;

1. 模组管脚;
-
上图虚线所示的管脚,全部可用作GPIO,只是管脚名只写了推荐的默认功能;
-
这些IO管脚,不只是可用作GPIO,也可以用作其它数字信号,比如UART、SPI、I2C、OneWire、PWM、LCD接口、Camera接口、CAN接口、USB_BOOT使能等,详见下图;
-
本章节仅介绍这些IO作为GPIO、AGPIO、WAKEUP、AGPIOWU四类GPIO性质时的功能,其它复用功能将在后续的章节中进行介绍;
-
GPIO,或者叫做普通GPIO,也就是VDD_EXT电压域下的GPIO,也就是在低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 下无法保持固定电平状态(高电平/低电平)输出的GPIO;
说明! PIN82,USB_BOOT,在开机前默认为BOOT使能,Boot from UART or USB or Flash,开机后可以用作GPIO0,但由于USB_BOOT的特殊性,因此复用为GPIO0的功能LuatOS尚未开放,详细介绍请见第五章节;

- AGPIO,或者叫做AONGPIO,也就是Always ON GPIO,也就是LDO_AON电压域下的GPIO,也就是在低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3 下都可以保持固定电平状态(高电平/低电平)输出的GPIO;

- WAKEUP,顾名思义是中断唤醒的"GPIO",之所以加引号,是因为这一类"GPIO"只能用于输入,并不是严格意义上的GPIO,WAKEUP信号工作在LDO_1.8V下(下图所示的PWRKEY除外);
说明!
a\. PWRKEY不是工作在LDO_AON下,我们在第三章节已详细介绍,但PWRKEY在开机后的功能和操作与WAKEUP类似,因此在本章节也将其作为WAKEUP功能进行介绍;
b\. 合宙的模组,3个WAKEUP一般的处理是:WAKEUP0引出到模组管脚供用户自由使用;WAKEUP2引出的模组管脚但推荐用作USIM_DET,当然也可以自定义使用;WAKEUP1模组内部固定用作USB插入检测使用(模组VBUS管脚,经过电压分压后,接WAKEUP1),不能再自定义为其它中断;

* AGPIOWU,简单说就是AGPIO+WAKEUP,既可以配置为AGPIO,也可以配置为WAKEUP;
当配置为AGPIO功能时,其电压域为LDO_AON,可以通过pm.ioVol()配置电平为1.8V/2.8V/3.3V; 当配置为WAKEUP功能时,其电压域为LDO_1.8V,固定为1.8V;

2.功能说明;
首先,我们再看下各类型GPIO和其所处电压域的对应关系;

- 普通GPIO;

a\. 从GPIO号来看,对应GPIO0-19和GPIO29-38,共20个普通GPIO;
b\. 从所属电压域来看,普通GPIO由VDD_EXT负责供电;
c\. VDD_EXT最大电流输出能力是200mA,对应本电压域下的每个GPIO,最大负载电流大约6mA@1.8V,14mA@3.3V,但是所有普通驱动电流总和不能超过200mA;
d\. 如果VDD_EXT需要给外设供电,需要控制总电流消耗不超过50mA,以免VDD_EXT电压域下的这类普通GPIO性能受到影响甚至无法正常工作,且此时给全部普通GPIO可提供的电流总和将降为150mA;
e\. 普通GPIO在"低功耗模式pm.WORK_MODE,1"下会处于间歇性掉电状态,随着系统间歇性唤醒与基站交互而频繁产生高脉冲(电平与pm.ioVol()设置的VDD_EXT电压一致),间歇性唤醒频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个;
f\. 普通GPIO在PSM+模式(pm.WORK_MODE,3)下会处于完全掉电状态;
g\. 普通GPIO配置为GPIO中断功能时,跟所有WAKEUP中断一样都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
h\. 休眠状态下,低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 ,只能通过WAKEUP0-2,AGPIOWU0-2配置为WAKEUP3/4/5,PWRKEY,CHRG_DET,UART1(LPUART)这几个中断输入源可以将模组唤醒,普通GPIO中断在休眠模式下无法唤醒模组;
i\. GPIO0默认用作USB_BOOT,LuatOS没有开放其可以配置作为GPIO0使用的功能;
j\. 普通GPIO在上电或Reset复位时可能会有1ms左右的异常高电平,加下拉电阻(10K)可消除;
- AGPIO;

a. AGPIO0-8,从GPIO号来看,对应GPIO20-28,共9个AGPIO; 其中,GPIO20/21/22三个为AGPIOWU,相对GPIO23-28有特殊特点,因此AGPIOWU会在下面的小章节里会详细介绍; 本章节AGPIO特指的是GPIO23-28,即GPIO23/24/25/26/27/28这6个AGPIO;
b. 从所属电压域来看,AGPIO由LDO_AON负责供电; 说明!LDO_AON仅供内部使用,并未引出到模组管脚上;
c. LDO_AON的总电流输出能力为10mA,对应AGPIO可以分配到的电流能力上限是5mA; AGPIO3-8驱动能力单管脚<=5mA, 但所有AGPIO驱动电流总和也不能超过5mA;;
d. AGPIO3-8,分别对应GPIO23-28,常规模式(pm.WORK_MODE,0)和休眠状态(pm.WORK_MODE,1 和 pm.WORK_MODE,3)下都可以保持固定电平(固定为高或固定为低)输出;
e. AGPIO3-8,既可以作为AGPIO使用(即GPIO输入输出功能),也可以配置为GPIO中断输入;
f. AGPIO3-8虽然在 低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 下可以保持固定电平(固定为高或固定为低)输出,但配置为GPIO中断功能时,是无法在 低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 下触发中断的;
g. AGPIO3-8,配置为中断输入功能时,跟所有WAKEUP中断一样都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
h. 休眠状态下,低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 ,只能通过WAKEUP0-2,AGPIOWU0-2配置为WAKEUP3/4/5,PWRKEY,CHRG_DET,UART1(LPUART)这几个中断输入源可以将模组唤醒,普通GPIO中断在休眠模式下无法唤醒模组;
i. AGPIO3-8 在上电或Reset复位时可能会有1ms左右的异常高电平,可通过加下拉电阻(10K)消除;

- WAKEUP;

-
WAKEUP,共有WAKEUP0/1/2三个,其中,WAKEUP1在模组内部固定用作USB插入检测(VBUS通过分压接到WAKEUP1),所以,用户实际可使用的WAKEUP只有WAKEUP0和WAKEUP2;
-
WAKEUP0和WAKEUP2中,WAKEUP2在合宙大部分模组型号上通常被命名为USIM_DET,也就是默认推荐用作SIM卡插入检测,但是,这个管脚仍然可以自定义使用,并不是只能用作SIM卡插入检测;
-
WAKEUP0/1/2,属于LDO_1.8V电压域,LDO_1.8V的电压固定1.8V不可更改;
-
除WAKEUP外,PWRKEY和CHG_DET在开机后也可以用作中断输入使用,所以,PWRKEY和CHG_DET通常也被拿来与WAKEUP一起介绍,其中: PWRKEY在第三章节已进行介绍,CHG_DET因为未在Air780EPM/EHM引出来所以暂未介绍,可以简单的将CHG_DET和PWRKEY当做完全一样的功能即可(开机前:用作开机键;开机后:用作WAKEUP中断输入); PWRKEY的电压域为VBAT,CHG_DET电压域与WAKEUP一样都是LDO_1.8V;
-
WAKEUP内部上拉/下拉可配置(上拉/下拉电阻250K左右),在休眠模式下可保持配置状态;
-
常规模式(pm.WORK_MODE,0)和休眠状态下(pm.WORK_MODE,1 和 pm.WORK_MODE,3)都可实现中断输入,不可用于输出;
-
WAKEUP管脚内部上下拉非常弱,驱动能力<30uA,外部上下拉电阻建议选择100K阻值;
-
所有WAKEUP中断和GPIO中断都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
-
WAKEUP由于内部电路设计的原因,悬空时电压在1.3V以上时都为正常; 需要强调的是!WAKEUP高电平在1.3V以上才能正常工作,且高电平应大于1.3V且不大于3.6V; 如果外部高电平可能将WAKEUP拉至1.3V以下,则需要外加上拉电阻使其在合理范围内;
-
WAKEUP外接电平输入时可直连电平范围为1.8V-3.6V,或者说可以直接对接1.8V/2.8V/3.3V的MCU而无需电平转换;
-
再次说明!WAKEUP0-2三个WAKEUP一般的处理是: WAKEUP0引出到模组管脚供用户自由使用; WAKEUP2引出的模组管脚但推荐用作USIM_DET,当然也可以自定义使用; WAKEUP1模组内部固定用作USB插入检测使用(模组VBUS管脚,经过电压分压后,接WAKEUP1),不能再自定义为其它中断;
-
如果WAKEUP容易受到干扰而引起异常中断,推荐WAKEUP引脚上添加RC滤波电路,避免异常唤醒;

-
如果系统中的主控MCU通过三极管连接到模块的WAKEUP,则要求三极管的截止漏电流小于0.5uA,否则,由于WAKEUP内部上拉微弱,大漏电可能会将WAKEUP拉到1.3V以下进而造成模组无法正常工作; 三极管漏电流不能保证的情况下,有两种解决方案:
-
三极管电路预留上拉电路,注意VCC电压范围在1.8V~3.6V;
-
在三极管漏电流不能保证的情况下,可使用MOS管代替三极管, 大多数MOS漏电流相对较低;

-
-
AGPIOWU;

-
AGPIOWU,共有三个,AGPIOWU0-2,分别是AGPIOWU0、AGPIOWU1、AGPIOWU2;
-
AGPIOWU0-2用作AGPIO时,分别对应GPIO20/21/22;
-
AGPIOWU0-2用作WAKEUP时,分别对应WAKEUP3/4/5;
-
AGPIOWU0-2配置为AGPIO时,同AGPIO3-8一样,属于LDO_AON电压域; AGPIOWU0-2配置为WAKEUP时,同WAKEUP0-2一样,属于LDO_1.8V电压域;
-
AGPIOWU0/1/2,可以软件配置为AGPIO或WAKEUP两种功能; AGPIOWU0/1/2,软件配置为AGPIO功能后,还可以进一步配置为AGPIO中偏GPIO部分的功能和偏中断输入的功能; AGPIOWU0/1/2,中断输入功能,又可以在软件上进一步选择是配置为GPIO中断还是WAKEUP中断; 说明!AGPIOWU0/1/2配置为GPIO中断时跟普通的GPIO中断时没有区别,也不存在AGPIO中断的说法;

-
AGPIOWU0-2分别配置为AGPIO和WAKEUP时的相关API函数详细说明;
gpio.setup(),第一个参数为是GPIO号时,就作为AGPIO使用,配置为中断功能时就是GPIO中断;
以AGPIOWU0为例,配置为AGPIO时,直接将AGPIOWU0按照GPIO20操作即可;
gpio.setup(20, nil),设置GPIO20为输入;
gpio.setup(20, 0),设置gpio20为输出,且初始化电平为低,使用硬件默认上下拉配置;
gpio.setup(20, 1),设置gpio20为输出,且初始化电平为高,使用硬件默认上下拉配置;
以AGPIOWU0为例,配置为GPIO中断时,直接将AGPIOWU0按照GPIO20操作即可;
--gpio20初始化
gpio.setup(20, gpio_func, gpio.PULLUP)
--设置gpio20为中断,仅上升沿触发
gpio.setup(20, function(val)
print("IRQ_20", val)
end, gpio.PULLUP, gpio.RISING)
gpio.setup(),第一个参数为是WAKEUP号时,就作为WAKEUP中断使用;
以AGPIOWU0为例,配置为WAKEUP3中断时,直接将AGPIOWU0按照gpio.WAKEUP3操作即可;
说明!
gpio.WAKEUP3是WAKEUP3在LuatOS核心库gpio库中定义的常量,详见:
gpio.WAKEUP3
常量含义:休眠唤醒脚3,与GPIO20/WAKEUP3/AGPIOWU0是同一个引脚;
数据类型:number;
常量取值: 42;
示例代码:gpio.setup(gpio.WAKEUP3, nil);
适用产品型号:仅Air780EXXX系列支持,Air8000系列支持;
--WAKEUP3初始化
gpio.setup(gpio.WAKEUP3, gpio_func, gpio.PULLUP)
--设置WAKEUP3为中断,仅上升沿触发
gpio.setup(gpio.WAKEUP3, function(val)
print("IRQ_WAKEUP3", val)
end, gpio.PULLUP, gpio.RISING)
-
AGPIOWU0/1/2配置为GPIO20/21/22时的注意事项;
-
AGPIOWU0/1/2配置为GPIO20/21/22时,每路GPIO的驱动能力只有 30uA,外部上下拉电阻建议选择100K阻值,使用时请务必注意!
-
GPIO20/21/22主要相对普通GPIO来说在休眠模式(pm.WORK_MODE,1 和 pm.WORK_MODE,3)下可以保持固定电平(固定为高或固定为低)输出,普通GPIO不可以;
-
GPIO20/21/22,与AGPIO3-8(GPIO23-28)一样都可以在休眠模式(pm.WORK_MODE,1 和 pm.WORK_MODE,3)下保持固定电平输出,只是,AGPIOWU0-2(GPIO20-22)与AGPIO3-8(GPIO23-28)的驱动能力不同,AGPIOWU0-2的驱动能力(30uA)相对AGPIO3-8的驱动能力(单路<5mA且所有AGPIO总和也要<5mA)要差;
-
AGPIOWU0/1/2配置为WAKEUP3/4/5时的注意事项;
-
常规模式(pm.WORK_MODE,0)和休眠状态下(pm.WORK_MODE,1 和 pm.WORK_MODE,3)都可实现中断输入;
-
WAKEUP内部上下拉非常弱,驱动能力<30uA,外部上下拉电阻建议选择100K阻值;
-
所有WAKEUP中断和GPIO中断都支持双边沿中断,也都支持软件配置内部上下拉,也都支持软件取消内部上下拉而使用外部上下拉;
-
WAKEUP由于内部电路设计的原因,悬空时电压在1.3V以上时都为正常;
-
WAKEUP外接电平输入时可直连电平范围为1.8V-3.6V,或者说可以直接对接1.8V/2.8V/3.3V的MCU而无需电平转换;
-
休眠状态下,低功耗模式pm.WORK_MODE,1/PSM+模式pm.WORK_MODE,3 ,只能通过WAKEUP0-2,AGPIOWU0-2配置为WAKEUP3/4/5,PWRKEY,CHRG_DET,UART1(LPUART)这几个中断输入源可以将模组唤醒,普通GPIO中断在休眠模式下无法唤醒模组;
-
如果硬件容易受到干扰而引起异常中断,推荐WAKEUP引脚上添加RC滤波电路,避免异常唤醒;

-
如果系统中的主控MCU通过三极管连接到模块的WAKEUP,则要求三极管的截止漏电流小于0.5uA,否则,由于WAKEUP内部上拉微弱,大漏电可能会将WAKEUP拉到1.3V以下进而造成模组无法正常工作;
-
三极管漏电流不能保证的情况下,有两种解决方案:
-
三极管电路预留上拉电路,注意VCC电压范围为1.8V~3.6V;
-
在三极管漏电流不能保证的情况下,可使用MOS管代替三极管, 大多数MOS漏电流相对较低;

3. GPIO/AGPIO在软件初始化完成之前是什么状态?
-
这是一个非常常见的问题,所以我们必须单独拎出来把这个问题说清楚;
-
我们先看下GPIO0-19(普通GPIO),GPIO20-28(AGPIO),GPIO29-38(普通GPIO)这39个GPIO在如那件初始化完成之前的状态;

-
其中:
-
I&PU,意思是"输入+内部上拉",也就是在软件初始化完成之前,默认输入,且内部上拉;
-
I&PD,意思是"输入+内部下拉",也就是在软件初始化完成之前,默认输入,且内部下拉;I&PD的管脚只有GPIO0,且GPIO0更重要的功能是USB_BOOT,如果在开机前上拉到VDD_EXT改变默认下拉的状态,则会使能USB下载的功能,这一点我们在第五章节已有详细介绍,也正是因为这个特殊原因,LuatOS尚未开放GPIO0的复用功能,仅作为USB_BOOT使用;
-
NI&NP,意思是"非输入输出,没有上下拉,若需确定的状态,需要在外围电路设计时外加上拉或下拉",在软件初始化完成之前的状态,可以通过外部的上拉或下拉来确定; 4. GPIO/AGPIO/AGPIOWU/WAKEUP详细参数;

5. 常见使用错误;
-
GPIO20/21/22的驱动能力小于30uA,大家在硬件设计时非常容易忽略这一点,常常碰到的错误是,电路上的上拉电阻或者下拉电阻的阻值过小,造成GPIO20/21/22无法正常驱动,进而导致电路失效,所以,建议上下拉电阻值为100K;
-
WAKEUP3/4/5的驱动能力也小于30uA,因此,建议上下拉电阻值在20K到100K之间,根据实际硬件进行调试选择;
-
ESD保护;
-
GPIO/AGPIO/AGPIOWU/WAKEUP在硬件上需要外接按键或者外部高电压输入时,请注意做好保护;
-
高电压输入时,请注意使用光耦做隔离,比如: C127009_晶体管输出光耦_UPC817CG-D04-T_规格书_WJ149952
-
外部按键输入时,我们使用过的TVS是芯禾微 XESD100N-3V3 ; XESD100N-3V3
6. LuatIO工具初始化配置;
-
任何IO管脚,都需要通过LuatIO进行初始化配置,也就是指定这个管脚这么多复用功能你要使用的那一个;
-
LuatIO工具相关介绍LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;
-
有关LuatIO的说明,请见第十二章节中的介绍;
-
以Air780EPM为例,LuatIO工具界面如下;

7. LuatOS相关API;
-
GPIO操作,包括普通GPIO/AGPIO/AGPIOWU/WAKEUP,详见 21 gpio - 合宙模组资料中心 ;
-
GPIO电平设置包括普通GPIO/AGPIO/AGPIOWU/WAKEUP,详见 52 pm - 合宙模组资料中心 ;
-
IO序列操作的相关介绍,详见 31 ioqueue - 合宙模组资料中心 ;
十四,对外"电源",Vref;

1. 本章节的"电源"之所以加引号,是因为并不是真正的电源,既不是模组内部的DCDC,也不是模组内部的LDO,而是模组的一个AGPIO管脚;
2. 大家还记得我们在VDD_EXT章节中对VDD_EXT一个重要特性的介绍吗?
-
VDD_EXT标称输出电流最大至200mA,但是,VDD_EXT同时用于模组芯片内部和外部,为了保证内部该电压域负载的使用稳定性,请保证外部负载消耗电流不要超过50mA;
-
VDD_EXT在 低功耗模式pm.WORK_MODE,1 状态下间歇性输出,频率和与通信协议要求的时间间隔相同,通常为0.64S/1.28S/2.56S中的一个,因此,在可能影响低功耗模式pm.WORK_MODE,1 下中断唤醒的场合,要避免使用VDD_EXT做上拉电平用,比如UART1电平转换电路(UART1为LPUART,低功耗模式pm.WORK_MODE,1 下可被唤醒);
如下图所示,如果VREF使用VDD_EXT,那么低功耗模式pm.WORK_MODE,1 下模组的UART1_RX频繁的高低电平变化就会将模组唤醒,进而导致模组退出低功耗模式而功耗无法降低;

3. UART1电平转换电路里出现的VREF,就是我们今天要介绍的对外"电源":Vref;
4. Vref,本质上指的是AGPIO3-8这6个GPIO23-28,在 低功耗模式pm.WORK_MODE,1 和PSM+模式pm.WORK_MODE,3 下都可以保持固定电平输出的GPIO23-28; 说明!作为Vref使用时,GPIO23-28保持固定电平输出指的是固定高电平输出;
5. 那"电源"为什么要加引号呢?
-
第一,Vref本质只是一个AGPIO,可以在休眠状态下保持高电平输出的GPIO,不是电源;
-
第二,AGPIO3-8的电流输出能力最大只有5mA,且AGPIO3-8这6路GPIO的总电流输出能力最大也只有5mA,从这一点来看,也不能称之为电源;
-
关于AGPIO3-8的详细介绍,大家可以看第十二章节的详细介绍;
6. 在合宙模组的实际应用中,一般默认固定推荐PIN99:GPIO23作为Vref使用,当然:
-
其它5个管脚,GPIO24-28,如果软件设置为一直输出高,也可以作为Vref使用;
-
GPIO23,当然也是一个普通的AGPIO,如果不做Vref,本身与GPIO24-28没有任何区别;
7. 除了上面提到的UART电平转换电路,Vref还在哪些场合经常被用到?
- SIM卡插入检测,给USIM_DET(WAKEUP2)做上拉用; 说明!图中的VREF_VOLIT就是Vref,在不同的原理图中可能存在不同的命名,请理解;

-
在合宙的通信定位二合一模组中,比如Air780EGP/Air780EGG/Air780EGH/Air8000G等型号中,Vref用来作为内置GNSS定位芯片的备用供电电源使用,在Air780EGP/EGG中也作为加速度传感器G-Sensor的供电电源使用,这两处的耗电都非常小,100uA以内,可以满足;
-
再次强调一下,当前合宙自己的模组、开发板、核心板或对外资料中,都是拿PIN99:GPIO23作为Vref使用的,但并不妨碍GPIO23-28也可以作为Vref,也并不妨碍PIN99作为GPIO23使用;
-
需要特别指出的是,如果你的硬件需要在休眠状态下(低功耗模式pm.WORK_MODE,1 和 PSM+模式pm.WORK_MODE,3)也可以稳定输出的电源,请根据需要选择外置的DCDC或者LDO,VDD_EXT在休眠状态下不可以稳定输出,Vref压根就不是"电源",请特别注意! 8. 使用Vref功能的顺序是,先将PIN99配置为GPIO23,再将GPIO23设置为输出高;
-
将PIN99配置为GPIO23,通过LuatIO工具进行配置(详见第十二章节的介绍);

- 设置GPIO23输出高电平;
-- 设置gpio23为输出,且初始化电平为高
gpio.setup(23, 1);
- 需要提醒的是,GPIO23作为Vref使用时会增加系统功耗,通常会增加100uA+,一般不超过200uA,请根据自己应用的定义和需要谨慎设计;
十五,通用UART1/2/3+调试UART0;

1. 合宙Air780Exx系列模组,纯4G类的型号,比如Air780EPM/EHM/EHN/EHU,均有4个UART;
-
UART0,上图所示的PIN38/39,也常被写作DBG_UART,这路UART默认只能用作调试功能使用,不能当做通用UART使用,在实际的产品应用中,UART0需要在PCB上引出测试点,以便在遇到问题需要底层调试信息时使用,注意!UART0波特率仅支持921600bps;
-
UART1,上图所示的PIN17/18,也常被写作MAIN_UART,其核心特点是,相对于UART2/3,UART1支持LPUART; UART和LPUART的主要区别在于功耗、时钟源和通信速率;
-
功耗,LPUART专为低功耗应用设计,适合长时间运行的电池供电设备,而UART通常功耗较高;
-
时钟源,LPUART可由低速时钟(如32.768 kHz)驱动,而UART通常使用更高频率的时钟(26MHz);
-
通信速率,LPUART最高通常只支持到9600 bps,而UART则支持更高的波特率,通常最高到921600bps;
-
因为UART1支持LPUART,所以,低功耗模式pm.WORK_MODE,1 下,UART1接收数据可以将模组唤醒;
-
UART1在 低功耗模式pm.WORK_MODE,1 下仅支持波特率9600bps,一般的做法是,模组进入低功耗模式后,对端MCU先使用波特率9600bps将模组唤醒,然后再同步进入设置好的高速率进行通信,比如常见的115200bps;
-
如果对端MCU不在模组进入低功耗模式时使用9600bps将模组唤醒,造成的后果是,MCU发送过来的前几个字节会被丢掉,直至模组被唤醒后才会被正常接收,大家在系统时务必注意这一点!
-
如果系统设计时,业务逻辑的规划上可以接受丢掉前几个字节,直至模组唤醒后再进行正常的数据通信,也是可以的;
-
UART1在开机之初会固定吐出一些系统log,大家在系统实际时注意将这段信息过滤掉;
-
UART1最高波特率2Mbps,但在使用经典的分立三极管搭建的电平转换电路时,注意最高不能超过460800bps,如需波特率2Mbps通信,请使用专门的电平转换芯片;
-
UART1不支持硬件流控RTS/CTS;
-
UART2,通用UART,在 低功耗模式pm.WORK_MODE,1 下无法将模组唤醒;
-
UART2最高波特率2Mbps,但在使用经典的分立三极管搭建的电平转换电路时,注意最高不能超过460800bps,如需波特率2Mbps通信,请使用专门的电平转换芯片;
-
UART2不支持硬件流控RTS/CTS;
-
UART3,通用UART,在 低功耗模式pm.WORK_MODE,1 下无法将模组唤醒;
-
UART3最高波特率2Mbps,但在使用经典分立三极管搭建的电平转换电路时,注意最高不能超过460800bps,如需波特率2Mbps通信,请使用专门的电平转换芯片;
-
UART3不支持硬件流控RTS/CTS; 2. 合宙Air780Exx系列模组,通信定位二合一类的型号,比如Air780EGP/EGG/EGH,由于其内置的GNSS芯片与主芯片之间通信已占用了UART2,所以外部只能使用UART1和UART3两路UART;
3. UART1/2/3的IO电平,同GPIO电平一样,由函数 pm.ioVol() 控制,比较经典的IO电平是1.8V/2/8V/3.3V; pm.ioVol()详细介绍:https://docs.openluat.com/osapi/core/pm/,也可以见第十二章节关于GPIO的介绍;
4. UART1/2/3能承受的IO电平上限是3.6V,高于3.6V可能会将模组损坏;
5. 当对端MCU的IO电平不是1.8V/2/8V/3.3V中的一种,比如5V,这个时候就需要电平转换电路来进行电平转换,常用的经典分立三极管搭建的电平转换电路如下;

本电路在以上多个章节都有介绍,核心点是:
-
注意Vref,不能用VDD_EXT,原因见第十章节和第十三章节的介绍;
-
本电平转换电路最高支持到460800bps波特率;
-
大于460800bps波特率的电平转换需要使用专用芯片,我们使用过的有艾为和润石的两款型号;
C783414_转换器-电平移位器_RS0102YH8_规格书_WJ152089
C5162543_转换器-电平移位器_AW39112DNR_规格书_WJ61394
6. LuatIO工具初始化配置;
-
任何IO管脚,都需要通过LuatIO进行初始化配置,也就是指定这个管脚这么多复用功能你要使用的那一个;
-
LuatIO工具相关介绍LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;
-
有关LuatIO的说明,请见第十二章节中的介绍;
-
以Air780EPM为例,LuatIO工具界面如下;

7. UART相关LuatOS核心库 66 uart - 合宙模组资料中心 ;

十六,PWM;

1. 管脚图中标注了三个PWM信号,分别是PIN20:PWM1,PIN20:PWM0,PIN26:PWM4,但事实上并非只有这三个管脚可复用为PWM,可以复用为PWM的管脚如下:

2. 从上图可以看出,模组有16个管脚可以复用为PWM;
3. 虽然是16个管脚可以复用为PWM,但并不是这16个管脚可以同时使用; 1. 16个管脚,可以复用的PWM是:PWM0,PWM1,PWM2,PWM4,最多只能同时使用4个,PWM0/1/2/4同时只能有一个管脚复用; 2. 注意!没有PWM3,是PWM0-1-2-4,没有3,请不要用错了;
4. AONPWM,Always ON PWM,休眠状态下可以保持输出,AONPWM0-1,对应AONGPPIO23-25的复用,三个PWM都可以在休眠状态下保持输出;

5. PWM0/PWM0n,PWM1/PWM1n,PWM2/PWM2n,PWM4/PWM4n,为四队PWM互补信号,其中一路为高电平时另一路必为低电平;

6. 在使用任何一个管脚的PWM功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置; 关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心

7. PWM相关LuatOS核心库 54 pwm - 合宙模组资料中心 ; pwm(main.lua)
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "pwm_demo"
VERSION = "001.000.000"
--[[
注意1:部分 PWM 通道通常与 GPIO 引脚绑定,在使用前需要进行复用操作;
参考文档:https://docs.openluat.com/air780epm/common/luatio/;
注意2:PWM 核心库有两种 API 风格:
旧风格(基于pwm.open()):一步完成配置与启动,适合简单固定输出场景;
新风格(基于pwm.setup()):分步操作,支持动态调节占空比和频率,适合需要灵活控制的场景;
]]
log.info("main", PROJECT, VERSION)
-- Task1:旧 API 风格 PWM 输出示例;
local function task1_old_pwm()
log.info("Task1", "启动旧风格 PWM 示例(通道 4)")
local ch = 4
-- 打开 PWM4,并设置信号频率为 1 kHz,分频精度为 100,占空比为 100/100=100%,持续输出;
local pwm_success = pwm.open(ch, 1000, 100, 0, 2147483647) -- 2147483647
-- 判断通道开启情况;
if pwm_success then
log.info("Task1", "PWM4 通道开启成功")
else
log.info("Task1", "PWM4 通道开启失败")
end
-- 等待 3 秒;
sys.wait(3000)
-- 关闭 PWM4;
pwm.close(ch)
log.info("Task1", "PWM4 已关闭")
log.info("Task1", "Task1 结束")
end
-- Task 2:新 API 风格 PWM 输出示例(动态调节);
local function task2_new_pwm()
log.info("Task2", "启动新风格 PWM 示例(通道 4)")
local ch = 4
-- 配置 PWM4 通道:信号频率为 1 kHz,分频精度为 100,占空比为 100/100=100%,持续输出;
local setup_success = pwm.setup(ch, 1000, 100, 0, 100)
-- 判断 PWM 通道参数是否配置成功;
if setup_success then
log.info("Task2", "PWM4 配置成功,稍后可启动")
else
log.info("Task2", "PWM4 配置失败,检查通道或内存")
end
-- 启动 PWM4;
local pwm_success = pwm.start(ch)
if pwm_success then
log.info("Task2", "PWM4 启动成功,稍后可输出信号")
else
log.info("Task2", "PWM4 启动失败,检查通道或内存")
end
-- 等待 2 秒后调整占空比;
-- pwm.setDuty()接口的第二个参数依赖配置时的分频精度;
-- 若分频精度为 100,则此处设置的占空比为 25/100=25%;
sys.wait(2000)
local setduty_success = pwm.setDuty(ch, 25)
if setduty_success then
log.info("Task2", "PWM4 占空比更新为 25%")
else
log.info("Task2", "PWM4 占空比设置失败")
end
-- 再等 2 秒后调整频率;
sys.wait(2000)
local setfreq_success = pwm.setFreq(ch, 2000)
if setfreq_success then
log.info("Task2", "PWM4 频率更新为 2000 Hz")
else
log.error("Task2", "PWM4 频率设置失败")
end
-- 再等 2 秒后停止;
sys.wait(2000)
local pwm_success = pwm.stop(ch)
if pwm_success then
log.info("Task2", "PWM4 停止成功,通道资源已释放")
else
log.info("Task2", "PWM4 停止失败,检查通道或内存")
end
log.info("Task2", "Task2 结束")
end
-- 主演示任务;
local function pwm_demo_task()
log.info("MAIN", "启动 PWM 综合演示任务")
task1_old_pwm() -- 调用旧 API 演示
sys.wait(500) -- 短暂间隔
task2_new_pwm() -- 调用新 API 演示
sys.wait(500) -- 短暂间隔
log.info("MAIN", "PWM 综合演示任务结束")
end
-- 启动任务
sys.taskInit(pwm_demo_task)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
十七,OneWire单总线;

1.上面管脚图中仅标注了一处 PIN23:ONEWIRE 通道,为Air780EPM的推荐默认ONEWIRE管脚,但Air780EPM实际上有四个管脚可以复用为ONEWIRE;

2.虽然Air780EPM有四个管脚可以复用为ONEWIRE,但内部硬件上只有一个通道,所以:
-
如果你的系统设计中只需要用到一路ONEWIRE,那么你可以在任何时间随意使用;
-
如果你的系统设计中需要用到多路ONEWIRE,那么你就需要分时操作了:打开1,关闭1;打开2,关闭2;打开...
3.ONEWIRE最经典的应用是驱动DSB1802,Air780Exx系列客户已量产并出货多款,可以放心使用;
4.如果系统设计时ONEWIRE接的是可插拔外设,建议加上TVS进行,以免被ESD打坏;
5.在使用任何一个管脚的ONEWIRE功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置; 关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;

6.ONEWIRE相关LuatOS核心库 47 onewire - 合宙模组资料中心 ; 参考代码
-- 示例一
-- 初始化OneWire总线
onewire.init(0) -- 初始化硬件单总线ID为0
-- 配置时序参数
onewire.timing(0, false, 0, 480, 70, 70, 410, 70, 10, 10, 15, 70) -- DS18B20标准时序
-- 读取DS18B20温度(假设已知设备存在)
onewire.reset(0, true) -- 复位总线并检测设备
-- 发送温度转换命令
onewire.tx(0, 0x44, false, false, false) -- Convert T命令
sys.wait(750) -- 等待转换完成(12位精度需要750ms)
-- 读取温度数据
onewire.reset(0, true) -- 再次复位
onewire.tx(0, 0xBE, false, false, false) -- Read Scratchpad命令
local succ, data = onewire.rx(0, 9, false, false, false) -- 读取9字节数据
if succ and data and #data == 9 then
-- 计算温度(简化的整数部分)
local temp = data:byte(1) + (data:byte(2) * 256)
if temp > 32767 then temp = temp - 65536 end -- 处理负温度
temp = temp * 0.0625 -- DS18B20的分辨率为0.0625°C
log.info("温度", "读取成功", "温度:", temp, "°C")
end
-- 示例二
-- 初始化总线
onewire.init(0) -- 初始化硬件单总线ID为0
onewire.timing(0, false, 0, 480, 70, 70, 410, 70, 10, 10, 15, 70) -- DS18B20标准时序
-- 定义温度轮询函数
local function pollTemperature()
-- 启动温度转换
onewire.reset(0, true) -- 复位总线
onewire.tx(0, 0x44, false, false, false) -- 发送Convert T命令给所有设备
sys.wait(100) -- 等待转换
-- 读取温度(跳过ROM命令,读取第一个设备)
onewire.reset(0, true) -- 再次复位
onewire.tx(0, 0xCC, false, false, false) -- Skip ROM命令
onewire.tx(0, 0xBE, false, false, false) -- Read Scratchpad命令
local succ, temp_data = onewire.rx(0, 2, false, false, false) -- 读取2字节温度数据
if succ and temp_data and #temp_data == 2 then
local temp = temp_data:byte(1) + temp_data:byte(2) * 256
if temp > 32767 then temp = temp - 65536 end
temp = temp * 0.0625
log.info("温度传感器", temp_data:toHex(), temp, "°C")
end
end
-- 启动定时器轮询
sys.timerLoopStart(pollTemperature, 2000) -- 每2秒轮询一次
-- 示例三
-- 初始化OneWire
onewire.init(0) -- 初始化硬件单总线ID为0
onewire.timing(0, false, 0, 480, 70, 70, 410, 70, 10, 10, 15, 70) -- DS18B20标准时序
-- 定义总线状态检查函数
local function checkBusStatus()
-- 检查总线状态
local present = onewire.reset(0, true)
if present then
log.info("OneWire", "总线正常,设备存在")
-- 尝试读取设备ROM ID(使用Read ROM命令0x33)
onewire.reset(0, true) -- 复位
onewire.tx(0, 0x33, false, false, false) -- Read ROM命令
local succ, rom_data = onewire.rx(0, 8, false, false, false) -- 读取8字节ROM数据
if succ and rom_data and #rom_data == 8 then
log.info("设备ROM", rom_data:toHex())
else
log.warn("OneWire", "读取设备ROM失败")
end
else
log.warn("OneWire", "总线异常,无设备响应")
end
end
-- 启动状态监控定时器
sys.timerLoopStart(checkBusStatus, 5000) -- 每5秒检查一次
十八,SPI专用LCD接口;

1.SPI LCD的接口,固定为PIN49-53;

2. Air780Exx模组,SPI LCD最大支持320*480分辨率,已经调试过的驱动IC有ST7735/ST7735S/ST7789/ST7796/ILI9341/ILI9486/GC9306;
3. 合宙官方淘宝店出售的LCD,驱动IC为ST7796,分辨率为320*480,大小为3.5寸,AirLCD_1000淘宝链接 ;
4. 有一点需要特别说明的是: 虽然LCD的接口我们习惯叫做SPI LCD,但此SPI LCD接口的SPI并不能用作通用SPI总线,只能专用于LCD;
5. 除SPI LCD外,Air780EHM/EHV/EGH/EGG还可以支持QSPI LCD,此处不做详解,管脚如下;

6. Air780Exx系列模组也支持触摸屏功能,从硬件角度来看,触摸功能就是I2C总线的一个应用(触摸IC的接口一般都是I2C总线接口);
7. 在使用SPI LCD功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置;
关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;

8. 跟SPI LCD相关的LuatOS核心库和扩展库都比较多且比较复杂;
-
LCD核心库35 lcd - 合宙模组资料中心 ;
-
TP核心库64 tp - 合宙模组资料中心 ;
-
高通字库核心库22 gtfont - 合宙模组资料中心 ; 好消息!合宙自研矢量字库hzfont扩展库正在开发中,届时就可以省掉高通矢量字库芯片了;
-
exeasyui扩展库7 exeasyui - 合宙模组资料中心 ;
-
AirUI扩展库还在开发之中,推荐使用exeasyui进行设计;
-
正在开发的两个扩展库,exlcd和exlcd,在核心库lcd和核心库tp的基础上进一步增加了易用性和降低了开发门槛,一起期待;
-
需要特别说明的是,SPI核心库61 spi - 合宙模组资料中心 与SPI LCD并无关系,SPI核心库是关于SPI通用总线的核心库,SPI LCD的SPI并不是通用的SPI总线;
十九,SPI专用Camera接口;

1.SPI Camera的接口,固定为PIN54/55/56/80/81;

2. 正如第九章节"双卡单待,SIM1/SIM2"里介绍的一样,SIM2的三个信号线,PIN63:RST/PIN62:CLK/PIN64:DATA,复用的是同时可以复用为Camera信号的PIN80:CAM_BCLK/PIN81:CAM_CS/PIN55:CAMRX0,二者在物理上是"同一个信号,只是连接到了模组不同的两对管脚上",因此,切记二者不可同时使用;
3. Air780Exx最高只支持到30W像素摄像头,目前已支持的驱动IC有GC0310/GC032A/BF30A2等;
4. 合宙官方淘宝店出售的摄像头共有两款,可放心搭配Air780Exx模组使用;
-
AirCamera_1040,item.taobao.com ,GC032A驱动IC,30W像素;
-
AirCamera_1050,item.taobao.com ,GC0310驱动IC,30W像素; 5. 有一点需要特别说明的是: 虽然Camera的接口我们习惯叫做SPI Camera,但此SPI Camera接口的SPI并不能用作通用SPI总线,只能专用于Camera;
6. 在使用SPI Camera功能之前,都需要先使用LuatIO工具生成pins配置json文件,也就是对IO的初始化功能配置; 关于LuatIO功能的介绍,详见:LuatIO初始化配置工具 - common@air780epm - 合宙模组资料中心 ;

7. 跟SPI Camera相关的LuatOS核心库和扩展库都比较多且比较复杂;
-
Camera核心库 6 camera - 合宙模组资料中心 ;
-
I2C总线核心库 27 i2c - 合宙模组资料中心 ;
-
LCD核心库,涉及到预览功能 35 lcd - 合宙模组资料中心 ;
-
需要特别说明的是,SPI核心库61 spi - 合宙模组资料中心 与SPI Camera并无关系,SPI核心库是关于SPI通用总线的核心库,SPI Camera的SPI并不是通用的SPI总线;
二十,SPI通用总线;

1. Air780Exx系列模组共支持2路通用SPI总线,其中PIN83/84/85/86为默认的SPI0,PIN28/29/57/58为可以复用的SPI1(PIN28/29默认功能为UART2,PIN57/58默认功能是UART3);

2. 由上图也可以看出Air780EHV和Air780EGP/EGG/EGH只支持1路SPI0,原因是:
-
Air780EHV因为内置了Audio Codec芯片ES8311,所以内部占用了PIN57/58的I2C0总线,所以PIN57/58外部不可再用,所以Air780EHV也无法将PIN57/58复用为SPI1_CLK/SPI1_MISO,进而Air780EHV也就无法支持SPI1通道了;
-
Air780EGP/EGG/EGH因为内置了GNSS定位芯片,所以内部占用了PIN28/29的UART2串口,所以PIN28/29外部不可再用,所以Air780EGP/EGG/EGH也无法将PIN28/29复用为SPI1_CS/SPI1_MOSI,进而Air780EGP/EGG/EGH也就无法支持SPI1通道了;
