From adc1a1af40483d17d12c23bfce3a1c3a841e47a3 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Tue, 7 Mar 2023 12:49:29 +0600 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A7=D1=82=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20attiny=20=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B7=20=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=82=D1=83?= =?UTF-8?q?=D1=80=D1=83=20Header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Читается 23 байта в переменную типа Header. К прочитанным данным можно обращаться как к структуре. Структура объявлена с выравниванием в 1 байт. Контрольная сумма проверяется для всего объекта. Если crc_8 посчитать в конце к самой себе, результат будет равен 0. В конце проверяется только рассчитанное значение crc на равенство 0 (Контрольная сумма совпадает) --- ESP8266/src/master_i2c.cpp | 108 +++++++++++++++++++++---------------- ESP8266/src/master_i2c.h | 28 ++++++++++ 2 files changed, 90 insertions(+), 46 deletions(-) diff --git a/ESP8266/src/master_i2c.cpp b/ESP8266/src/master_i2c.cpp index 41434834..a6e420f9 100644 --- a/ESP8266/src/master_i2c.cpp +++ b/ESP8266/src/master_i2c.cpp @@ -83,6 +83,29 @@ bool MasterI2C::getByte(uint8_t &value, uint8_t &crc) return true; } +bool MasterI2C::getByte(uint8_t *value, uint8_t &crc) +{ + + if (Wire.requestFrom(I2C_SLAVE_ADDR, 1) != 1) + { + LOG_ERROR(F("RequestFrom failed")); + return false; + } + *value = (uint8_t)Wire.read(); + crc = crc_8(value, 1, crc); + return true; +} + +bool MasterI2C::getBytes(uint8_t *value, uint8_t count, uint8_t &crc) +{ + for (; count > 0; count--, value++) + { + if (!getByte(value, crc)) + return false; + } + return true; +} + bool MasterI2C::getUint16(uint16_t &value, uint8_t &crc) { @@ -134,55 +157,48 @@ bool MasterI2C::getSlaveData(SlaveData &data) { sendCmd('B'); data.diagnostic = WATERIUS_NO_LINK; - - uint8_t dummy, crc = 0; - bool good = getByte(data.version, crc); - good &= getByte(data.service, crc); - good &= getUint16(data.reserved4, crc); - good &= getByte(data.reserved, crc); - good &= getByte(data.setup_started_counter, crc); - - good &= getByte(data.resets, crc); - good &= getByte(data.model, crc); - good &= getByte(data.state0, crc); - good &= getByte(data.state1, crc); - - good &= getUint(data.impulses0, crc); - good &= getUint(data.impulses1, crc); - - good &= getUint16(data.adc0, crc); - good &= getUint16(data.adc1, crc); - - good &= getByte(data.crc, dummy); - - if (good) + Header buffer; + uint8_t crc = 0; + if (!getBytes((uint8_t *)&buffer, 23, crc)) { - data.diagnostic = (data.crc == crc) ? WATERIUS_OK : WATERIUS_BAD_CRC; + LOG_ERROR(F("Data failed")); + return false; } - - switch (data.diagnostic) + data.version = buffer.version; + data.service = buffer.service; + data.setup_started_counter = buffer.setup_started_counter; + data.resets = buffer.resets; + data.model = buffer.model; + data.state0 = buffer.state0; + data.state1 = buffer.state1; + + data.impulses0 = buffer.value0; + data.impulses1 = buffer.value1; + data.adc0 = buffer.adc0; + data.adc1 = buffer.adc1; + data.crc = buffer.crc; + + LOG_INFO(F("version: ") << data.version); + LOG_INFO(F("service: ") << data.service); + LOG_INFO(F("setup_started_counter: ") << data.setup_started_counter); + LOG_INFO(F("resets: ") << data.resets); + LOG_INFO(F("MODEL: ") << data.model); + LOG_INFO(F("state0: ") << data.state0); + LOG_INFO(F("state1: ") << data.state1); + LOG_INFO(F("impulses0: ") << data.impulses0); + LOG_INFO(F("impulses1: ") << data.impulses1); + LOG_INFO(F("adc0: ") << data.adc0); + LOG_INFO(F("adc1: ") << data.adc1); + + if (crc) { - case WATERIUS_BAD_CRC: - LOG_ERROR(F("CRC wrong")); - case WATERIUS_OK: - LOG_INFO(F("version: ") << data.version); - LOG_INFO(F("service: ") << data.service); - LOG_INFO(F("setup_started_counter: ") << data.setup_started_counter); - LOG_INFO(F("resets: ") << data.resets); - LOG_INFO(F("MODEL: ") << data.model); - LOG_INFO(F("state0: ") << data.state0); - LOG_INFO(F("state1: ") << data.state1); - LOG_INFO(F("impulses0: ") << data.impulses0); - LOG_INFO(F("impulses1: ") << data.impulses1); - LOG_INFO(F("adc0: ") << data.adc0); - LOG_INFO(F("adc1: ") << data.adc1); - LOG_INFO(F("CRC ok")); - break; - case WATERIUS_NO_LINK: - LOG_ERROR(F("Data failed")); - }; - - return data.diagnostic == WATERIUS_OK; + LOG_ERROR(F("CRC wrong ")< Date: Wed, 8 Mar 2023 06:45:24 +0600 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9E=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ESP8266/src/master_i2c.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/ESP8266/src/master_i2c.cpp b/ESP8266/src/master_i2c.cpp index a6e420f9..51a7ec95 100644 --- a/ESP8266/src/master_i2c.cpp +++ b/ESP8266/src/master_i2c.cpp @@ -83,6 +83,14 @@ bool MasterI2C::getByte(uint8_t &value, uint8_t &crc) return true; } +/** + * @brief Чтение одного байта по указателю + * + * @param value указатель приемника + * @param crc контрольная сумма + * @return true прочитано успешно + * @return false данные не прочитаны + */ bool MasterI2C::getByte(uint8_t *value, uint8_t &crc) { @@ -96,6 +104,15 @@ bool MasterI2C::getByte(uint8_t *value, uint8_t &crc) return true; } +/** + * @brief Чтение заданного количества байт в буффер по указателю + * + * @param value указатель на буфер приемника + * @param count количество байт для чтения + * @param crc контрольная сумма для расчета + * @return true прочитано успешно + * @return false данные не прочитаны + */ bool MasterI2C::getBytes(uint8_t *value, uint8_t count, uint8_t &crc) { for (; count > 0; count--, value++) @@ -153,6 +170,17 @@ bool MasterI2C::getMode(uint8_t &mode) return true; } +/** + * @brief Чтение данных с прибора. + * + * Данные читаются в буффер, до контрольной суммы включительно. + * При успешном чтении расчитанная контрольная сумма должна быть равно 0, + * в противном случае во время чтения произошла ошибка. + * + * @param data Структура для заполнения данными + * @return true прочитанно успешно. + * @return false произошла ошибка, код ошибки в data.diagnostic + */ bool MasterI2C::getSlaveData(SlaveData &data) { sendCmd('B');