Update CCS12 peripheral firmware and documentation

This commit is contained in:
2026-09-04 19:34:10 +03:00
parent 55bee25b4f
commit 8cd81736cf
56 changed files with 3808 additions and 504 deletions

View File

@@ -1,3 +1,12 @@
/**
* @file message.c
* @brief Параметры устройства и прикладные сообщения протокола Modbus.
*
* Инициализирует значения по умолчанию, загружает и сохраняет параметры в
* EEPROM, принимает команды функций 3/6 и формирует ответы функции 4.
* Индексы param/Modbus согласованы с внешней картой регистров; менять порядок,
* ANSWER_LEN или представление слов можно только вместе с ведущей системой.
*/
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "package.h"
#include "RS485.h"
@@ -18,9 +27,17 @@
#include "caliber.h"
/** @brief Рабочий образ регистров Modbus, передаваемый внешнему мастеру. */
int modbus[ANSWER_LEN+1];
/** @brief Сохраняемые параметры, индексно согласованные с картой регистров. */
unsigned int param[ANSWER_LEN+1];
/**
* @brief Создаёт полный набор безопасных параметров для текущего варианта платы.
* @post Modbus/param, режимы, пороги, яркость и калибровки имеют штатные значения.
* @details Начальная очистка предотвращает сохранение мусора в зарезервированных
* регистрах; далее значения выбираются по Desk и compile-time конфигурации.
*/
void Default_params()
{
unsigned int i,def;
@@ -46,19 +63,19 @@ void Default_params()
if(Desk == dsk_EPLT)
{
Cancount[m_FAST] = 2; // пауза между посылками CAN
Cancount[m_FAST] = 2; // пауза между посылками CAN
for(i=0;i<6;i++) Bright[i] = bright[i];
}
else
{
Cancount[m_FAST] = 10; // пауза между посылками CAN
Cancount[m_FAST] = 10; // пауза между посылками CAN
Brightness = 8;
}
Cancount[m_SLOW] = 101; // пауза между посылками CAN
Cancount[m_SLOW] = 101; // пауза между посылками CAN
if(Owen) Owncount = 20; // пауза между опросами OWEN
if(Owen) Owncount = 20; // пауза между опросами OWEN
if(Kalibro)
{
@@ -122,9 +139,9 @@ void Default_params()
DAC_20 = Caliber[6];
DAC_04 = Caliber[7];
/* Не врема!
DAC_go = 6; // начало зарада
DAC_stop= 15; // конец зарада
/* Не врема!
DAC_go = 6; // начало зарада
DAC_stop= 15; // конец зарада
*/
}
@@ -135,6 +152,11 @@ void Default_params()
Init_sensors_more();
}
/**
* @brief Загружает параметрический блок из EEPROM и проверяет его целостность.
* @details При несовпадении сигнатуры/CRC вызывается Default_params(); после
* успешной загрузки значения переносятся в рабочие глобальные настройки.
*/
void Load_params()
{
unsigned int i,crc;
@@ -159,6 +181,11 @@ void Load_params()
Caliber_time = 0xFFFF;
} } }
/**
* @brief Формирует параметрический блок с CRC и записывает его в EEPROM.
* @warning Запись следует запускать только при свободном драйвере EEPROM;
* питание должно сохраняться до физического завершения транзакции.
*/
void Save_params()
{
unsigned int i,dif=0;
@@ -177,24 +204,30 @@ void Save_params()
/***************************************************************/
/***************************************************************/
/* Передача данных по протоколу ModBus - команда 3
Чтение ачеек данных */
/* Передача данных по протоколу ModBus - команда 3
Чтение ачеек данных */
/***************************************************************/
/***************************************************************/
/**
* @brief Обрабатывает запрос Modbus чтения диапазона регистров.
* @param rs_arr Порт с проверенным входным кадром и буфером ответа.
* @details Проверяет начальный адрес и длину, копирует слова из modbus и
* формирует CRC непосредственно перед отправкой.
*/
void ReceiveCommandModbus3(RS_DATA *rs_arr)
{
unsigned int crc, Address_MB, Length_MB, i;
// получили начальный адрес чтениа
// получили начальный адрес чтениа
Address_MB =/*(rs_arr->RS_Header[2] << 8) |*/ rs_arr->RS_Header[3];
// получили количество слов данных
// получили количество слов данных
Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
/////////////////////////////////////////////////
// Отсылка
/* Посчитали контрольную сумму перед самой посылкой */
// Отсылка
/* Посчитали контрольную сумму перед самой посылкой */
rs_arr->buffer[0] = CNTRL_ADDR;
rs_arr->buffer[1] = CMD_MODBUS_3;
@@ -223,22 +256,27 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
return;
}
/**
* @brief Применяет команду записи одного параметра Modbus.
* @details После проверки адреса обновляет разрешённое значение, выставляет
* события перенастройки/сохранения и возвращает эхо принятой команды.
*/
void ReceiveCommandModbus6(RS_DATA *rs_arr)
{
unsigned int Address_MB, Data_MB, i;
/////////////////////////////////////////////////
// Отсылка
/* Отправлаем назад то же самое */
// Отсылка
/* Отправлаем назад то же самое */
for (i=0;i<8;i++)
rs_arr->buffer[i] = rs_arr->RS_Header[i];
// получили начальный адрес записи
// получили начальный адрес записи
Address_MB = (/*(rs_arr->RS_Header[2] << 8) | */rs_arr->RS_Header[3]);
// получили слово данных
// получили слово данных
Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
Modbus[Address_MB].all = Data_MB;
@@ -247,12 +285,17 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
RS_Send(rs_arr, rs_arr->buffer, 10);
}
/**
* @brief Формирует периодический запрос/ответ функции 4 для внешнего устройства.
* @details Адрес, полезная нагрузка и CRC помещаются в буфер выбранного RS-порта,
* после чего передача запускается неблокирующим RS_Send().
*/
void SendCommandModbus4(RS_DATA *rs_arr)
{
unsigned int crc;
/////////////////////////////////////////////////
// Отсылка
// Отсылка
rs_arr->buffer[0] = 16;
rs_arr->buffer[1] = 4;
@@ -275,12 +318,17 @@ void SendCommandModbus4(RS_DATA *rs_arr)
RS_Send(rs_arr, rs_arr->buffer, 8);
}
/**
* @brief Разбирает ответ внешнего измерителя на функцию Modbus 4.
* @details Проверяет формат и переносит температуры/диагностики в ext_temp и
* ext_diag; некорректный ответ не должен заменять последний пригодный снимок.
*/
void ReceiveAnswerModbus4(RS_DATA *rs_arr)
{
unsigned int i;
/////////////////////////////////////////////////
// Отсылка
// Отсылка
for (i=0;i<8;i++)
{