Use shared UMP protocol core and document DAC SPI review
This commit is contained in:
@@ -1,39 +1,9 @@
|
||||
/* Служебный CAN-протокол логгера УМП. Не использует адреса 0..127
|
||||
* технологического обмена. Формат полезных данных совместим с порядком
|
||||
* слов старого CAN: MDL (слова 1,2), затем MDH (маркер, слово 0).
|
||||
* Запрос: маркер 0x1F00, слово 0 = token:8 | function:8,
|
||||
* слова 1,2 = адрес расширения и число слов/записываемое значение.
|
||||
* Ответы: маркер 0x1F00 + номер фрагмента, слово 0 = token:8 | error:8,
|
||||
* слова 1,2 = два слова единого зафиксированного снимка.
|
||||
* Биты маски записи в заголовке запроса равны нулю: старая плата
|
||||
* игнорирует запрос, не изменяя технологические регистры. */
|
||||
/* Shared logger protocol; application owns IRQ protection and CAN scheduling. */
|
||||
#ifndef UMP_CAN_PROTOCOL_H
|
||||
#define UMP_CAN_PROTOCOL_H
|
||||
#include "log_to_mem.h"
|
||||
#define UMP_CAN_MARKER 0x1F00U
|
||||
#define UMP_CAN_MAX_WORDS 124U
|
||||
|
||||
/* Вызывающий код защищает весь снимок от IRQ. Функция не ждёт CAN и
|
||||
* не пишет за пределами reply[124]. Ошибки возвращаются отдельным кадром. */
|
||||
static unsigned int ump_can_prepare(unsigned int function, unsigned int address,
|
||||
unsigned int value, unsigned int *reply, unsigned int *error)
|
||||
{
|
||||
unsigned int i;
|
||||
*error = 0;
|
||||
if (function == 3) {
|
||||
if (!((address == UMP_LOG_BASE && value == 16) ||
|
||||
(address == UMP_LOG_DATA && (value == 40 || value == 80 || value == 120)) ||
|
||||
(address == UMP_LOG_LIVE && value == 124))) *error = 2;
|
||||
else {
|
||||
for (i = 0; i < value; i++) reply[i] = ump_log_read(address+i);
|
||||
return value;
|
||||
}
|
||||
} else if (function == 6) {
|
||||
if (address < UMP_LOG_BASE || address > UMP_LOG_BASE+3) *error = 2;
|
||||
else if (!ump_log_write(address, value)) *error = 3;
|
||||
} else *error = 1;
|
||||
/* Для записи возвращаем эхо адреса и значения, для ошибки — её контекст. */
|
||||
reply[0] = address; reply[1] = value;
|
||||
return 2;
|
||||
}
|
||||
#include "../../../../../templates/c/set-protocol/ports/tms320f28335/ump_tms28335.h"
|
||||
#define UMP_CAN_MARKER UMP_MARKER
|
||||
#define UMP_CAN_MAX_WORDS UMP_MAX_WORDS
|
||||
#define ump_can_prepare ump_tms28335_prepare
|
||||
#endif
|
||||
|
||||
@@ -214,7 +214,7 @@ void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
|
||||
* çàïîëíÿòü æóðíàë CAN-ñîáûòèÿìè ïðè îíëàéí-÷òåíèè. Êîðîòêèå êàäðû
|
||||
* îòáðàñûâàþòñÿ: íåçàïîëíåííûå áàéòû mailbox ìîãëè îñòàòüñÿ îò ïðîøëîãî. */
|
||||
if ((unsigned int)(hiword >> 16) == UMP_CAN_MARKER) {
|
||||
if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8) {
|
||||
if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8 && (hiword & 0xFF00UL)) {
|
||||
ump_can_tag = (unsigned int)hiword;
|
||||
ump_can_address = (unsigned int)(loword >> 16);
|
||||
ump_can_value = (unsigned int)loword;
|
||||
@@ -294,7 +294,7 @@ interrupt void CANa_reset_err(void)
|
||||
void UMP_CAN_service(void)
|
||||
{
|
||||
unsigned int saved, tag, address, value, error;
|
||||
unsigned long hiword, loword;
|
||||
uint32_t hiword, loword;
|
||||
if (ump_can_waiting) {
|
||||
if (ECanaRegs.CANTA.all & 4UL) {
|
||||
ECanaRegs.CANTA.all = 4UL;
|
||||
@@ -324,8 +324,11 @@ void UMP_CAN_service(void)
|
||||
if (ump_can_index >= ump_can_length) return;
|
||||
/* Ïåðåä ñëåäóþùèì ôðàãìåíòîì óñòóïàåì øòàòíîé òåëåìåòðèè MBOX0. */
|
||||
if (ECanaRegs.CANTRS.all & 1UL) return;
|
||||
hiword = ((unsigned long)(UMP_CAN_MARKER + ump_can_index/2) << 16) | ump_can_reply_tag;
|
||||
loword = ((unsigned long)ump_can_reply[ump_can_index] << 16) | ump_can_reply[ump_can_index+1];
|
||||
if (!ump_tms28335_fragment(ump_can_reply, ump_can_length, ump_can_index/2,
|
||||
ump_can_reply_tag >> 8, ump_can_reply_tag & 255U, &loword, &hiword)) {
|
||||
ump_can_length = 0;
|
||||
return;
|
||||
}
|
||||
ECanaRegs.CANTA.all = 4UL; ECanaRegs.CANAA.all = 4UL;
|
||||
ECanaMboxes.MBOX2.MDH.all = hiword;
|
||||
ECanaMboxes.MBOX2.MDL.all = loword;
|
||||
|
||||
@@ -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)
|
||||
|
||||
3
Source/Internal/shared_ump.c
Normal file
3
Source/Internal/shared_ump.c
Normal file
@@ -0,0 +1,3 @@
|
||||
/* Build the canonical sources directly; do not copy their implementations. */
|
||||
#include "../../../../templates/c/set-protocol/src/ump_protocol.c"
|
||||
#include "../../../../templates/c/set-protocol/ports/tms320f28335/ump_tms28335.c"
|
||||
Reference in New Issue
Block a user