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 |