合宙-icool 开发板使用手册

概述:iCool(idea cool)手机是基于合宙Air722UG模块,移植LittleVGL,用lua脚本语言开发的一款5寸触摸屏手机产品。

1.总体介绍

  • icool手机支持功能如下:
    1:支持一路音频输出(SPK))
    2:支持Camera
    3:支持mipi LCD,LVGL(7.11版本),触摸屏
    4:支持SD卡
    5:支持WIFI 天线,LTE天线
    6:支持串口1和串口2,HOST 调试口
    7:支持一路USB 2.0 高速接口(最高达 480Mbps)
    8:支持一路(U)SIM卡
    9:支持3个侧键
    10:支持闪光灯,电源指示灯等
  • 拥有iCool你可以进行以下操作:
    1:快速了解和掌握LittleVGL相关内容,在操作中逐渐熟悉LittleVGL相关控件的功能
    2:内置时钟,天气,计算器,音频,日历,二维码等软件的内容,满足手机部分基本功能需求
    3:可自定义的添加iCool手机的内容,让繁琐的app制作变得更加的简单和快捷

2.准备工作

  • 实物
    在这里插入图片描述

在这里插入图片描述

3.功能介绍

3.1 开关机

Air722UG 的 USB 符合 USB2.0 规范,支持高速(480Mbps)、全速(12Mbps)模式和低速(1.2Mbps)模式。USB 接口可用于 AT 命令传送,数据传输,软件调试和软件升级。icool 支持通过Micro USB 供电,给电池充电,同时,软件控制模块 powkey 引脚,实现按键开关机功能。

  • 相关管脚定义
