Prechádzať zdrojové kódy

add:添加ds3231 驱动

Dozingfiretruck 4 rokov pred
rodič
commit
443d1e0459

+ 162 - 0
script/libs/ds3231/ds3231.lua

@@ -0,0 +1,162 @@
+--[[
+@module ds3231
+@summary ds3231 驱动
+@version 1.0
+@date    2022.03.16
+@author  Dozingfiretruck
+@usage
+--注意:因使用了sys.wait()所有api需要在协程中使用
+-- 用法实例
+local ds3231 = require "ds3231"
+i2cid = 0
+i2c_speed = i2c.FAST
+sys.taskInit(function()
+    i2c.setup(i2cid,i2c_speed)
+    ds3231.init(i2cid)--初始化,传入i2c_id
+    while 1 do
+        log.info("ds3231.get_temperature", ds3231.get_temperature())
+        local time = ds3231.read_time()
+        log.info("ds3231.read_time",time.tm_year,time.tm_mon,time.tm_mday,time.tm_hour,time.tm_min,time.tm_sec)
+        sys.wait(5000)
+        local set_time = {tm_year=2021,tm_mon=3,tm_mday=0,tm_wday=0,tm_hour=0,tm_min=0,tm_sec=0}
+        ds3231.set_time(set_time)
+        time = ds3231.read_time()
+        log.info("ds3231_read_time",time.tm_year,time.tm_mon,time.tm_mday,time.tm_hour,time.tm_min,time.tm_sec)
+        sys.wait(1000)
+    end
+end)
+]]
+
+local ds3231 = {}
+
+local sys = require "sys"
+
+local i2cid
+
+local DS3231_ADDRESS            =   0x68 -- address pin low (GND), default for InvenSense evaluation board
+local i2cslaveaddr              =   DS3231_ADDRESS --slave address
+
+---DS3231所用地址
+
+local REG_SEC				    =   0x00
+local REG_MIN				    =   0x01
+local REG_HOUR			        =   0x02
+local REG_DAY				    =   0x03
+local REG_WEEK			        =   0x04
+local REG_MON				    =   0x05
+local REG_YEAR			        =   0x06
+local REG_ALM1_SEC  		    =   0x07
+local REG_ALM1_MIN 	  	        =   0x08
+local REG_ALM1_HOUR     	    =   0x09
+local REG_ALM1_DAY_DATE 	    =   0x0A
+local REG_ALM2_MIN  		    =   0x0B
+local REG_ALM2_HOUR     	    =   0x0C
+local REG_ALM2_DAY_DATE 	    =   0x0D
+local REG_CONTROL               =   0x0E
+local REG_STATUS                =   0x0F
+local REG_AGING_OFFSET          =   0x10
+local REG_TEMP_MSB 		        =   0x11
+local REG_TEMP_LSB 		        =   0x12
+
+
+local function i2c_send(data)
+    i2c.send(i2cid, i2cslaveaddr, data)
+end
+local function i2c_recv(data,num)
+    i2c.send(i2cid, i2cslaveaddr, data)
+    local revData = i2c.recv(i2cid, i2cslaveaddr, num)
+    return revData
+end
+
+local function bcd_to_hex(data)
+    local hex = bit.rshift(data,4)*10+bit.band(data,0x0f)
+    return hex;
+end
+
+local function hex_to_bcd(data)
+    local bcd = bit.lshift(math.floor(data/10),4)+data%10
+    return bcd;
+end
+
+--[[
+ds3231初始化
+@api ds3231.init(i2c_id)
+@number i2c_id i2c_id
+@return bool   成功返回true
+@usage
+ds3231.init(0)
+]]
+function ds3231.init(i2c_id)
+    i2cid = i2c_id
+    i2c_send({REG_CONTROL, 0x04})--close clock out
+    log.info("ds3231 init_ok")
+    return true
+end
+
+--[[
+获取温度数据
+@api ds3231.get_temperature()
+@return number 温度数据
+@usage
+log.info("ds3231.get_temperature", ds3231.get_temperature())
+]]
+function ds3231.get_temperature()
+    local temp
+    local T = i2c_recv(REG_TEMP_MSB,2)
+    if bit.band(T:byte(1),0x80) then
+        --negative temperature
+        temp = T:byte(1)
+        temp = temp - (bit.rshift(T:byte(2),6)*0.25)--0.25C resolution
+    else
+        --positive temperature
+        temp =  T:byte(1)
+        temp = temp + (bit.band(bit.rshift(T:byte(2),6),0x03)*0.25)
+    end
+	return temp;
+end
+
+--[[
+获取时间
+@api ds3231.read_time()
+@return table 时间表
+@usage
+local time = ds3231.read_time()
+log.info("ds3231.read_time",time.tm_year,time.tm_mon,time.tm_mday,time.tm_hour,time.tm_min,time.tm_sec)
+]]
+function ds3231.read_time()
+    -- read time
+    local time_data = {}
+    local data = i2c_recv(REG_SEC,7)
+    time_data.tm_year  = bcd_to_hex(data:byte(7)) + 2000
+    time_data.tm_mon   = bcd_to_hex(bit.band(data:byte(6),0x7f)) - 1
+    time_data.tm_mday  = bcd_to_hex(data:byte(5))
+    time_data.tm_hour  = bcd_to_hex(data:byte(3))
+    time_data.tm_min   = bcd_to_hex(data:byte(2))
+    time_data.tm_sec   = bcd_to_hex(data:byte(1))
+	return time_data
+end
+
+--[[
+设置时间
+@api ds3231.set_time(time)
+@table time 时间表
+@usage
+local set_time = {tm_year=2021,tm_mon=3,tm_mday=0,tm_wday=0,tm_hour=0,tm_min=0,tm_sec=0}
+ds3231.set_time(set_time)
+]]
+function ds3231.set_time(time)
+    -- set time
+    local data7 = hex_to_bcd(time.tm_year + 2000)
+    local data6 = hex_to_bcd(time.tm_mon + 1)
+    local data5 = hex_to_bcd(time.tm_mday)
+    local data4 = hex_to_bcd(time.tm_wday+1)
+    local data3 = hex_to_bcd(time.tm_hour)
+    local data2 = hex_to_bcd(time.tm_min)
+    local data1 = hex_to_bcd(time.tm_sec)
+    i2c_send({REG_SEC, data1,data2,data3,data4,data5,data6,data7})
+end
+
+return ds3231
+
+
+

+ 9 - 0
script/libs/ds3231/package.json

@@ -0,0 +1,9 @@
+{
+    "type" : "lua", // 可以是lua(纯lua), c(纯c), 或者lua-c(混合)
+    "enterpoint" : "ds3231.lua",
+    "compatibility" : {
+        "soc" : true,
+        "air" : true
+    },
+    "dependency" : ["i2c"] // 需要何种硬件或软件接口
+}