40 lines
1.7 KiB
C
40 lines
1.7 KiB
C
/* Ñëóæåáíûé 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 = äâà ñëîâà åäèíîãî çàôèêñèðîâàííîãî ñíèìêà.
|
|
* Áèòû ìàñêè çàïèñè â çàãîëîâêå çàïðîñà ðàâíû íóëþ: ñòàðàÿ ïëàòà
|
|
* èãíîðèðóåò çàïðîñ, íå èçìåíÿÿ òåõíîëîãè÷åñêèå ðåãèñòðû. */
|
|
#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;
|
|
}
|
|
#endif
|