Jelajahi Sumber

add:添加i2c发送停止位选择

Dozingfiretruck 3 tahun lalu
induk
melakukan
e6724daded

+ 3 - 3
components/i2c-tools/i2c_utils.c

@@ -27,16 +27,16 @@ uint8_t i2c_init(const uint8_t i2c_id){
 
 uint8_t i2c_probe(char addr){
 	uint8_t data[2] = {0x00};
-    return (luat_i2c_send(i2c_tools_id, addr, data, 2) ==0);
+    return (luat_i2c_send(i2c_tools_id, addr, data, 2,1) ==0);
 }
 
 uint8_t i2c_write(char addr, uint8_t* data, int len){
-    return (luat_i2c_send(i2c_tools_id, addr, data, len) == 0);
+    return (luat_i2c_send(i2c_tools_id, addr, data, len,1) == 0);
 }
 
 uint8_t i2c_read(uint8_t addr, uint8_t reg, uint8_t* buffer, uint8_t len){
     int ret = 0;
-    ret = luat_i2c_send(i2c_tools_id, addr, &reg, 1);
+    ret = luat_i2c_send(i2c_tools_id, addr, &reg, 1,0);
     if (ret != 0)return -1;
     ret = luat_i2c_recv(i2c_tools_id, addr, buffer, len);
     if (ret != 0)return -1;

+ 2 - 2
components/mlx90640-library/MLX90640_I2C_Driver.c

@@ -39,7 +39,7 @@ int MLX90640_I2CRead(uint8_t slaveAddr, uint16_t startAddress, uint16_t nMemAddr
     cmd[0] = startAddress >> 8;
     cmd[1] = startAddress & 0x00FF;
     
-    ret = luat_i2c_send(mlx90640_i2c_id, slaveAddr, cmd, 2);
+    ret = luat_i2c_send(mlx90640_i2c_id, slaveAddr, cmd, 2,0);
     if (ret != 0)return -1;
     
     ret = luat_i2c_recv(mlx90640_i2c_id, slaveAddr, i2cData, 2*nMemAddressRead);
@@ -63,7 +63,7 @@ int MLX90640_I2CWrite(uint8_t slaveAddr, uint16_t writeAddress, uint16_t data)
     cmd[2] = data >> 8;
     cmd[3] = data & 0x00FF;
 
-    ret = luat_i2c_send(mlx90640_i2c_id, slaveAddr, cmd, 4);
+    ret = luat_i2c_send(mlx90640_i2c_id, slaveAddr, cmd, 4,0);
     if (ret != 0)return -1;
     
     ret = MLX90640_I2CRead(slaveAddr,writeAddress,1, &dataCheck);

+ 2 - 2
luat/include/luat_i2c.h

@@ -14,10 +14,10 @@ typedef struct luat_ei2c {
 int luat_i2c_exist(int id);
 int luat_i2c_setup(int id, int speed, int slaveaddr);
 int luat_i2c_close(int id);
-int luat_i2c_send(int id, int addr, void* buff, size_t len);
+int luat_i2c_send(int id, int addr, void* buff, size_t len, uint8_t stop);
 int luat_i2c_recv(int id, int addr, void* buff, size_t len);
 
-int luat_i2c_write_reg(int id, int addr, int reg, uint16_t value);
+int luat_i2c_write_reg(int id, int addr, int reg, uint16_t value, uint8_t stop);
 int luat_i2c_read_reg(int id, int addr, int reg, uint16_t* value);
 
 #endif

+ 12 - 9
luat/modules/luat_lib_i2c.c

@@ -253,6 +253,7 @@ static int l_i2c_send(lua_State *L)
     size_t len = 0;
     int result = 0;
 
+    int stop = luaL_optnumber(L, 4 , 1);
     if (lua_isinteger(L, 3))
     {
         len = lua_gettop(L) - 2;
@@ -268,7 +269,7 @@ static int l_i2c_send(lua_State *L)
         }
         else
         {
-            result = luat_i2c_send(id, addr, buff, len);
+            result = luat_i2c_send(id, addr, buff, len,stop);
         }
         luat_heap_free(buff);
     }
@@ -282,7 +283,7 @@ static int l_i2c_send(lua_State *L)
         }
         else
         {
-            result = luat_i2c_send(id, addr, (char *)buff, len);
+            result = luat_i2c_send(id, addr, (char *)buff, len,stop);
         }
     }
     else if (lua_istable(L, 3))
@@ -303,7 +304,7 @@ static int l_i2c_send(lua_State *L)
         }
         else
         {
-            result = luat_i2c_send(id, addr, buff, len);
+            result = luat_i2c_send(id, addr, buff, len,stop);
         }
         luat_heap_free(buff);
     }
