- 积分
- 484
- 在线时间
- 208 小时
- 最后登录
- 2024-4-26
- 阅读权限
- 50
- 精华
- 0
- UID
- 787724
- 帖子
- 422
- 精华
- 0
- 经验
- 484 点
- 金钱
- 394 ¥
- 注册时间
- 2015-3-20
|
楼主 |
发表于 2024-2-3 02:26
|
显示全部楼层
本帖最后由 丰年好大雪 于 2024-2-3 02:35 编辑
然后呢,你需要到盘符:\luatos\resource\soc_script\v2024.xx.xx.xx\demo\i2c下,对,这个例程就是干这个的,演示I2C接口用的,在这个目录下找到main.lua,用笔记本打开它,你会看到:
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "i2c 24c02 demo"
VERSION = "1.0.0"
-- sys库是标配
sys = require("sys")
--1010 000x
--7bit地址,不包含最后一位读写位
local addr = 0x50
-- 按照实际芯片更改编号哦
local i2cid = 0
sys.taskInit(function()
log.info("i2c initial",i2c.setup(i2cid))
while true do
--第一种方式
i2c.send(i2cid, addr, string.char(0x01).."1234abcd")
sys.wait(100)
i2c.send(i2cid, addr, string.char(0x01))
local data = i2c.recv(i2cid, addr, 8)
log.info("i2c", "data1",data:toHex(),data)
--第二种方式
i2c.writeReg(i2cid, addr, 0x01, "abcd1234")
sys.wait(100)
local data = i2c.readReg(i2cid, addr, 0x01, 8)
log.info("i2c", "data2",data:toHex(),data)
sys.wait(1000)
end
end)
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
上边的感叹号不是我加的,这个产品系列的例程就是这样的简单粗暴。我们下面要做的事情,就是按照自己的想法,去把I2C例程里的内容换成我们想控制的DAC芯片内容,当然如果你想,也可以发挥胶水技能,把GPIO例程中的内容移植过来一部分,以达成控制额外引脚实现开机RESET和静音都由ESP32来控制。
而GPIO例程,看起来是这样的:
-- LuaTools需要PROJECT和VERSION这两个信息
PROJECT = "gpiodemo"
VERSION = "1.0.1"
log.info("main", PROJECT, VERSION)
-- sys库是标配
_G.sys = require("sys")
if wdt then
--添加硬狗防止程序卡死,在支持的设备上启用这个功能
wdt.init(9000)--初始化watchdog设置为9s
sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
end
-- Air780E的AT固件默认会为开机键防抖, 导致部分用户刷机很麻烦
if rtos.bsp() == "EC618" and pm and pm.PWK_MODE then
pm.power(pm.PWK_MODE, false)
end
--下面的GPIO引脚编号,请根据实际需要进行更改!
-- Air101开发板的3个LED分别为 PB08/PB09/PB10
-- Air103开发板的3个LED分别为 PB24/PB25/PB26
-- Air105开发板的3个LED分别为 PD14/PD15/PC3
-- 若下载到设备后提示pin库不存在,请升级固件到V0006或以上
--【HaoSir2022】于2022年4月21日增加
local rtos_bsp = rtos.bsp()
function pinx() -- 根据不同开发板,给LED赋值不同的gpio引脚编号
if rtos_bsp == "AIR101" then -- Air101开发板LED引脚编号
return pin.PB08, pin.PB09, pin.PB10
elseif rtos_bsp == "AIR103" then -- Air103开发板LED引脚编号
return pin.PB26, pin.PB25, pin.PB24
elseif rtos_bsp == "AIR601" then -- Air103开发板LED引脚编号
return pin.PA7, 255, 255
elseif rtos_bsp == "AIR105" then -- Air105开发板LED引脚编号
return pin.PD14, pin.PD15, pin.PC3
elseif rtos_bsp == "ESP32C3" then -- ESP32C3开发板的引脚
return 12, 13, 255 -- 开发板上就2个灯
elseif rtos_bsp == "ESP32S3" then -- ESP32C3开发板的引脚
return 10, 11, 255 -- 开发板上就2个灯
elseif rtos_bsp == "EC618" then -- Air780E开发板引脚
return 27, 255, 255 -- AIR780E开发板上就一个灯
elseif rtos_bsp == "EC718P" then -- Air780E开发板引脚
return 27, 255, 255 -- AIR780EP开发板上就一个灯
elseif rtos_bsp == "UIS8850BM" then -- Air780UM开发板引脚
return 36, 255, 255 -- Air780UM开发板上就一个灯
else
log.info("main", "define led pin in main.lua")
return 0, 0, 0
end
end
--LED引脚判断赋值结束
local P1,P2,P3=pinx()--赋值开发板LED引脚编号
local LEDA= gpio.setup(P1, 0, gpio.PULLUP)
local LEDB= gpio.setup(P2, 0, gpio.PULLUP)
local LEDC= gpio.setup(P3, 0, gpio.PULLUP)
sys.taskInit(function()
--开始流水灯
local count = 0
while 1 do
--流水灯程序
sys.wait(500) --点亮时间
-- 轮流点灯
LEDA(count % 3 == 0 and 1 or 0)
if P2 and P2 ~=255 then
LEDB(count % 3 == 1 and 1 or 0)
end
if P3 and P3 ~= 255 then
LEDC(count % 3 == 2 and 1 or 0)
end
log.info("GPIO", "Go Go Go", count, rtos.bsp())
log.info("LuatOS:", "https://wiki.luatos.com")
count = count + 1
end
end)
-- API文档 https://wiki.luatos.com/api/gpio.html
-- 用户代码已结束---------------------------------------------
-- 结尾总是这一句
sys.run()
-- sys.run()之后后面不要加任何语句!!!!!
看到上边的例程里有“--”符号了么?这个符号就是lua语言的单行注释符,等效于C语言里的“//”,这个符号后边的内容都不参与编译,做注释用的。
这个例程,就是让你的开发板上LED闪烁的例程,使用了同I2C例程同样的库,库里有什么,能干什么,不重要,你只需要重新开个新文本复制粘贴+修改就行了。
而我们修改之后的结果,大体是下面这样,我以AK4490/95/97芯片的出声例程来举例:
--下边就是个名字,你爱写啥写啥
PROJECT = "dacdemo"
VERSION = "1.0.0"
_G.sys = require("sys")
--我们不需要硬件狗
--下面定义一下GPIO脚位
local rtos_bsp = rtos.bsp()
function pinx()
elseif rtos_bsp == "ESP32C3" then
return xx, xx -- xx为接继电器或DAC reset引脚的脚位
end
end
local P1,P2 =pinx() --赋值开发板GPIO脚位编号
local RESETA= gpio.setup(P1, 0, gpio.PULLUP) --假定这是RESET脚
local RESETB= gpio.setup(P2, 0, 0) --假定这是继电器控制脚,初始拉低
--再定义一下DAC的7bit地址
local addr = 0x10
-- AK449X系列芯片在AD0和1都接地的7bit地址是这个,后边加上'写'动作为0,函数尾巴自动加个零变成0x20
local i2cid = 0
--OK,全部定义完成,下面是主程序
sys.taskInit(function()
--下面首先是解除DAC RESET脚位,下拉一下,再上拉
while 1 do
RESETA(0)
sys.wait(100) --下拉时间
RESETA(gpio.PULLUP) --再上拉
end
--还记得让AK芯片转起来的统一寄存器读写么?0x01,0x02;0x08,0x0C;0x00,0x9F 一共三组
log.info("i2c initial",i2c.setup(i2cid))
while 1 do
i2c.send(i2cid, addr, string.char(0x01),string.char(0x02))
sys.wait(100)
i2c.send(i2cid, addr, string.char(0x08),string.char(0x0C))
sys.wait(100)
i2c.send(i2cid, addr, string.char(0x00),string.char(0x9F))
sys.wait(100)
end
--下面首先是解除继电器控制脚位,直接上拉
while 1 do
RESETB(gpio.PULLUP)
end
end)
sys.run()
--完事
直接把这个文本文件单独放一个目录,再给个main.lua的名字,用luatools烧写,OK了。
|
|