管脚名管脚号复用I/O电压域管脚描述备注
USB_DM12/IO/USB 差分信号线负极USB2.0 High speed, 走线控制 90欧姆差分阻抗
USB_DP13/IO/USB 差分信号线正极同上
VBUS40/DIVBUSUSB 插入检测, Vmax=5.25V Vmin=3.3V Vnorm=5.0V ,Luat固件可触发充电开机icool 板上已经和vbat接一起,供电5V
PWRKEY9/DIVBAT模块开机/关机控制脚, 内部上拉到VBAT1. 关机状态下把管脚拉低 1.2s 以上模块开机
2. 开机状态下把管脚拉低 1.5s 以上模块关机
  • 代码如下(软件配置PWRKEY 管脚,实现模块开关机功能
powerKey="255255"--powerKey 键值
local function keyMsg(msg) -- 键盘事件回调函数
    if msg.pressed then
        if msg.key_matrix_row..msg.key_matrix_col==powerKey then --判断为关机键
            log.info("powerKey_按下")--短按按下事件
            timerID = sys.timerStart(function()--长按事件
                print("-----已经关机,长按再次开机--------")
                rtos.poweroff() -- 真实关机
            end, 2000)
        end
    else
        if msg.key_matrix_row..msg.key_matrix_col==powerKey then--判断为关机键
            log.info("powerKey_弹起")--短按弹起事件
            if sys.timerIsActive(timerID) then sys.timerStop(timerID) end
        end
    end
end
rtos.on(rtos.MSG_KEYPAD, keyMsg) -- 注册按键事件
rtos.init_module(rtos.MOD_KEYPAD, 0, 0, 0) -- 实例化按键事件模块
  • luatools 打印如图
    在这里插入图片描述
3.2 侧键

icool手机右侧保留2个按键,可软件配置

  • 相关管脚定义
管脚号管脚名复用I/O电压域描述备注
16GPIO10SPI1_CSIO/DOV_GLOBAL_1V8GPIO/spi片选信号不用则悬空
20GPIO22ZSP_UART_TXDIO/DOV_GLOBAL_1V8GPIO/调试串口,输出 CP log,波特率8Mbps不用则悬空
  • 代码如下(检测侧键状态
require "pins"
--定义状态
local stuList={"弹起","按下"}
--上按键回调函数
local function up(msg) 
    log.info("侧按键上", stuList[msg])
 end
 --下按键回调函数
local function down(msg) 
    log.info("侧按键下", stuList[msg])
 end
--配置GPIO与相关回调函数
pins.setup(pio.P0_22, up, pio.PULLUP)
pins.setup(pio.P0_10, down, pio.PULLUP)
  • luatools 打印如图
    在这里插入图片描述
3.3 mipi大屏

随着智能化设备的发展,大屏,高像素似乎已经成为了一种主流趋势。这就要求模组必须可以有高速率传输的接口,传统的并口明显是无法胜任这项任务的,所以 iCool 采用了MIPI接口驱动屏幕,与传统的并口相比,MIPI接口传输速度更快,可以传输更大的数据量,功耗更低,同时抗干扰能力更强。MIPI 其实是一个比较新的标准,其规范也在不断修改和改进,目前比较成熟的接口应用有 DSI(显示接口)和CSI(摄像头接口)。CSI/DSI分别是指其承载的是针对Camera或Display应用,都有复杂的协议结构, MIPI 大屏采用的就是 DSI 接口。当然,显示屏的主要还是需要依靠代码编写完成内容显示。目前 LuatOS 具有两套显示接口,除了传统相对简单的 Display 接口外,还支持 7.11 版本的 LVGL 显示接口。有关 LVGL 的接口使用方法具体可以参考链接,这里不再展开。

  • 相关管脚定义
管脚号管脚名复用I/O电压域描述备注
34DSI_CKPFLASH_CLK/I2S2_BCKDOV_GLOBAL_1V8MIPILCD时钟信号正极仅限于Air722UG-NMM,其他型号不支持
35DSI_CKPFLASH_CS/I2S2_LRCKDOV_GLOBAL_1V8MIPILCD时钟信号正极同上
77DSI_D1NFLASH_S0/I2S2_SDAT_INIOV_GLOBAL_1V8MIPILCD数据信号1负极同上
78DSI_D1PFLASH_S1/I2S2_SDAT_OUTIOV_GLOBAL_1V8MIPILCD数据信号1正极同上
79DSI_D0NFLASH_S2IOV_GLOBAL_1V8MIPILCD数据信号0负极同上
80DSI_D0PFLASH_S3/MODULE_STATUS/PWM_PWT_OUT/GPIO[5]IOV_GLOBAL_1V8MIPILCD数据信号0正极同上
83VCC_LCD/POVCC_LCDLDO输出,1.6-3.3V之间可调,默认电压是1.8V,IOmax=200mA开机后默认是关闭状态,通常用来给LCD供电不用则悬空
module(..., package.seeall)
-- LCD
require "lcd"
-- 触摸屏
require "tp"
DEMO_BASE_CONT = nil
local data = {type = lvgl.INDEV_TYPE_POINTER}
local function input()
    pmd.sleep(100)
    local ret, ispress, px, py = tp.get()
    if ret then
        if lastispress == ispress and lastpx == px and lastpy == py then
            return data
        end
        lastispress = ispress
        lastpx = px
        lastpy = py
        if ispress then
            tpstate = lvgl.INDEV_STATE_PR
        else
            tpstate = lvgl.INDEV_STATE_REL
        end
    else
        return data
    end
    local topoint = {x = px, y = py}
    data.state = tpstate
    data.point = topoint
    return data
end

function demoInit()
    sys.wait(1000)
    -- 日历
    ---[[
    -- 高亮显示的日期
    highlightDate = lvgl.calendar_date_t()
    -- 日历点击的回调函数
    -- 将点击日期设置高亮
    function event_handler(obj, event)
        if event == lvgl.EVENT_VALUE_CHANGED then
            date = lvgl.calendar_get_pressed_date(obj)
            if date then
                print(string.format("Clicked date: %02d.%02d.%d\n", date.day, date.month, date.year))
                highlightDate.year = date.year
                highlightDate.month = date.month
                highlightDate.day = date.day
                lvgl.calendar_set_highlighted_dates(obj, highlightDate, 1)
            end
        end
    end
    -- 创建日历
    calendar = lvgl.calendar_create(lvgl.scr_act(), nil)
    lvgl.obj_set_size(calendar, 300, 300)
    lvgl.obj_align(calendar, nil, lvgl.ALIGN_CENTER, 0, 0)
    lvgl.obj_set_event_cb(calendar, event_handler)
    -- 设置今天日期
    today = lvgl.calendar_date_t()
    today.year = 2018
    today.month = 10
    today.day = 23
    lvgl.calendar_set_today_date(calendar, today)
    lvgl.calendar_set_showed_date(calendar, today)
    --]]
end
local function init()
    lvgl.init(demoInit, input)
    pmd.ldoset(8, pmd.LDO_VIBR)
end
sys.taskInit(init, nil)
  • 界面效果展示
    在这里插入图片描述
3.4 触摸屏

iCool 与其他智能手机相同,输入方式为触摸输入。可以识别点击,滑动等一系列用户操作,是用户的主要输入方式,iCool 的触摸屏是一个 I2C 设备,使用了模块的 I2C 的第二通道作为输入接口。通过解析 I2C 接口传回的数据,可以识别出对主屏键,任务键,返回键的点击操作,以及当前屏幕被点击的坐标点。数据传回的只有坐标点,滑动操作是依靠 LVGL 的输入接口识别。

  • 相关管脚定义
管脚号管脚名复用I/O电压域管脚描述备注
86I2C2_SCLGPIO[14]IOV_GLOBAL_1V8I2C2 时钟信号用作 I2C 时需外加 1.8V 上拉; 不用则 悬空
87I2C2_SDAGPIO[15]IOV_GLOBAL_1V8I2C2 数据信号同上
41VIB/POVIBLDO 输出,3.0-3.3V 之间可调, IOmax=100mA , 开机后默认是关闭状态,通常用来控制 震动马达不用则悬空
require "bit"
local lcd_width = 480
local lcd_height = 854
local ispress = false
local last_x, last_y
x = 0
y = 0
local function tpPrase(data)
    -- 第一个字节头信息为0x52
    if string.byte(data, 1) == 0x52 then
        local tmpl, tmph
        -- 第2,3,4,5, 7全是0xff 表示release,其余表示press
        if string.byte(data, 2) == 0xff and string.byte(data, 3) == 0xff then
            if ispress == false then return false, false, -1, -1 end
            ispress = false
            -- log.info("ispress x,y ", ispress, x, y)
            return true, ispress, x, y
        end
        -- x 11位, 第3字节为[0,7] 第2字节的[4,6]为[8,11] 转化坐标需要*width/2048
        tmpl = bit.band(string.byte(data, 2), 0xf0)
        tmph = bit.lshift(tmpl, 4)
        x = tmph + string.byte(data, 3)
        x = x * lcd_width / 2048
        -- y 11位, 第4字节为[0,7] 第2字节的[0,2]为[8,11] 转化坐标需要*height/2048
        tmpl = bit.band(string.byte(data, 2), 0x0f)
        tmph = bit.lshift(tmpl, 8)
        y = tmph + string.byte(data, 4)
        y = y * lcd_height / 2048
        if ispress == true and last_x == x and last_y == y then
            return false, false, -1, -1
        end
        ispress = true
        last_x = x
        last_y = y
        -- log.info("ispress x,y ", ispress, x, y)
        return true, ispress, x, y
    end
    return false, false, -1, -1
end
local function open(id, speed)
    if i2c.setup(id, speed or i2c.SLOW) ~= i2c.SLOW then
        i2c.close(id)
        return i2c.setup(id, speed or i2c.SLOW)
    end
    return i2c.SLOW
end
local function init()
    -- 打开电压域
    pmd.ldoset(8, pmd.LDO_VMMC)
    -- tp使能管脚
    pins.setup(pio.P0_11, 1)
    -- 初始化i2c
    if i2c.setup(2, i2c.SLOW) ~= i2c.SLOW then log.info("tp init error") end
end
local iskeypress = false
local keyid = 0
local keycb = nil
function tpkeyprase(data)
    -- 菜单,home,返回键
    if string.byte(data, 1) == 0x52 and string.byte(data, 2) == 0xff then
        if string.byte(data, 6) == 0x01 or string.byte(data, 6) == 0x04 or
            string.byte(data, 6) == 0x02 then
            keyid = string.byte(data, 6)
            if keycb ~= nil and iskeypress == false then
                iskeypress = true
                keycb(keyid, iskeypress)
            end
        end
        if string.byte(data, 2) == 0xff and string.byte(data, 3) == 0xff and
            string.byte(data, 6) == 0xff then
            if iskeypress then
                iskeypress = false
                if keycb ~= nil then keycb(keyid, iskeypress) end
            end
        end
    end
end
function cb(cb)
    log.info("msg2238 cb ")
    keycb = cb
end
function get()
    -- 通过I2C读取数据8个字节
    local data = i2c.recv(2, 0x26, 8)
    -- 解析坐标参数返回valid,ispress,x,y
    tpkeyprase(data)
    return tpPrase(data)
end
init()
3.5 SPK

喇叭输出接口,可以直接驱动8欧姆喇叭

  • 相关管脚定义
管脚号管脚名复用I/O电压域管脚描述备注
103SPK+/AO/Speaker 差分信号输出,可以直接驱动 8 欧姆 Speaker,最大输出功率0.9W,可以通过软件配置 Class-AB模式或 Class-D 模式不用则悬空
104SPK-/AO/同上不用则悬空
  • 代码如下(TTS播放音频
require"audio"
require"common"
--播放tts测试接口,每次打开一行代码进行测试
--audio.play接口要求TTS数据为UTF8编码,因为本文件编辑时采用的是UTF8编码,所以可以直接使用ttsStr,不用做编码转换
--如果用户自己编辑脚本时,采用的不是UTF8编码,需要调用common.XXX2utf8接口进行转换
local ttsStr = "支付宝到账一个亿"
local function testPlayTts()
    --单次播放,默认音量等级
    audio.play(TTS,"TTS",ttsStr)
    --单次播放,音量等级7
    --audio.play(TTS,"TTS",ttsStr,7)
    --单次播放,音量等级7,播放结束或者出错调用testcb回调函数
    --audio.play(TTS,"TTS",ttsStr,7,testCb)
    --循环播放,音量等级7,没有循环间隔(一次播放结束后,立即播放下一次)
    --audio.play(TTS,"TTS",ttsStr,7,nil,true)
    --循环播放,音量等级7,循环间隔为2000毫秒
    -- audio.play(TTS,"TTS",ttsStr,7,nil,true,2000)
end
testPlayTts()
3.6 摄像头
  • 支持一路 SPI camera 输入接口,可用于扫描、拍照等应用,最高像素 30W 像素,支持数据格式 YUV422, Y420, RAW8, RAW10,集成 GC0310 驱动

  • 相关引脚定义

管脚号管脚名复用I/0电压域管脚描述备注
28CAMI2C_SCL1/IOV_GLOBAL_1V8Camera I2C 时钟信号,
也可用作通 用 I2C 接口
不用则悬空
29CAMI2C_SDA1GPIO[17]IOV_GLOBAL_1V8Camera I2C 数据信号,
也可用作通 用 I2C 接口
不用则悬空
61VCC_CAMD/POVCC_CAMDLDO 输出,1.4-2.1V 之间可调, 默认电压1.8V, IOmax=100mA
开机后默认是关闭状态,
通常用来给 Camera 提供数字电压
不用则悬空
62VCC_CAMA/POVCC_CAMALDO 输出,1.6-3.2V 之间可调,
默认电压是 1.8V, IOmax=100mA
开机后默认是关闭状态,
通常用来给 Camera 提供模拟电压
不用则悬空
75CAM_RSTCSI_CKNDO\DIV_GLOBAL_1V8重启 Camera\
MiPi Camera 时钟信号负极
不用则悬空
76CAM_SI0CSI_CKPDO\DIV_GLOBAL_1V8SPI Camer 数据输入 0
MiPi Camera 时钟信号正极
不用则悬空
98CAM_PWDN/DOV_GLOBAL_1V8关闭 Camera不用则悬空
99CAM_REFCLK/DOV_GLOBAL_1V8Camera MCLK 时钟输出不用则悬空
100CAM_SI1CSI_D0NDI\IOV_GLOBAL_1V8SPI Camer 数据输入 1/
MiPi Camera 数据信号 0 负极
不用则悬空
101CAM_SCKCSI_D0PDI\IOV_GLOBAL_1V8SPI Camera 时钟输入/
MiPi Camera 数据信号 0 正极
不用则悬空
local WIDTH,HEIGHT = disp.getlcdinfo()
require"pm"
require"scanCode"
require"utils"
require"common"
-- 拍照并显示
function takePhotoAndDisplay()
    --唤醒系统
    pm.wake("testTakePhoto")
    --打开摄像头
	disp.cameraopen(1,0,0,0)
    -- --设置照片的宽和高像素并且开始拍照
    -- --此处的第三个参数表示拍摄质量,默认50,100最好
    disp.cameracapture(240,320,100)
    -- --设置照片保存路径
    disp.camerasavephoto("/testCamera.jpg")
    log.info("testCamera.takePhotoAndDisplay fileSize",io.fileSize("/testCamera.jpg"))
    --关闭摄像头
    disp.cameraclose()
    --显示拍照图片
    if WIDTH~=0 and HEIGHT~=0 then
        disp.clear()
        disp.putimage("/testCamera.jpg",(WIDTH-240)/2,(HEIGHT-320)/2)
        disp.puttext(common.utf8ToGb2312("照片尺寸: "..io.fileSize("/testCamera.jpg")),0,5)
        disp.update()
    end
    sys.timerStart(takePhotoAndDisplay,100)
end
sys.timerStart(takePhotoAndDisplay,100)
3.7 SD/TF卡

SDIO(Secure Digital Input and Output)全称为安全数字输入输出接口,在协议上和SPI类似,是一种串行的硬件接口,通信的双方一个作为HOST,另一端是Device,所有的通信都是由HOST端发送命令开始的,Device端只要解析相应的命令,就可以正常通信了。比较常见的应用是用来外接SD卡或者MicroSD Card(也叫TF卡)。 icool手机设计了TF卡槽,支持挂载SD卡,操作模块文件系统。

  • 相关管脚定义
管脚号管脚名复用I/O电压域管脚描述备注
97VMMC/POVMMCLDO 输出,1.6-3.2V 之间可调, 默认电压是 3.1V, IOmax=150mA , 开机后默认是打开状态,通常用来给 MMC 供电
69MMC1_DAT2/IO同上SDIO 数据线 2
68MMC1_DAT3/IO同上SDIO 数据线 3
21MMC1_CMD/IO同上SDIO 命令信号
66MMC1_CLK/IO同上SDIO 时钟信号
72MMC1_DAT0/IO同上SDIO 数据线 0
73MMC1_DAT1/IO同上SDIO 数据线 1
  • 代码如下(实现播放一首预存在卡中的歌,在卡中创建一个文件并写入内容
sys.taskInit(
    function()
        sys.wait(10000)
        --挂载存储卡,result为挂载结果,1为成功,0为失败
        local result = io.mount(io.SDCARD)                      
        log.info("挂载结果", result)
        if result == 1 then
            --判断存储卡中是否存在名为ahq.mp3的歌曲文件
            local result= io.exists("/sdcard0/ahq.mp3")		    
            if result then
                log.info("文件存在")
                --播放歌曲
                audio.play(1, "FILE", "/sdcard0/ahq.mp3", 4, nil, false) 
            end
		   --判断存储卡中是否有test.txt这个文件,如果没有,则创建此文件并写入内容
            local result = io.exists("/sdcard0/test.txt")        
            if not result then
                log.info("创建文件")
                local content = io.writeFile("/sdcard0/test.txt","测试测试,这里是sd卡测试")  
                log.info("content", content)
            else
                log.info("文件存在")
            end
        end
    end
)
  • 效果显示:把TF卡插到电脑上,可以看见,test.txt文件已经被写入了卡中
    在这里插入图片描述
3.8 串口
  • 模块提供了五个通用异步收发器:主串口 UART1、校准串口 UART2、通用串口 UART3、调试串口 HOST UART 和 ZSP UART。icool手机硬件上预留了串口1、串口2和HOST 调试口的测试点。
  • 相关引脚定义
管脚号管脚名复用I/O电压域管脚描述备注
91UART1_TXD/DOV_GLOBAL_1V8UART1发送数据
92UART1_RXD/DI同上UART1接收数据
63UART1_RXDGPIO_21DO / IO同上UART2发送数据 / 通用GPIO
64UART2_RXDGPIO_20DI / IO同上UART2接收数据 / 通用GPIO
94HOST_TXD/DO同上调试串口,输出AP log,波特率921600bps
95HOST_RXD/DI同上调试串口,给模块发送调试指令
3.9 SIM卡

SIM 卡接口支持 ETSI 和 IMT-2000 卡规范,支持 1.8V 和 3.0V USIM 卡.

  • 相关管脚定义
管脚号管脚名复用I/O电压域描述备注
30USIM_CLK/DOUSIM_VDDSIM0 时钟信号模块可以自动识别 1.8V 或者 3V(U)SIM 卡
31USIM_DATA/IOUSIM_VDDSIM0 数据信号同上
32USIM_VDD/POUSIM_VDDSIM0 供电电源
最大供电电流 10mA
同上
33USIM_RST_N/DOUSIM_VDDSIM0 复位信号同上
  • 代码如下
require "pins"
require "sim"
require "net"
require"link"
require"socket"
----检测SIM卡
sys.subscribe("SIM_IND",function(status)
    if status=="RDY" then 
        print("SIM卡正常")    
    elseif status~="RDY" then
        print("SIM卡未准备好")
         end
end)
----检测注册状态
sys.subscribe("NET_STATE_REGISTERED",function()
       netMode=net.getNetMode()
       if netMode==4 then 
    print("4G网络注册成功")
       elseif netMode==3 or netMode==5 then
        print("3G网络注册成功")
       elseif netMode==1 or netMode==2 then
        print("2G网络注册成功")
       else
        print("SIM卡注册失败,重启")
    end
end)
sys.subscribe("IP_READY_IND",function()
    print("数据网络激活成功")
end)
  • luatools 打印如图
    在这里插入图片描述
3.10指示灯
  • icool手机共有两个指示灯,位于摄像头左侧,分别是绿色与红色,红色指示灯上电即常亮,无法使用软件控制,绿色指示灯由模块的GPIO_1控制,使用软件控制GPIO输出高低电平来使LED灯亮灭.
  • 代码如下,(实现绿色小灯循环亮灭)当使用到MIPI LCD时,此脚无法配置为GPIO来使用
require "pins"
pmd.ldoset(2,pmd.LDO_VLCD)
local gpio_1 = pins.setup(pio.P0_1, 1)
local level = 1
sys.taskInit(function()
    while true do 
        level = level == 1 and 0 or 1
        gpio_1(level)
        sys.wait(1000)
    end
end)
3.11 闪光灯
  • 相关管脚如下:
管脚号管脚名复用I/O电压域管脚描述备注
50RGB_IB0/OD/开漏管脚,最大输入电流 100mA
恒流模式调节范围:1.68mA - 54.6mA,
一般用于控制 LCD 背光灯的 电流大小
不用则悬空
  • 代码如下:
sys.taskInit(function ()
    led=0
    while true do
        pmd.ldoset(led,pmd.LDO_VBACKLIGHT_R)
        sys.wait(1000)
        led=led+1
        led=led%2

    end
end)
3.12 马达(震动效果,软件尚未实现)
3.13 光学传感器(暂不支持)
3.14 天线

icool手机预留了两个LTE天线接口和一个WIFI天线接口,两个LTE天线分别为:ipex 3代接口天线,弹片接触式天线,默认使用ipex口天线,可通过电阻R22调换;WIFI天线为弹片接触式天线。

  • 相关管脚定义
管脚号管脚名管脚描述备注
48LTE_ANTLTE天线接口走线需要控制50欧姆特性阻抗
37BT/WiFi_ANT蓝牙/WiFi Scan 共用天线接口走线需要控制50欧姆特性阻抗
  • 备注

4. 相关链接

Gitee-icool
722模块硬件手册
722模块官网
Icooldemo

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值