Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
339 johboh 1
 
2
Paketstruktur:
3
 
4
PMODE 2 bit. 0x0 = BOOT, 0x1 = PGM
5
 
6
	vid PMODE = BOOT
7
		TYPE  3 bitar. 0x0 = ADDRPACKET, 0x1 = PGMPACKET, 0x2 = DONEPACKET, 0x4 = ACK, 0x5 = NACK, 0x6 = CRC
8
		OFFSET 8 bitar.
9
		RID    8 bitar.
10
		SID    8 bitar.
11
 
12
	vid PMODE = PGM
13
		CLASS   4 bitar. 0x0 = CTRL, 0x1 = SENSORS, 0x2 ACTUATORS osv..
14
                ID     15 bitar.
15
		SID     8 bitar.
16
 
17
 
18
 
19
H = Hostprogramvara.
20
N = Nod att programmera.
21
 
22
 
23
P1: H skickar PMODE=BOOT, MODE=ADDRPACKET, SID=H.id, RID=N.id, data[2]=ADDRH, data[1]=ADDRL, data[0]=ADDR.
24
H väntar på PMODE=BOOT, MODE=ACK, SID=N.id, RID=H.id.
25
	P2: När N mottagit P1 skickar den PMODE=BOOT, BMODE=ACK, SID=N.id, RID=H.id.
26
	N sätter startaddress till data[2]:[0];
27
Om H ej mottar P2 innom tid skickas P1 igen.	
28
annars
29
P4: H skickar PMODE=BOOT, MODE=PGMPACKET, SID=H.id, RID=N.id, data[7..0], OFFSET=addroffset.
30
	H skickar åtta (eller hur mycket som finns kvar) sådana här paket, med ökande offset.
31
	P5: När åtta paket skickade skickas PMODE=BOOT, BMODE=CRC, SID=H.id, RID=N.id, OFFSET=numpacket data[7..0]=CRC
32
	H väntar på PMODE=BOOT, BMODE=ACK, SID=N.id, RID=H.id.
33
 
34
	N tar emot varje skickat P4 paket och sparar undan chunk av åtta byte.
35
	När N får ett P5 paket beräknas crc på OFFSET mottagna paket.
36
	P6: om ok, skicka PMODE=BOOT, BMODE=ACK, SID=N.id, RID=H.id.
37
	P7: annars skicka PMODE=BOOT, BMODE=NACK, SID=N.id, RID=H.id. 
38
 
39
Om H får P6, forsätt med P4.
40
Om H får P7 eller timeout, skicka om senast åtta P4.
41
 
42
P8: När H har slut på data, skickas PMODE=BOOT, BMODE=DONEPACKET, SID=H.id, RID=N.id.
43
	H skickar detta paket 5 gånger med 100ms intervall.
44
 
45
När N får P8 startas programmet.
46
 
47
 
48
//--------------------------------------------------------
49
 
50
//RXB0SIDH 28 27 26 25 24 23 22 21
51
//RXB0SIDL 20 19 18 xx xx xx 17 16
52
//RXB0EIDH 15 14 13 12 11 10 09 08
53
//RXB0EIDL 07 06 05 04 03 02 01 00
54
 
55
 
56
29 bitar uppdelade:
57
 
58
[28..27] PMODE
59
 
60
PMODE = BOOT
61
 
62
[26..24] TYPE
63
[23..16] OFFSET
64
[15...8] RID
65
[7....0] SID 
66
 
67
UT:
68
 
69
 
70
 
71
RXB0SIDH = ((BOOT&0x3)<<6)+((type&0x7)<<3)+((offset&0xE0)>>5);
72
RXB0SIDL = ((offset&0x1C)<<3)+(offset&0x3);
73
RXB0EIDH = rid;
74
RXB0EIDL = sid;
75
 
76
IN:
77
type  = ((RXB0SIDH&0x38)>>3);
78
offset= ((RXB0SIDH&0x7)<<5)+((RXB0SIDL&0xE0)>>3)+(RXB0SIDL&0x3);
79
rid   = RXB0EIDH;
80
sid   = RXB0EIDL;
81
 
82
 
83
PMODE = PGM
84
 
85
[26..23] CLASS
86
[22...8] ID
87
[7....0] SID
88
 
89
UT:
90
 
91
RXB0SIDH = ((PGM&0x3)<<6)+((class&0xF)<<2)+((id&0x6000)>>13);
92
RXB0SIDL = ((id&0x1C00)>>5)+((id&0x300)>>8);
93
RXB0EIDH = (id&0xFF);
94
RXB0EIDL = sid;
95
 
96
IN:
97
class= ((RXB0SIDH&0x3C)>>2);
98
id   = (((WORD)RXB0SIDH&0x3)<<13)+(((WORD)RXB0SIDL&0xE0)<<5)+((RXB0SIDL&0x3)<<8)+RXB0EIDH;
99
sid  = RXB0EIDL;
100
 
101
 
102
 
103
// SE FUNDECFS.H
104
 
105
 
106
 
107
 
108
typedef enum _PACKET_TYPE {ptBOOT=0x0,ptPGM=0x1} PACKET_TYPE;
109
typedef enum _BOOT_TYPE {btADDR=0x0,btPGM=0x1,btDONE=0x2,btACK=0x4,btNACK=0x5,crc=0x6} BOOT_TYPE;
110
typedef enum _PGM_CLASS {pcCTRL=0x0,pcSENSOR=0x1,pcACTUATOR=0x2} PGM_CLASS;
111
 
112
typedef struct _CAN_BOOT_PACKET
113
{
114
	BYTE    type; //3
115
	BYTE  offset; //8
116
	BYTE     rid; //8
117
	BYTE     sid; //8
118
} CAN_BOOT_PACKET;
119
 
120
 
121
typedef struct _CAN_PGM_PACKET
122
{
123
	BYTE   class; //4
124
	WORD      id; //15
125
	BYTE     sid; //8
126
} CAN_PGM_PACKET;
127
 
128
typedef struct _CAN_PACKET
129
{
130
	PACKET_TYPE type;
131
	CAN_PGM_PACKET pgm;
132
	CAN_BOOT_PACKET boot;
133
	BYTE  length;
134
	BYTE data[8];
135
} CAN_PACKET;
136
 
137
 
138