浏览代码

add: 添加i2c.readReg直接读2个字节的寄存器数据

Wendal Chen 5 年之前
父节点
当前提交
934e35ba70
共有 3 个文件被更改,包括 74 次插入21 次删除
  1. 2 2
      luat/include/luat_i2c.h
  2. 43 15
      luat/modules/luat_lib_i2c.c
  3. 29 4
      luat/rtt/luat_i2c_rtt.c

+ 2 - 2
luat/include/luat_i2c.h

@@ -9,7 +9,7 @@ int luat_ic2_close(int id);
 int luat_i2c_send(int id, int addr, void* buff, size_t len);
 int luat_i2c_recv(int id, int addr, void* buff, size_t len);
 
-int luat_i2c_write_reg(int id, int addr, int reg, void* buff, size_t len);
-//int luat_i2c_read_reg(int id, int reg, void* buff, size_t len);
+int luat_i2c_write_reg(int id, int addr, int reg, uint16_t value);
+int luat_i2c_read_reg(int id, int addr, int reg, uint16_t* value);
 
 #endif

+ 43 - 15
luat/modules/luat_lib_i2c.c

@@ -115,23 +115,51 @@ static int l_i2c_write_reg(lua_State *L) {
     int id = luaL_checkinteger(L, 1);
     int addr = luaL_checkinteger(L, 2);
     int reg = luaL_checkinteger(L, 3);
-    size_t len;
-    if (lua_isstring(L, 4)) {
-        const char* buff = luaL_checklstring(L, 4, &len);
-        luat_i2c_write_reg(id, addr, reg, (char*)buff, len);
-    }
-    else if (lua_isinteger(L, 4)) {
-        len = lua_gettop(L) - 2;
-        char buff[len+1];
-        for (size_t i = 0; i < len; i++)
-        {
-            buff[i] = lua_tointeger(L, 3+i);
-        }
-        luat_i2c_write_reg(id, addr, reg, buff, len);
-    }
+    uint16_t value = luaL_checkinteger(L, 4);
+    // size_t len;
+    // if (lua_isstring(L, 4)) {
+    //     const char* buff = luaL_checklstring(L, 4, &len);
+    //     luat_i2c_write_reg(id, addr, reg, (char*)buff, len);
+    // }
+    // else if (lua_isinteger(L, 4)) {
+    //     len = lua_gettop(L) - 2;
+    //     char buff[len+1];
+    //     for (size_t i = 0; i < len; i++)
+    //     {
+    //         buff[i] = lua_tointeger(L, 3+i);
+    //     }
+    //     luat_i2c_write_reg(id, addr, reg, buff, len);
+    // }
+    luat_i2c_write_reg(id, addr, reg, value);
     return 0;
 }
 
+static int l_i2c_read_reg(lua_State *L) {
+    int id = luaL_checkinteger(L, 1);
+    int addr = luaL_checkinteger(L, 2);
+    int reg = luaL_checkinteger(L, 3);
+    uint16_t value = 0;
+    // size_t len;
+    // if (lua_isstring(L, 4)) {
+    //     const char* buff = luaL_checklstring(L, 4, &len);
+    //     luat_i2c_write_reg(id, addr, reg, (char*)buff, len);
+    // }
+    // else if (lua_isinteger(L, 4)) {
+    //     len = lua_gettop(L) - 2;
+    //     char buff[len+1];
+    //     for (size_t i = 0; i < len; i++)
+    //     {
+    //         buff[i] = lua_tointeger(L, 3+i);
+    //     }
+    //     luat_i2c_write_reg(id, addr, reg, buff, len);
+    // }
+    if (luat_i2c_read_reg(id, addr, reg, &value) == 0) {
+        //
+    }
+    lua_pushinteger(L, value); 
+    return 1;
+}
+
 /*
 关闭i2c设备
 @api i2c.close(id)
@@ -155,7 +183,7 @@ static const rotable_Reg reg_i2c[] =
     { "send", l_i2c_send, 0},
     { "recv", l_i2c_recv, 0},
     { "writeReg", l_i2c_write_reg, 0},
-    // { "readReg", l_i2c_read_reg, 0},
+    { "readReg", l_i2c_read_reg, 0},
     { "close", l_i2c_close, 0},
     { "FAST",  NULL, 1},
     { "SLOW",  NULL, 0},

+ 29 - 4
luat/rtt/luat_i2c_rtt.c

@@ -136,13 +136,38 @@ int luat_i2c_recv(int id, int addr, void* buff, size_t len) {
     return luat_i2c_transfer(id, addr, RT_I2C_RD, buff, len);
 }
 
-int luat_i2c_write_reg(int id, int addr, int reg, void* buff, size_t len) {
+int luat_i2c_write_reg(int id, int addr, int reg, uint16_t value) {
     if (!luat_i2c_exist(id)) return 1;
-    return write_reg(i2c_devs[id], addr, reg, buff, len);
+    rt_uint8_t buf[3];
+
+    buf[0] = reg; //cmd
+    buf[1] = (value >> 8) & 0xFF;
+    buf[2] = value & 0xFF;
+
+    if (rt_i2c_master_send(i2c_devs[id], addr, 0, buf, 3) == 3)
+        return RT_EOK;
+    else
+        return -RT_ERROR;
 }
-int luat_i2c_read_reg(int id,  int addr, void* buff, size_t len) {
+
+int luat_i2c_read_reg(int id,  int addr, int reg, uint16_t* value) {
     if (!luat_i2c_exist(id)) return 1;
-    return read_regs(i2c_devs[id], addr, buff, len);
+    struct rt_i2c_msg msgs;
+    uint8_t a;
+    a = addr;
+
+    msgs.addr = addr;
+    msgs.flags = RT_I2C_RD;
+    msgs.buf = &a;
+    msgs.len = 1;
+    rt_i2c_master_send(i2c_devs[id], addr, 0, &msgs, 1);
+
+    char buff[2] = {0};
+
+    rt_i2c_master_recv(i2c_devs[id], addr, 0, buff, 2);
+
+    *value = buff[0] << 8 + buff[1];
+    return 0;
 }
 
 #endif