Обновление

parent 1c1e2bb5
...@@ -65,17 +65,118 @@ ...@@ -65,17 +65,118 @@
Коды команд от 0 до 31 выделены под базовые для любого устройства команды. Коды от 32 до 255 под специфичные команды, они не будут описаны в данном документе. Коды команд от 0 до 31 выделены под базовые для любого устройства команды. Коды от 32 до 255 под специфичные команды, они не будут описаны в данном документе.
todo - сделать описание базовых команд (сделать таблицу с кодами, описанием и ответами) | ID | Команда | Формат | Ответ | Описание |
|-----|-----|-----|-----|-----|
Список базовых команд: | 0x00 | T00 | T00[PWD]\r | t00\r | Открыть соединение (пароль опционально) |
- открытие соединения; | 0x01 | T01 | T01\r | t01\r | Закрыть соединение |
- закрытие соединения; | 0x02 | T02 | T02\r | t02\r | Проверка соединения (ping) |
- Получение информации об устройстве (имя, серийный номер, версия ПО); | 0x0A | T0A | T0A\r | t0A[данные]\r | Информация об устройстве |
- Чтение памяти | 0x14 | T14 | T14[ADDR][SIZE]\r | t14[ДАННЫЕ]\r | Чтение памяти (T142000000004\r, T140800000010\r) |
- Запись памяти | 0x15 | T15 | T15[ADDR][ДАННЫЕ]\r | t15\r | Запись памяти (T1520000000AABBCCDD\r, T1520000000AA\r) |
- ... | 0xXX | - | - | - | - |
#### 3.2 Формат ответа T0A
Ответ на команду T0A содержит информацию об устройстве в следующем формате:
`
t0A[board_id][name_len][name][sn_len][sn][ver_len][ver]\r
`
| Поле | Размер | Описание |
|-----|-----|-----|
| board_id | 1 байт | Идентификатор платы (0-255) |
| name_len | 1 байт | Длина имени устройства |
| name | name_len байт | Имя устройства (ASCII) |
| sn_len | 1 байт | Длина серийного номера |
| sn | sn_len байт | Серийный номер (ASCII) |
| ver_len | 1 байт | Длина версии ПО |
| ver | ver_len байт | Версия ПО (ASCII) |
#### 3.3 Формат команд чтения/записи памяти
T14 – чтение памяти
- ADDR – 4 байта (8 HEX символов) – адрес в памяти
- SIZE – 1 байт (2 HEX символа) – количество байт для чтения (1-64)
- Допустимые адреса: Flash (0x08000000-0x08200000), SRAM (0x20000000-0x20020000)
T15 – запись памяти
- ADDR – 4 байта (8 HEX символов) – адрес в памяти
- ДАННЫЕ – 1-64 байта (2-128 HEX символов) – данные для записи
- Запись возможна только в SRAM (0x20000000-0x20020000)
#### 3.3 Рекомендуемые команды для диагностики
Для тестирования и поиска неисправностей рекомендуется добавить следующие команды:
| Код | Команда | Формат | Ответ | Назначение | Что проверяет |
|-----|-----|-----|-----|-----|-----|
| 0x03 | T03 | T03\r | t03\r | Сброс устройства | Перезагрузка МК, корректность инициализации после сброса |
| 0x04 | T04 | T04\r | t04[STATUS]\r | Статус устройства | Флаги ошибок (1 байт: бит0-аппаратная, бит1-программная, бит2-конфигурация) |
| 0x05 | T05 | T05\r | t05[RESULT]\r | Self-test | RAM (чтение/запись), Flash (CRC), периферия (регистры) |
| 0x06 | T06 | T06[PIN]\r | t06[VALUE]\r | Чтение GPIO | Состояние указанного пина (0/1) или всех пинов порта |
| 0x07 | T07 | T07[PIN][VALUE]\r | t07\r | Запись GPIO | Управление выходом (установка 0 или 1), проверка цепи |
| 0x08 | T08 | T08[ADDR]\r | t08[VALUE]\r | Чтение регистра ПЛИС | fpga_read_reg() – связь с ПЛИС, целостность регистров |
| 0x09 | T09 | T09[ADDR][VALUE]\r | t09\r | Запись регистра ПЛИС | fpga_write_reg() – конфигурация ПЛИС, проверка записи |
| 0x10 | T10 | T10\r | t10[TEMP]\r | Чтение температуры | Встроенный датчик МК, корректность АЦП |
| 0x11 | T11 | T11\r | t11[VDD][VBAT]\r | Чтение напряжения | VDD (питание), VBAT (батарея), корректность АЦП |
| 0x12 | T12 | T12[DATA]\r | t12\r | Логирование в файл | Запись данных в Flash (циклический буфер для отладки) |
| 0x13 | T13 | T13\r | t13[VERSION]\r | Версия загрузчика | Bootloader version (отдельно от прошивки МК) |
### 4. API библиотеки для ПК ### 4. API библиотеки для ПК
todo `
\ No newline at end of file class CLIProtocol:
def __init__(self, port: str, baudrate: int = 115200):
"""Инициализация"""
self.port = port
self.baudrate = baudrate
def open(self) -> bool:
"""Открыть COM-порт"""
pass
def close(self) -> None:
"""Закрыть COM-порт"""
pass
def send_cmd(self, cmd: int, data: bytes = b'') -> bytes:
"""Отправить команду и получить ответ"""
pass
def get_error_string(self, err_code: int) -> str:
"""Получить текстовое описание ошибки"""
errors = {
0x00: "Нет ошибки",
0x01: "Неизвестная команда",
0x02: "Неверный формат или значение аргумента",
0x03: "Внутренняя ошибка устройства"
}
return errors.get(err_code, "Неизвестная ошибка")
def open_connection(self, password: str = "") -> bool:
"""Открыть соединение (T00)"""
pass
def close_connection(self) -> bool:
"""Закрыть соединение (T01)"""
pass
def ping(self) -> bool:
"""Проверить соединение (T02)"""
pass
def get_device_info(self) -> dict:
"""Получить информацию об устройстве (T0A)"""
pass
def read_memory(self, addr: int, size: int) -> bytes:
"""Чтение памяти (T14)"""
pass
def write_memory(self, addr: int, data: bytes) -> bool:
"""Запись памяти (T15)"""
pass
`
\ No newline at end of file
This diff is collapsed.
...@@ -5,26 +5,25 @@ ...@@ -5,26 +5,25 @@
#include "l_macro_types.h" #include "l_macro_types.h"
#include <stdbool.h> #include <stdbool.h>
//************************************ Константы протокола *************************************************
#define CLI_BROADCAST_ID 0xFFU // Широковещательный адрес (команды для всех плат без ответа)
//************************************ Коды команд (по протоколу 1.1) ************************************* //************************************ Коды команд (по протоколу 1.1) *************************************
typedef enum { typedef enum {
CLI_CMD_OPEN = 0x00U, // T00 - открыть соединение CLI_CMD_OPEN = 0x00U, // T00 - открыть соединение
CLI_CMD_CLOSE = 0x01U, // T01 - закрыть соединение CLI_CMD_CLOSE = 0x01U, // T01 - закрыть соединение
CLI_CMD_PING = 0x02U, // T02 - проверка соединения CLI_CMD_PING = 0x02U, // T02 - проверка соединения (ping)
CLI_CMD_GET_INFO = 0x0AU, // T0A - информация об устройстве CLI_CMD_GET_INFO = 0x0AU, // T0A - информация об устройстве
CLI_CMD_READ_MEM = 0x14U, // T14 - чтение памяти CLI_CMD_READ_MEM = 0x14U, // T14 - чтение памяти
CLI_CMD_WRITE_MEM = 0x15U, // T15 - запись памяти CLI_CMD_WRITE_MEM = 0x15U, // T15 - запись памяти
} cli_cmd_t; } cli_cmd_t;
//************************************ Коды ошибок ********************************************************** //************************************ Коды ошибок (только 00-03 по протоколу) ****************************
typedef enum { typedef enum {
CLI_ERR_NONE = 0x00U, CLI_ERR_NONE = 0x00U,
CLI_ERR_UNKNOWN_CMD = 0x01U, CLI_ERR_UNKNOWN_CMD = 0x01U,
CLI_ERR_INVALID_ARG = 0x02U, CLI_ERR_INVALID_ARG = 0x02U,
CLI_ERR_INTERNAL = 0x03U, CLI_ERR_INTERNAL = 0x03U,
CLI_ERR_NOT_CONNECTED = 0x04U,
CLI_ERR_MEMORY = 0x05U,
CLI_ERR_INVALID_ADDR = 0x06U,
CLI_ERR_INVALID_PASS = 0x07U,
} cli_error_t; } cli_error_t;
//************************************ Информация об устройстве ********************************************** //************************************ Информация об устройстве **********************************************
...@@ -32,7 +31,7 @@ typedef struct { ...@@ -32,7 +31,7 @@ typedef struct {
char name[32]; char name[32];
char serial[16]; char serial[16];
char version[16]; char version[16];
u8 board_id; u8 board_id; // Уникальный идентификатор платы (0-254)
} cli_device_info_t; } cli_device_info_t;
//************************************ Публичные функции **************************************************** //************************************ Публичные функции ****************************************************
...@@ -43,10 +42,10 @@ fun_res_t cli_protocol_init(void); ...@@ -43,10 +42,10 @@ fun_res_t cli_protocol_init(void);
// Деинициализация протокола // Деинициализация протокола
fun_res_t cli_protocol_deinit(void); fun_res_t cli_protocol_deinit(void);
// Основной цикл обработки // Основной цикл обработки (вызывать в while(1))
void cli_protocol_process(void); void cli_protocol_process(void);
// Отправка строки // Отправка строки через UART
void cli_send_string(const char* str); void cli_send_string(const char* str);
// Установка информации об устройстве // Установка информации об устройстве
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment