Use shared UMP protocol core and document DAC SPI review

This commit is contained in:
2026-10-01 14:02:12 +03:00
parent 2a9f42331c
commit 316dd52f99
9 changed files with 342 additions and 58 deletions

View File

@@ -18,6 +18,7 @@
#include "caliber.h"
#include "log_to_mem.h"
#include "../../../../templates/c/set-protocol/ports/tms320f28335/ump_tms28335.h"
int modbus[ANSWER_LEN+1];
unsigned int param[ANSWER_LEN+1];
@@ -195,9 +196,30 @@ static void modbus_exception(RS_DATA *rs_arr, unsigned int function, unsigned in
RS_Send(rs_arr, rs_arr->buffer, 5);
}
/* UART parser has already validated CRC and accepted the device address. */
static int receive_ump(RS_DATA *rs_arr)
{
unsigned int address, value, saved, length, count, error;
uint16_t words[UMP_MAX_WORDS];
address = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
if (address < UMP_BASE) return 0;
value = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
saved = __disable_interrupts();
count = ump_tms28335_capture(rs_arr->RS_Header[1], address, value, words, &error);
__restore_interrupts(saved);
length = ump_rtu_encode(CNTRL_ADDR, rs_arr->RS_Header[1], error,
words, count, rs_arr->buffer, MAX_SEND_LENGTH);
if (length) {
rs_arr->flag_TIMEOUT_to_Send = true;
RS_Send(rs_arr, rs_arr->buffer, length);
}
return 1;
}
void ReceiveCommandModbus3(RS_DATA *rs_arr)
{
unsigned int crc, Address_MB, Length_MB, i, value, saved = 0;
unsigned int crc, Address_MB, Length_MB, i, value;
if (receive_ump(rs_arr)) return;
// ïîëó÷èëè íà÷àëüíûé àäðåñ ÷òåíèà
Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
@@ -205,12 +227,7 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
// ïîëó÷èëè êîëè÷åñòâî ñëîâ äàííûõ
Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
if (!Length_MB || Length_MB > 125 ||
!((Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB) ||
(Address_MB >= UMP_LOG_BASE && Address_MB <= UMP_LOG_BASE+15 &&
Length_MB <= UMP_LOG_BASE+16-Address_MB) ||
(Address_MB >= UMP_LOG_DATA && Address_MB < UMP_LOG_DATA+120 &&
Length_MB <= UMP_LOG_DATA+120-Address_MB) ||
(Address_MB == UMP_LOG_LIVE && Length_MB == 124))) {
!(Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB)) {
modbus_exception(rs_arr, CMD_MODBUS_3, 2); return;
}
@@ -224,15 +241,13 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
/* Çàùèùàåì öåëîñòíîñòü îäíîãî ñíèìêà/áëîêà; ïåðåäà÷à UART èä¸ò óæå
* ñ ðàçðåø¸ííûìè ïðåðûâàíèÿìè è íå çàäåðæèâàåò èçìåðåíèå/óïðàâëåíèå. */
if (Address_MB >= UMP_LOG_BASE) saved = __disable_interrupts();
for (i=0;i<Length_MB;i++)
{
value = Address_MB >= UMP_LOG_BASE ? ump_log_read(Address_MB+i) : modbus[Address_MB+i];
value = modbus[Address_MB+i];
rs_arr->buffer[3+i*2] = (value >> 8) & 0xFF;
rs_arr->buffer[3+i*2+1] = value & 0xFF;
}
if (Address_MB >= UMP_LOG_BASE) __restore_interrupts(saved);
crc = 0xffff;
crc = get_crc_16(crc, rs_arr->buffer, Length_MB*2+3);
@@ -248,7 +263,7 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
/* Ðàñøèðåíèå ëîããåðà îòâå÷àåò òî÷íûì êàäðîì Modbus áåç õâîñòîâûõ
* íóëåé: îíè èíà÷å ïîïàëè áû â íà÷àëî îòâåòà ñëåäóþùåãî áëîêà GUI.
* Èñòîðè÷åñêèé ôîðìàò òåõíîëîãè÷åñêèõ ðåãèñòðîâ îñòàâëåí ïðåæíèì. */
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+(Address_MB >= UMP_LOG_BASE ? 5 : 8));
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+8);
return;
}
@@ -256,6 +271,7 @@ void ReceiveCommandModbus3(RS_DATA *rs_arr)
void ReceiveCommandModbus6(RS_DATA *rs_arr)
{
unsigned int Address_MB, Data_MB, i;
if (receive_ump(rs_arr)) return;
/////////////////////////////////////////////////
// Îòñûëêà
@@ -271,17 +287,13 @@ void ReceiveCommandModbus6(RS_DATA *rs_arr)
// ïîëó÷èëè ñëîâî äàííûõ
Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
if (Address_MB >= UMP_LOG_BASE) {
if (!ump_log_write(Address_MB, Data_MB)) {
modbus_exception(rs_arr, CMD_MODBUS_6, 3); return;
}
} else if (Address_MB < ANSWER_LEN) {
if (Address_MB < ANSWER_LEN) {
Modbus[Address_MB].all = Data_MB;
if (Address_MB == 127) ump_log_rs();
} else { modbus_exception(rs_arr, CMD_MODBUS_6, 2); return; }
rs_arr->flag_TIMEOUT_to_Send=true;
RS_Send(rs_arr, rs_arr->buffer, Address_MB >= UMP_LOG_BASE ? 8 : 10);
RS_Send(rs_arr, rs_arr->buffer, 10);
}
void SendCommandModbus4(RS_DATA *rs_arr)