소스 검색

add: 添加sc7a20三轴加速度传感器demo和对应lib

PKM-Bai 1 년 전
부모
커밋
a565c3900f
2개의 변경된 파일242개의 추가작업 그리고 0개의 파일을 삭제
  1. 53 0
      demo/SC7A20/main.lua
  2. 189 0
      script/libs/sc7a20.lua

+ 53 - 0
demo/SC7A20/main.lua

@@ -0,0 +1,53 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "sc7a20_demo"
+VERSION = "1.0.0"
+
+log.info("main", PROJECT, VERSION)
+
+-- 一定要添加sys.lua !!!!
+sys = require("sys")
+
+-- 添加硬狗防止程序卡死
+if wdt then
+    wdt.init(9000) -- 初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000) -- 3s喂一次狗
+end
+ 
+local sc7a20 = require "sc7a20"
+
+i2cid = 0
+i2c_speed = i2c.FAST
+
+gpio.setup(24, function() --配置中断,外部唤醒用
+    log.info("gpio 24")
+end, gpio.PULLUP, gpio.BOTH)
+
+gpio.setup(2, function() --配置中断,外部唤醒用
+    log.info("gpio 2")
+end, gpio.PULLUP, gpio.BOTH)
+
+sys.taskInit(function()
+    i2c.setup(i2cid, i2c_speed)
+
+    sc7a20.init(i2cid)--初始化,传入i2c_id
+
+    sys.wait(50)
+    sc7a20.set_thresh(i2cid, string.char(0x05), string.char(0x05))  -- 设置活动阀值
+    sys.wait(50)
+    sc7a20.set_irqf(i2cid, 1, string.char(0x1F), string.char(0x03), string.char(0xFF))  -- AOI1中断映射到INT1上
+    sys.wait(50)
+    sc7a20.set_irqf(i2cid, 2, string.char(0x1F), string.char(0x03), string.char(0xFF))  -- AOI2中断映射到INT2上
+
+    while 1 do
+        local sc7a20_data = sc7a20.get_data()
+        log.info("sc7a20_data", "sc7a20_data.x"..(sc7a20_data.x),"sc7a20_data.y"..(sc7a20_data.y),"sc7a20_data.z"..(sc7a20_data.z))
+        sys.wait(1000)
+    end
+end)
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 189 - 0
script/libs/sc7a20.lua

