Air720SL 是上海合宙物联网于2019年11月下旬发布的一款基于ASR1802S芯片组的物联网通讯模块。 模块通讯性能优越,速度充分满足Cat4标准,支持最大下行速率 150Mbps 和最大上行速率50Mbps。EVB_Air720SL是针对720SL模块设计的开发板,本文我将针对开发板的IO口的使用继续进行介绍,本文重点介绍利用IO口作为输入的情况。
本文要介绍的内容
3) 测试Air720SL 上电IO口初始状态及输入电平检测功能
Air720 GPIO介绍
720SL 共有GPIO接口37个,电平均为1.8V 最大输出电流约2mA。 其中下侧引出GPIO口18个,上侧引出GPIO口为17个, 共35个,除被I2C2端口复用的GPIO49,50从右侧引脚单独引出外,上下两侧排针包括了模块所有GPIO,分布如下图
编写代码,通过串口调试助手控制IO口输入状态
Air720系列最常见的接口为UART串口,其中Air720SL支持两个硬件串口和三个软串口,其中名为 “ASR Modem Device 3 AT” 可以映射到Luat编程环境,Lua环境下虚拟串口ID为129,波特率自适应。
GPIO口当作为输入状态下使用时可以通过软件配置成弱上拉,弱下拉,和无拉状态,可以弱电流输出,输出电流约5uA
下面我们定义一个简单的小指令来控制上下拉状态电平:
GPIO,<port#>,<status>
GPIO是关键字,port#是GPIO的序号,status为9代表无拉,status为8代表下拉低电平,status为7代表上拉高电平
然后编写如下代码,进行GPIO输出测试
DEMO.lua
require "utils"
require "pm"
require "pins"
module(..., package.seeall)
--IO口状态发生改变时的IO中断响应函数
function gpioIntFnc(msg)
--按照demo板对应的引脚排列打印IO口状态
local J2_Status_UP=pio11().."|"..pio28().."|"..pio26().."|"..pio18().."|".."G".."|".."A".."|"..pio64().."|"..pio17().."|".."U".."|"..pio20().."|"..pio62()
local J2_Status_DN=pio10().."|"..pio27().."|"..pio25().."|".."B".."|".."G".."|".."A".."|"..pio65().."|".."U".."|"..pio23().."|".."U".."|"..pio24()
local J1_Status_UP=pio38().."|"..pio41().."|"..pio40().."|"..pio39().."|"..pio52().."|"..pio34().."|"..pio33().."|"..pio31().."|"..pio32().."|"..pio29()
local J1_Status_DN="V".."|"..pio37().."|"..pio32().."|"..pio51().."|"..pio36().."|"..pio35().."|"..pio61().."|".."G".."|"..pio30().."|"..pio63()
log.info("-","")
log.info("-","")
log.info("-","")
log.info("-","")
log.info("-","--------------------------------------------------")
log.info("J1","--------------------------------------------------")
log.info("J2_UP",J2_Status_UP)
log.info("J2_DN",J2_Status_DN)
log.info("-","--------------------------------------------------")
log.info("J1_UP",J1_Status_UP)
log.info("J1_DN",J1_Status_DN)
log.info("-","--------------------------------------------------")
log.info("-","--------------------------------------------------")
log.info("-","")
log.info("-","")
log.info("-","")
log.info("-","")
if msg==cpu.INT_GPIO_POSEDGE then
--上升沿中断
else
--下降沿中断
end
end
--初始化IO口状态
--------------------------------------------GPIO初始化---------------------------------------------
pio11 = pins.setup(11, gpioIntFnc)
pio10 = pins.setup(10, gpioIntFnc)
pio28 = pins.setup(28, gpioIntFnc)
pio27 = pins.setup(27, gpioIntFnc)
pio26 = pins.setup(26, gpioIntFnc)
pio25 = pins.setup(25, gpioIntFnc)
pio18 = pins.setup(18, gpioIntFnc)
pio64 = pins.setup(64, gpioIntFnc)
pio65 = pins.setup(65, gpioIntFnc)
pio17 = pins.setup(17, gpioIntFnc)
--pio22 = pins.setup(22, gpioIntFnc)
--pio66 = pins.setup(66, gpioIntFnc)
pio23 = pins.setup(23, gpioIntFnc)
pio20 = pins.setup(20, gpioIntFnc)
--pio21 = pins.setup(21, gpioIntFnc)
pio62 = pins.setup(62, gpioIntFnc)
pio24 = pins.setup(24, gpioIntFnc)
pio38 = pins.setup(38, gpioIntFnc)
pio41 = pins.setup(41, gpioIntFnc)
pio37 = pins.setup(37, gpioIntFnc)
pio40 = pins.setup(40, gpioIntFnc)
pio42 = pins.setup(42, gpioIntFnc)
pio39 = pins.setup(39, gpioIntFnc)
pio51 = pins.setup(51, gpioIntFnc)
pio52 = pins.setup(52, gpioIntFnc)
pio36 = pins.setup(36, gpioIntFnc)
pio34 = pins.setup(34, gpioIntFnc)
pio35 = pins.setup(35, gpioIntFnc)
pio33 = pins.setup(33, gpioIntFnc)
pio61 = pins.setup(61, gpioIntFnc)
pio31 = pins.setup(31, gpioIntFnc)
pio32 = pins.setup(32, gpioIntFnc)
pio30 = pins.setup(30, gpioIntFnc)
pio29 = pins.setup(29, gpioIntFnc)
pio63 = pins.setup(63, gpioIntFnc)
pio49 = pins.setup(49, gpioIntFnc)
pio50 = pins.setup(50, gpioIntFnc)
-------------------------------------------- 配置串口 --------------------------------------------
-- 串口ID,串口读缓冲区
local UART_ID, sendQueue, writeBuff, writeBusy = 129, {}, { {}, {} }, false
-- 串口超时,串口准备好后发布的消息
local uartimeout, recvReady = 25, "UART_RECV_ID"
--保持系统处于唤醒状态,不会休眠
pm.wake("mcuart")
uart.setup(UART_ID, 912600, 8, uart.PAR_NONE, uart.STOP_1, nil, 1)
uart.on(UART_ID, "receive", function(uid)
table.insert(sendQueue, uart.read(uid, 8192))
sys.timerStart(sys.publish, uartimeout, recvReady)
end)
function write(uid, str)
uart.write(uid, str)
end
-- 向串口发送收到的字符串
sys.subscribe(recvReady, function()
local str = table.concat(sendQueue)
-- 串口的数据读完后清空缓冲区
if (string.sub(str,1,4)=="GPIO") then
--分割命令
local splitlist = {}
string.gsub(str, '[^,]+', function(w) table.insert(splitlist, w) end)
--lua下标从1开始
local s_GPIO=splitlist[2]
local s_STATUS=splitlist[3]
local i_GPIO=tonumber(s_GPIO)
local i_STATUS=tonumber(s_STATUS)
--设置GPIO 上拉下拉无拉
pio.pin.setpull(i_STATUS,i_GPIO)
end
sendQueue = {}
log.info("uart read length:", #str,"Port"..UART_ID)
write(UART_ID, str.."->OK")
end)
main.lua
PROJECT = "UART_GPIO_OUTPUT_TEST"
VERSION = "1.0.0"
--加载日志功能模块,并且设置日志输出等级
--如果关闭调用log模块接口输出的日志,等级设置为log.LOG_SILENT即可
require "log"
LOG_LEVEL = log.LOGLEVEL_TRACE
require "net"
--每1分钟查询一次GSM信号强度
--每1分钟查询一次基站信息
net.startQueryAll(60000, 60000)
require "errDump"
errDump.request("udp://ota.airm2m.com:9072")
require "demo"
--启动系统框架
sys.init(0, 0)
sys.run()
通过Luatools烧写脚本,并自动重启,然后打开LLC串口调试助手,输入指令
GPIO,28,7
即可将GPIO28,设置为上拉高电平
输入指令
GPIO,28,8
即可将GPIO28,设置为下拉低电平
输入指令
GPIO,28,9
即可将GPIO28,设置为无拉状态(高阻)
##测试Air720SL 上电IO口初始状态及输入电平检测功能
我们利用板载的GND(低电位)和VG引脚(1.8V高电平)改变IO口输入电平,通过软件读取IO口状态变化。 外部通过电流表进行端口带负载测试得到驱动电流。 下图中得到的0为低电平,1为高电平。位置与DEMO板的J2,J1相对应。
重复对所有的IO口进行上电及高低电平控制可以得到下表
DEMO板上测试结果输入可配置可采集的全功能引脚为22个,输入不可配置高低电平,但能作为输入采集信号的4个,上下拉可配置,但不能检测输入电平变化的引脚6个。
总结一下:
可以检测输入电平变化,并配置内部上拉下拉电路的输入端口共有22个,其中开机为下拉低电平15个,上拉高电平的为7个,驱动电流约为5微安
至此Air720SL的GPIO输入状态介绍完毕,谢谢您的阅读。