eikhner

test_i2c.c

Sep 14th, 2025 (edited)
142
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.47 KB | None | 0 0
  1. /**
  2.  * @file    test_i2c.c
  3.  * @version v1.0 (2025-09-14)
  4.  * @brief   Реализация smoke-теста для M24C02: init → load/save → verify с выводом на LCD.
  5.  */
  6.  
  7. #include <stdio.h>   // для snprintf (иначе возможен крэш)
  8.  
  9. #include "test_i2c.h"
  10. #include "lcd_shared.h"
  11.  
  12. #include <string.h>
  13. #include "../../Memory/config_store.h"
  14.  
  15. #include "eeprom_24xx.h"  // добавь рядом с остальными инклюдами
  16. #include "config_version.h"
  17.  
  18.  
  19.  
  20. /* ---------------- Пользовательские настройки теста ---------------- */
  21.  
  22. /** Версия структуры ConfigPayload, которую ожидаем в EEPROM. */
  23. #include "config_version.h"  /* CONFIG_VERSION */
  24.  
  25. /** Какой I2C использовать для EEPROM: hi2c2 (PB10/PB11). */
  26. extern I2C_HandleTypeDef hi2c2;
  27.  
  28. /** 7-битный адрес EEPROM при A0=A1=A2=GND. */
  29. #define EE_ADDR_7BIT  0x50
  30.  
  31. /* ---------------- Локальные утилиты ---------------- */
  32.  
  33. /**
  34.  * @brief  Печать строго 20 символов в заданную строку LCD (через RuChar()).
  35.  * @param  row  Номер строки 0..3.
  36.  * @param  s    Нуль-терминированная строка (длиннее 20 будет обрезана).
  37.  * @return void
  38.  * @note   Буфер локально заполняется пробелами; позиционирование курсора: (0, row).
  39.  */
  40. static void LCD_Line(uint8_t row, const char *s)
  41. {
  42.     char buf[21];
  43.     memset(buf, ' ', 20);
  44.     buf[20] = '\0';
  45.     if (s) {
  46.         size_t L = strlen(s);
  47.         if (L > 20) L = 20;
  48.         memcpy(buf, s, L);
  49.     }
  50.     I2C_LCD_SetCursor(MyI2C_LCD, 0, row);
  51.     I2C_LCD_WriteString(MyI2C_LCD, RuChar(buf));
  52. }
  53.  
  54. /* ---------------- Публичный тест ---------------- */
  55.  
  56. /**
  57.  * @brief  Демонстрационный прогон EEPROM-хранилища:
  58.  *         1) init; 2) попытка load;
  59.  *         3) при отсутствии валидной записи — запись дефолтов;
  60.  *         4) модификация параметра, повторная запись;
  61.  *         5) перечитывание и сравнение с ожидаемым.
  62.  * @param  void  Нет параметров.
  63.  * @return void  Ничего не возвращает.
  64.  * @note   Весь прогресс выводится на LCD строками 0..3, с паузами HAL_Delay().
  65.  */
  66. void Eeprom_SmokeTest(void)
  67. {
  68.     extern I2C_HandleTypeDef hi2c2;
  69.     ConfigPayload cfg = {0}, back = {0};
  70.     uint8_t used = 0xFF, ver = 0;
  71.     char line[21];
  72.  
  73.     LCD_Line(0, "EE: init...");
  74.     if (!config_store_init(&hi2c2, 0x50)) {
  75.         LCD_Line(1, "init: ERR (NACK)");
  76.         HAL_Delay(3000);
  77.         return;
  78.     }
  79.     LCD_Line(1, "init: OK");
  80.  
  81.     /* L1: пробуем загрузить */
  82.     if (!config_store_load(CONFIG_VERSION, &cfg, &used, &ver)) {
  83.         LCD_Line(2, "load: empty -> def");
  84.         config_store_fill_defaults(&cfg);
  85.         LCD_Line(3, "S1...");
  86.         HAL_Delay(3000);
  87.         if (!config_store_save(CONFIG_VERSION, &cfg)) {
  88.             LCD_Line(3, "S1:ERR");
  89.             HAL_Delay(3000);
  90.             return;
  91.         }
  92.         LCD_Line(3, "S1:OK");
  93.         HAL_Delay(3000);
  94.     } else {
  95.         snprintf(line, sizeof(line), "load: OK slot:%c v%u",
  96.                  (used==0)?'A':(used==1)?'B':'?', ver);
  97.         LCD_Line(2, line);
  98.         HAL_Delay(3000);
  99.     }
  100.  
  101.     /* S2/L2: изменить + сохранить + перечитать */
  102.     cfg.fan_t1 += 1;
  103.  
  104.     /* Стандартизируем значения под правила меню (диапазоны/порядок) */
  105.     config_sanitize(&cfg);
  106.  
  107.     LCD_Line(3, "S2...");
  108.     HAL_Delay(3000);
  109.     if (!config_store_save(CONFIG_VERSION, &cfg)) {
  110.         LCD_Line(3, "S2:ERR");
  111.         HAL_Delay(3000);
  112.         return;
  113.     }
  114.  
  115.     LCD_Line(3, "L2...");
  116.     HAL_Delay(3000);
  117.     if (!config_store_load(CONFIG_VERSION, &back, &used, &ver)) {
  118.         LCD_Line(3, "L2:ERR");
  119.         HAL_Delay(3000);
  120.         return;
  121.     }
  122.  
  123.     if (memcmp(&cfg, &back, sizeof(ConfigPayload)) == 0) {
  124.         snprintf(line, sizeof(line), "OK slot:%c v%u",
  125.                  (used==0)?'A':(used==1)?'B':'?', ver);
  126.         LCD_Line(3, line);
  127.         HAL_Delay(3000);
  128.     } else {
  129.         LCD_Line(3, "mismatch!");
  130.         HAL_Delay(3000);
  131.     }
  132.  
  133.     HAL_Delay(3000);
  134. }
  135.  
Advertisement
Add Comment
Please, Sign In to add comment