@@ -0,0 +1,189 @@
+--[[
+@module sc7a20
+@summary sc7a20 
+@version 1.0
+@date    2022.04.11
+@author  Dozingfiretruck
+@usage
+--注意:因使用了sys.wait()所有api需要在协程中使用
+-- 用法实例
+local sc7a20 = require "sc7a20"
+i2cid = 0
+i2c_speed = i2c.FAST
+sys.taskInit(function()
+    i2c.setup(i2cid,i2c_speed)
+    sc7a20.init(i2cid)--初始化,传入i2c_id
+    while 1 do
+        local sc7a20_data = sc7a20.get_data()
+        log.info("sc7a20_data", "sc7a20_data.x"..(sc7a20_data.x),"sc7a20_data.y"..(sc7a20_data.y),"sc7a20_data.z"..(sc7a20_data.z))
+        sys.wait(1000)
+    end
+end)
+]]
+
+
+local sc7a20 = {}
+local sys = require "sys"
+local i2cid
+
+local SC7A20_ADDRESS_ADR                    -- sc7a20设备地址
+
+local SC7A20_ADDRESS_ADR_LOW     =   0x18
+local SC7A20_ADDRESS_ADR_HIGH    =   0x19
+local SC7A20_CHIP_ID_CHECK       =   0x0f   -- 器件ID检测
+local SC7A20_CHIP_ID             =   0x11   -- 器件ID
+
+local SC7A20_REG_CTRL_REG1       =   0x20   -- 控制寄存器1
+local SC7A20_REG_CTRL_REG2       =   0x21   -- 控制寄存器2
+local SC7A20_REG_CTRL_REG3       =   0x22   -- 控制寄存器3
+local SC7A20_REG_CTRL_REG4       =   0x23   -- 控制寄存器4
+local SC7A20_REG_CTRL_REG5       =   0x24   -- 控制寄存器5
+local SC7A20_REG_CTRL_REG6       =   0x25   -- 控制寄存器6
+local SC7A20_REG_REFERENCE       =   0x26   -- 参考寄存器
+local SC7A20_REG_STATUS_REG      =   0x27   -- 状态寄存器
+local SC7A20_REG_OUT_X_L         =   0x28   -- X轴数据低字节
+local SC7A20_REG_OUT_X_H         =   0x29   -- X轴数据高字节
+local SC7A20_REG_OUT_Y_L         =   0x2A   -- Y轴数据低字节
+local SC7A20_REG_OUT_Y_H         =   0x2B   -- Y轴数据高字节
+local SC7A20_REG_OUT_Z_L         =   0x2C   -- Z轴数据低字节
+local SC7A20_REG_OUT_Z_H         =   0x2D   -- Z轴数据高字节
+local SC7A20_REG_FIFO_CTRL_REG   =   0x2E   -- FIFO控制寄存器
+local SC7A20_REG_FIFO_SRC_REG    =   0x2F   -- FIFO源寄存器
+local SC7A20_REG_INT1_CFG        =   0x30   -- 中断1配置寄存器
+local SC7A20_REG_INT1_SRC        =   0x31   -- 中断1源寄存器
+local SC7A20_REG_INT1_THS        =   0x32   -- 中断1阈值寄存器
+local SC7A20_REG_INT1_DURATION   =   0x33   -- 中断1持续时间寄存器
+local SC7A20_REG_INT2_CFG        =   0x34   -- 中断2配置寄存器
+local SC7A20_REG_INT2_SRC        =   0x35   -- 中断2源寄存器
+local SC7A20_REG_INT2_THS        =   0x36   -- 中断2阈值寄存器
+local SC7A20_REG_INT2_DURATION   =   0x37   -- 中断2持续时间寄存器
+local SC7A20_REG_CLICK_CFG       =   0x38   -- 单击配置寄存器
+local SC7A20_REG_CLICK_SRC       =   0x39   -- 单击源寄存器
+local SC7A20_REG_CLICK_THS       =   0x3A   -- 单击阈值寄存器
+local SC7A20_REG_TIME_LIMIT      =   0x3B   -- 单击时间限制寄存器
+local SC7A20_REG_TIME_LATENCY    =   0x3C   -- 单击时间延迟寄存器
+local SC7A20_REG_TIME_WINDOW     =   0x3D   -- 单击时间窗口寄存器
+local SC7A20_REG_ACT_THS         =   0x3E   -- 活动阈值寄存器
+local SC7A20_REG_ACT_DUR         =   0x3F   -- 活动持续时间寄存器
+
+
+--器件ID检测
+local function chip_check()
+    i2c.send(i2cid, SC7A20_ADDRESS_ADR_LOW, SC7A20_CHIP_ID_CHECK)--读器件地址
+    local revData = i2c.recv(i2cid, SC7A20_ADDRESS_ADR_LOW, 1)
+    if revData:byte() ~= nil then
+        SC7A20_ADDRESS_ADR = SC7A20_ADDRESS_ADR_LOW
+    else
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR_HIGH, SC7A20_CHIP_ID_CHECK)--读器件地址
+        sys.wait(50)
+        local revData = i2c.recv(i2cid, SC7A20_ADDRESS_ADR_HIGH, 1)
+        if revData:byte() ~= nil then
+            SC7A20_ADDRESS_ADR = SC7A20_ADDRESS_ADR_HIGH
+        else
+            log.info("i2c", "Can't find sc7a20 device")
+            return false
+        end
+    end
+    i2c.send(i2cid, SC7A20_ADDRESS_ADR, SC7A20_CHIP_ID_CHECK)--读器件地址
+    sys.wait(50)
+    local revData = i2c.recv(i2cid, SC7A20_ADDRESS_ADR, 1)
+    if revData:byte() == SC7A20_CHIP_ID then
+        log.info("Device i2c id is: SC7A20")
+    else
+        log.info("i2c", "Can't find sc7a20 device")
+        return false
+    end
+    return true
+end
+
+
+--[[
+sc7a20 初始化
+@api sc7a20.init(i2c_id)
+@number i2c id
+@return bool   成功返回true
+@usage
+sc7a20.init(0)
+]]
+function sc7a20.init(i2c_id)
+    i2cid = i2c_id
+    sys.wait(20)--20 毫秒等待设备稳定
+    if chip_check() then
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR, {SC7A20_REG_CTRL_REG1,0X47})
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR, {SC7A20_REG_CTRL_REG2,0X00})
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR, {SC7A20_REG_CTRL_REG3,0X00})
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR, {SC7A20_REG_CTRL_REG4,0X88})
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR, {SC7A20_REG_CTRL_REG6,0X00})
+        log.info("sc7a20 init_ok")
+        sys.wait(20)
+        return true
+    end
+    return false
+end
+
+--[[
+获取 sc7a20 数据
+@api sc7a20.get_data()
+@return table sc7a20 数据
+@usage
+local sc7a20_data = sc7a20.get_data()
+log.info("sc7a20_data", "sc7a20_data.x"..(sc7a20_data.x),"sc7a20_data.y"..(sc7a20_data.y),"sc7a20_data.z"..(sc7a20_data.z))
+]]
+function sc7a20.get_data()
+    local accel={x=nil,y=nil,z=nil}
+    i2c.send(i2cid, SC7A20_ADDRESS_ADR,SC7A20_REG_OUT_X_L)
+    _,accel.x = pack.unpack(i2c.recv(i2cid, SC7A20_ADDRESS_ADR, 2),">h")
+    i2c.send(i2cid, SC7A20_ADDRESS_ADR,SC7A20_REG_OUT_Y_L)
+    _,accel.y = pack.unpack(i2c.recv(i2cid, SC7A20_ADDRESS_ADR, 2),">h")
+    i2c.send(i2cid, SC7A20_ADDRESS_ADR,SC7A20_REG_OUT_Z_L)
+    _,accel.z = pack.unpack(i2c.recv(i2cid, SC7A20_ADDRESS_ADR, 2),">h")
+    return accel
+end
+
+
+--[[
+设置 sc7a20 活动阀值
+@api sc7a20.set_thresh (i2cid, activity, time_inactivity)
+@number i2c id
+@number 活动阀值
+@number 活动持续时间
+@usage
+sc7a20.set_thresh(0, string.char(0x05), string.char(0x05)) 
+]]
+function sc7a20.set_thresh(i2cid, activity, time_inactivity)
+    i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_ACT_THS, activity)
+    i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_ACT_DUR, time_inactivity)
+end
+
+
+--[[
+设置 sc7a20 中断设置
+@api sc7a20.set_irqf(i2cid, int, irqf_ths, irqf_duration, irqf_cfg)
+@number i2c id
+@number 中断脚 传入1及配置INT1脚,传入2及配置INT2脚
+@number 中断阀值
+@number 中断持续时间
+@number 中断配置
+@usage
+sc7a20.set_irqf(0, 1, string.char(0x05), string.char(0x05), string.char(0x00))
+]]
+function sc7a20.set_irqf(i2cid, int, irqf_ths, irqf_duration, irqf_cfg)
+    if int == 1 then
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR, {SC7A20_REG_CTRL_REG3,0X40})        -- AOI1中断映射到INT1上
+        i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_INT1_THS, irqf_ths)
+        i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_INT1_DURATION, irqf_duration)
+        i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_INT1_CFG, irqf_cfg)
+    elseif int == 2 then
+        i2c.send(i2cid, SC7A20_ADDRESS_ADR, {SC7A20_REG_CTRL_REG6,0X42})        -- AOI2中断映射到INT2上 并且配置低电平触发中断
+        i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_INT2_THS, irqf_ths)
+        i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_INT2_DURATION, irqf_duration)
+        i2c.writeReg(i2cid, SC7A20_ADDRESS_ADR, SC7A20_REG_INT2_CFG, irqf_cfg)
+    else
+        log.info("sc7a20", "int Parameter error")
+    end
+end
+
+
+return sc7a20
+
+