@@ -316,7 +317,7 @@ static int l_i2c_send(lua_State *L)
         }
         else
         {
-            result = luat_i2c_send(id, addr, NULL, 0);
+            result = luat_i2c_send(id, addr, NULL, 0,stop);
         }
     }
     lua_pushboolean(L, result == 0);
@@ -387,6 +388,7 @@ static int l_i2c_write_reg(lua_State *L)
     int reg = luaL_checkinteger(L, 3);
     size_t len;
     const char *lb = luaL_checklstring(L, 4, &len);
+    int stop = luaL_optnumber(L, 5 , 1);
     char *buff = (char *)luat_heap_malloc(sizeof(char) * len + 1);
     *buff = (char)reg;
     memcpy(buff + 1, lb, sizeof(char) + len + 1);
@@ -398,7 +400,7 @@ static int l_i2c_write_reg(lua_State *L)
     }
     else
     {
-        result = luat_i2c_send(id, addr, buff, len + 1);
+        result = luat_i2c_send(id, addr, buff, len + 1,stop);
     }
     luat_heap_free(buff);
     lua_pushboolean(L, result == 0);
@@ -427,16 +429,17 @@ static int l_i2c_read_reg(lua_State *L)
     int addr = luaL_checkinteger(L, 2);
     int reg = luaL_checkinteger(L, 3);
     int len = luaL_checkinteger(L, 4);
+    int stop = luaL_optnumber(L, 5 , 0);
     char temp = (char)reg;
     int result;
     if (lua_isuserdata(L, 1))
     {
         luat_ei2c *ei2c = toei2c(L);
-        result = i2c_soft_send(ei2c, addr, &temp, 1);
+        result = i2c_soft_send(ei2c, addr, &temp, 0);
     }
     else
     {
-        result = luat_i2c_send(id, addr, &temp, 1);
+        result = luat_i2c_send(id, addr, &temp, 1,stop);
     }
     if (result != 0)
     { //如果返回值不为0,说明收失败了
@@ -514,7 +517,7 @@ static int l_i2c_readDHT12(lua_State *L)
     }
     else
     {
-        result = luat_i2c_send(id, addr, &temp, 1);
+        result = luat_i2c_send(id, addr, &temp, 1,1);
     }
     if (result != 0)
     {
@@ -600,7 +603,7 @@ static int l_i2c_readSHT30(lua_State *L)
         int id = luaL_optinteger(L, 1, 0);
         int addr = luaL_optinteger(L, 2, 0x44);
 
-        luat_i2c_send(id, addr, &buff, 2);
+        luat_i2c_send(id, addr, &buff, 2,1);
         luat_timer_mdelay(1);
         result = luat_i2c_recv(id, addr, buff, 6);
     }

+ 1 - 1
luat/packages/u8g2/luat_lib_u8g2.c

@@ -1001,7 +1001,7 @@ uint8_t u8x8_luat_byte_hw_i2c_default(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int
       buf_idx = 0;
       break;
     case U8X8_MSG_BYTE_END_TRANSFER:
-      luat_i2c_send(i2c_id, u8x8_GetI2CAddress(u8x8) >> 1, buffer, buf_idx);
+      luat_i2c_send(i2c_id, u8x8_GetI2CAddress(u8x8) >> 1, buffer, buf_idx,1);
       break;
     default:
       return 0;