diff --git a/components/onewire/binding/luat_lib_onewire.c b/components/onewire/binding/luat_lib_onewire.c index 92e85249..f28d85b1 100644 --- a/components/onewire/binding/luat_lib_onewire.c +++ b/components/onewire/binding/luat_lib_onewire.c @@ -27,23 +27,6 @@ static int l_onewire_close(lua_State *L) return 0; } -static const uint8_t crc8_maxim[256] = { - 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, - 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, - 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, - 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, - 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, - 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, - 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, - 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, - 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, - 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, - 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, - 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, - 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, - 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, - 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, - 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53}; /* 读取DS18B20 @@ -70,101 +53,13 @@ static int l_onewire_ds18b20(lua_State *L) ctx.mode = luaL_checkinteger(L, 1); ctx.id = luaL_checkinteger(L, 2); int check_crc = lua_toboolean(L, 3); - // 初始化单总线 - luat_os_entry_cri(); - ret = luat_onewire_setup(&ctx); - if (ret) - { - LLOGW("setup失败 mode %d id %d ret %d", ctx.mode, ctx.id, ret); - goto exit; - } - // 复位设备 - ret = luat_onewire_reset(&ctx); - // if (ret) { - // LLOGW("reset失败 mode %d id %d ret %d", ctx.mode, ctx.id, ret); - // return 0; - // } - // 建立连接 - ret = luat_onewire_connect(&ctx); - if (ret) - { - LLOGW("connect失败 mode %d id %d ret %d", ctx.mode, ctx.id, ret); - goto exit; - } - // 写入2字节的数据 - char wdata[] = {0xCC, 0x44}; /* skip rom */ /* convert */ - luat_onewire_write(&ctx, wdata, 2); - - // 再次复位 - luat_onewire_reset(&ctx); - // 再次建立连接 - ret = luat_onewire_connect(&ctx); - if (ret) - { - LLOGW("connect失败2 mode %d id %d ret %d", ctx.mode, ctx.id, ret); - goto exit; - } - - wdata[1] = 0xBE; - luat_onewire_write(&ctx, wdata, 2); - - uint8_t data[9] = {0}; - // 校验模式读9个字节, 否则读2个字节 - ret = luat_onewire_read(&ctx, (char*)data, check_crc ? 9 : 2); - luat_onewire_close(&ctx); // 后续不需要读取的 - if (ret != 9) - { - LLOGW("read失败2 mode %d id %d ret %d", ctx.mode, ctx.id, ret); - goto exit; - } - - if (check_crc) - { - uint8_t crc = 0; - for (size_t i = 0; i < 8; i++){ - crc = crc8_maxim[crc ^ data[i]]; - } - if (crc != data[8]) { - LLOGD("crc %02X %02X", crc, data[8]); - goto exit; - } - } - - uint8_t TL, TH; - int32_t tem; - int32_t val; - - TL = data[0]; - TH = data[1]; - - // LLOGD("读出的数据"); - // LLOGDUMP(data, 9); - - if (TH > 7) - { - TH = ~TH; - TL = ~TL; - tem = TH; - tem <<= 8; - tem += TL; - tem = (int32_t)(tem * 0.0625 * 10 + 0.5); - val = -tem; - } - else - { - tem = TH; - tem <<= 8; - tem += TL; - tem = (int32_t)(tem * 0.0625 * 10 + 0.5); - val = tem; + int32_t val = 0; + ret = luat_onewire_ds18b20(&ctx, check_crc, &val); + if (ret) { + return 0; } lua_pushinteger(L, val); - luat_os_exit_cri(); return 1; -exit: - luat_onewire_close(&ctx); // 清理并关闭 - luat_os_exit_cri(); - return 0; } #include "rotable2.h" diff --git a/components/onewire/include/luat_onewire.h b/components/onewire/include/luat_onewire.h index 14d295f7..eb05c00a 100644 --- a/components/onewire/include/luat_onewire.h +++ b/components/onewire/include/luat_onewire.h @@ -13,22 +13,16 @@ typedef struct luat_onewire_ctx int luat_onewire_setup(luat_onewire_ctx_t* ctx); -int luat_onewire_reset(luat_onewire_ctx_t* ctx); -int luat_onewire_connect(luat_onewire_ctx_t* ctx); int luat_onewire_read(luat_onewire_ctx_t* ctx, char* buff, size_t len); int luat_onewire_write(luat_onewire_ctx_t* ctx, const char* buff, size_t len); int luat_onewire_close(luat_onewire_ctx_t* ctx); int luat_onewire_setup_gpio(luat_onewire_ctx_t* ctx); -int luat_onewire_reset_gpio(luat_onewire_ctx_t* ctx); -int luat_onewire_connect_gpio(luat_onewire_ctx_t* ctx); int luat_onewire_read_gpio(luat_onewire_ctx_t* ctx, char* buff, size_t len); int luat_onewire_write_gpio(luat_onewire_ctx_t* ctx, const char* buff, size_t len); int luat_onewire_close_gpio(luat_onewire_ctx_t* ctx); typedef int (*onewire_setup)(luat_onewire_ctx_t* ctx); -typedef int (*onewire_reset)(luat_onewire_ctx_t* ctx); -typedef int (*onewire_connect)(luat_onewire_ctx_t* ctx); typedef int (*onewire_read)(luat_onewire_ctx_t* ctx, char* buff, size_t len); typedef int (*onewire_write)(luat_onewire_ctx_t* ctx, const char* buff, size_t len); typedef int (*onewire_close)(luat_onewire_ctx_t* ctx); @@ -36,8 +30,6 @@ typedef int (*onewire_close)(luat_onewire_ctx_t* ctx); typedef struct luat_onewire_opt { int32_t mode; onewire_setup setup; - onewire_reset reset; - onewire_connect connect; onewire_read read; onewire_write write; onewire_close close; @@ -45,4 +37,6 @@ typedef struct luat_onewire_opt { int luat_onewire_set_hw_opt(const luat_onewire_opt_t* ctx); +int luat_onewire_ds18b20(const luat_onewire_ctx_t* ctx, int check_crc, int32_t *re); + #endif diff --git a/components/onewire/src/luat_onewire.c b/components/onewire/src/luat_onewire.c index f997d630..2ffbb4b6 100644 --- a/components/onewire/src/luat_onewire.c +++ b/components/onewire/src/luat_onewire.c @@ -10,8 +10,6 @@ static luat_onewire_opt_t* opt_hw; static const luat_onewire_opt_t opt_gpio = { .mode = LUAT_ONEWIRE_MODE_GPIO, .setup = luat_onewire_setup_gpio, - .reset = luat_onewire_reset_gpio, - .connect = luat_onewire_connect_gpio, .read = luat_onewire_read_gpio, .write = luat_onewire_write_gpio, .close = luat_onewire_close_gpio @@ -41,20 +39,6 @@ int luat_onewire_setup(luat_onewire_ctx_t* ctx) { return opt->setup(ctx); } -int luat_onewire_reset(luat_onewire_ctx_t* ctx){ - const luat_onewire_opt_t* opt = get_opt(ctx); - if (opt == NULL) - return -1; - return opt->reset(ctx); -} - -int luat_onewire_connect(luat_onewire_ctx_t* ctx){ - const luat_onewire_opt_t* opt = get_opt(ctx); - if (opt == NULL) - return -1; - return opt->connect(ctx); -} - int luat_onewire_read(luat_onewire_ctx_t* ctx, char* buff, size_t len){ const luat_onewire_opt_t* opt = get_opt(ctx); if (opt == NULL) @@ -82,7 +66,7 @@ int luat_onewire_setup_gpio(luat_onewire_ctx_t* ctx) { return 0; } -int luat_onewire_reset_gpio(luat_onewire_ctx_t* ctx) { +int ds18b20_reset_gpio(luat_onewire_ctx_t* ctx) { int pin = ctx->id; luat_gpio_mode(pin, Luat_GPIO_OUTPUT, Luat_GPIO_PULLUP, Luat_GPIO_LOW); luat_gpio_set(pin, Luat_GPIO_LOW); @@ -92,7 +76,7 @@ int luat_onewire_reset_gpio(luat_onewire_ctx_t* ctx) { return 0; } -int luat_onewire_connect_gpio(luat_onewire_ctx_t* ctx) { +int ds18b20_connect_gpio(luat_onewire_ctx_t* ctx) { uint8_t retry = 0; int pin = ctx->id; luat_gpio_mode(pin, Luat_GPIO_INPUT, Luat_GPIO_PULLUP, 0); @@ -196,3 +180,122 @@ int luat_onewire_close_gpio(luat_onewire_ctx_t* ctx) { return 0; } +static const uint8_t crc8_maxim[256] = { + 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, + 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, + 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, + 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, + 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, + 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, + 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, + 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, + 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, + 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, + 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, + 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, + 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, + 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, + 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, + 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53}; + + +int luat_onewire_ds18b20(const luat_onewire_ctx_t* ctx, int check_crc, int32_t *re) { + + // 初始化单总线 + luat_os_entry_cri(); + int ret = luat_onewire_setup(ctx); + if (ret) + { + LLOGW("setup失败 mode %d id %d ret %d", ctx->mode, ctx->id, ret); + goto exit; + } + // 复位设备 + ret = ds18b20_reset_gpio(ctx); + // if (ret) { + // LLOGW("reset失败 mode %d id %d ret %d", ctx->mode, ctx->id, ret); + // return 0; + // } + // 建立连接 + ret = ds18b20_connect_gpio(ctx); + if (ret) + { + LLOGW("connect失败 mode %d id %d ret %d", ctx->mode, ctx->id, ret); + goto exit; + } + // 写入2字节的数据 + char wdata[] = {0xCC, 0x44}; /* skip rom */ /* convert */ + luat_onewire_write(ctx, wdata, 2); + + // 再次复位 + ds18b20_reset_gpio(ctx); + // 再次建立连接 + ret = ds18b20_connect_gpio(ctx); + if (ret) + { + LLOGW("connect失败2 mode %d id %d ret %d", ctx->mode, ctx->id, ret); + goto exit; + } + + wdata[1] = 0xBE; + luat_onewire_write(ctx, wdata, 2); + + uint8_t data[9] = {0}; + // 校验模式读9个字节, 否则读2个字节 + ret = luat_onewire_read(ctx, (char*)data, check_crc ? 9 : 2); + luat_onewire_close(ctx); // 后续不需要读取的 + if (ret != 9) + { + LLOGW("read失败2 mode %d id %d ret %d", ctx->mode, ctx->id, ret); + goto exit; + } + + if (check_crc) + { + uint8_t crc = 0; + for (size_t i = 0; i < 8; i++){ + crc = crc8_maxim[crc ^ data[i]]; + } + if (crc != data[8]) { + LLOGD("crc %02X %02X", crc, data[8]); + goto exit; + } + } + + uint8_t TL, TH; + int32_t tem; + int32_t val; + + TL = data[0]; + TH = data[1]; + + // LLOGD("读出的数据"); + // LLOGDUMP(data, 9); + + if (TH > 7) + { + TH = ~TH; + TL = ~TL; + tem = TH; + tem <<= 8; + tem += TL; + tem = (int32_t)(tem * 0.0625 * 10 + 0.5); + val = -tem; + } + else + { + tem = TH; + tem <<= 8; + tem += TL; + tem = (int32_t)(tem * 0.0625 * 10 + 0.5); + val = tem; + } + luat_onewire_close(ctx); // 清理并关闭 + luat_os_exit_cri(); + *re = val; + return 0; +exit: + luat_onewire_close(ctx); // 清理并关闭 + luat_os_exit_cri(); + return -1; +} +