Просмотр исходного кода

add:i2c.scan添加速度自定义
update:更新i2c.scan为统一打印

Dozingfiretruck 2 лет назад
Родитель
Сommit
561caa0462

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

@@ -12,7 +12,7 @@ void i2c_tools(const char * data,size_t len){
     char *command = strtok(i2c_tools_data, " ");
     if (memcmp("send", command, 4) == 0){
         int i2c_id = atoi(strtok(NULL, " "));
-        i2c_init(i2c_id);
+        i2c_init(i2c_id,0);
         uint8_t address = strtonum(strtok(NULL, " "));
         uint8_t send_buff[16];
         uint8_t len = 0;
@@ -28,7 +28,7 @@ void i2c_tools(const char * data,size_t len){
         }
     }else if(memcmp("recv",command,4) == 0){
         int i2c_id = atoi(strtok(NULL, " "));
-        i2c_init(i2c_id);
+        i2c_init(i2c_id,0);
         uint8_t address = strtonum(strtok(NULL, " "));
         uint8_t reg = strtonum(strtok(NULL, " "));
         uint8_t len = atoi(strtok(NULL, " "));
@@ -50,7 +50,7 @@ void i2c_tools(const char * data,size_t len){
         luat_heap_free(buffer);
     }else if(memcmp("scan",command,4) == 0){
         int i2c_id = atoi(strtok(NULL, " "));
-        i2c_init(i2c_id);
+        i2c_init(i2c_id,0);
         i2c_scan();
     }else{
         i2c_help();

+ 16 - 8
components/i2c-tools/i2c_utils.c

@@ -2,6 +2,7 @@
 #include "luat_base.h"
 #include "i2c_utils.h"
 #include "luat_i2c.h"
+#include "luat_malloc.h"
 
 #define LUAT_LOG_TAG "i2c"
 #include "luat_log.h"
@@ -26,9 +27,9 @@ void i2c_help(void){
     LLOGD("i2c tools send i2c_id address [register] data_0 data_1 ...");
 }
 
-uint8_t i2c_init(const uint8_t i2c_id){
+uint8_t i2c_init(const uint8_t i2c_id, int speed){
     i2c_tools_id = i2c_id;
-    return (luat_i2c_setup(i2c_tools_id, 0));
+    return (luat_i2c_setup(i2c_tools_id, speed));
 }
 
 uint8_t i2c_probe(char addr){
@@ -50,18 +51,25 @@ uint8_t i2c_read(uint8_t addr, uint8_t reg, uint8_t* buffer, uint8_t len){
 }
 
 void i2c_scan(void){
-    LLOGD("ID  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f");
-    char buff[64] = {0};
+    uint16_t len = 0;
+    char *scan_buff = luat_heap_malloc(512);
+    memset(scan_buff, 0, 512);
     for(unsigned char i=0; i<8; i++){
-        sprintf_(buff, "%d0: ", i);
+        sprintf_(scan_buff + len, "%d0: ", i);
+        len++;
         for(unsigned char j=0; j<16; j++){
             char addr = i*16+j;
+            len+=3;
             if( i2c_probe(addr) == 1){
-                sprintf_(buff + 4 + j*3, "%02X ", addr);
+                sprintf_(scan_buff + len, "%02X ", addr);
             }else{
-                sprintf_(buff + 4 + j*3, "-- ");
+                sprintf_(scan_buff + len, "-- ");
             }
         }
-        LLOGD("%s", buff);
+        len+=3;
+        sprintf_(scan_buff + len, "\n");
+        len++;
     }
+    LLOGD("\nID  0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f\n%s",scan_buff);
+    luat_heap_free(scan_buff);
 }

+ 1 - 1
components/i2c-tools/i2c_utils.h

@@ -9,7 +9,7 @@
 uint8_t strtonum(const char* str);
 
 void i2c_help(void);
-uint8_t i2c_init(const uint8_t i2c_id);
+uint8_t i2c_init(const uint8_t i2c_id, int speed);
 uint8_t i2c_probe(char addr);
 uint8_t i2c_write(char addr, uint8_t* data, int len);
 uint8_t i2c_read(uint8_t addr, uint8_t reg, uint8_t* buffer, uint8_t len);

+ 0 - 1
components/u8g2/luat_lib_u8g2.c

@@ -1286,7 +1286,6 @@ uint8_t u8x8_luat_byte_hw_i2c_default(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int
       }
       break;
     case U8X8_MSG_BYTE_INIT:
-      //i2c_init(u8x8);			/* init i2c communication */
       luat_i2c_setup(i2c_id,i2c_speed);
       break;
     case U8X8_MSG_BYTE_SET_DC:

+ 3 - 2
luat/modules/luat_lib_i2c.c

@@ -844,8 +844,9 @@ static int l_i2c_no_block_transfer(lua_State *L)
 
 /**
 扫描i2c设备
-@api i2c.scan(id)
+@api i2c.scan(id,speed)
 @int 设备id, 例如i2c1的id为1, i2c2的id为2
+@int 速度, 可选i2c.SLOW i2c.FAST i2c.PLUS i2c.HSMODE 默认为i2c.SLOW,如探测不到则修改此项
 @return nil 当前无返回值
 @usage
 -- 本函数于2023.07.04添加
@@ -861,7 +862,7 @@ static int l_i2c_scan(lua_State *L) {
 #include "i2c_utils.h"
 static int l_i2c_scan(lua_State *L) {
     int id = luaL_optinteger(L, 1, 0);
-    i2c_init(id);
+    i2c_init(id,luaL_optinteger(L, 2, 0));
     i2c_scan();
     return 0;
 }