Rev 339 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed
Paketstruktur:PMODE 2 bit. 0x0 = BOOT, 0x1 = PGMvid PMODE = BOOTTYPE 3 bitar. 0x0 = ADDRPACKET, 0x1 = PGMPACKET, 0x2 = DONEPACKET, 0x4 = ACK, 0x5 = NACK, 0x6 = CRCOFFSET 8 bitar.RID 8 bitar.SID 8 bitar.vid PMODE = PGMCLASS 4 bitar. 0x0 = CTRL, 0x1 = SENSORS, 0x2 ACTUATORS osv..ID 15 bitar.SID 8 bitar.H = Hostprogramvara.N = Nod att programmera.P1: H skickar PMODE=BOOT, MODE=ADDRPACKET, SID=H.id, RID=N.id, data[2]=ADDRH, data[1]=ADDRL, data[0]=ADDR.H väntar på PMODE=BOOT, MODE=ACK, SID=N.id, RID=H.id.P2: När N mottagit P1 skickar den PMODE=BOOT, BMODE=ACK, SID=N.id, RID=H.id.N sätter startaddress till data[2]:[0];Om H ej mottar P2 innom tid skickas P1 igen.annarsP4: H skickar PMODE=BOOT, MODE=PGMPACKET, SID=H.id, RID=N.id, data[7..0], OFFSET=addroffset.H skickar åtta (eller hur mycket som finns kvar) sådana här paket, med ökande offset.P5: När åtta paket skickade skickas PMODE=BOOT, BMODE=CRC, SID=H.id, RID=N.id, OFFSET=numpacket data[7..0]=CRCH väntar på PMODE=BOOT, BMODE=ACK, SID=N.id, RID=H.id.N tar emot varje skickat P4 paket och sparar undan chunk av åtta byte.När N får ett P5 paket beräknas crc på OFFSET mottagna paket.P6: om ok, skicka PMODE=BOOT, BMODE=ACK, SID=N.id, RID=H.id.P7: annars skicka PMODE=BOOT, BMODE=NACK, SID=N.id, RID=H.id.Om H får P6, forsätt med P4.Om H får P7 eller timeout, skicka om senast åtta P4.P8: När H har slut på data, skickas PMODE=BOOT, BMODE=DONEPACKET, SID=H.id, RID=N.id.H skickar detta paket 5 gånger med 100ms intervall.När N får P8 startas programmet.//--------------------------------------------------------//RXB0SIDH 28 27 26 25 24 23 22 21//RXB0SIDL 20 19 18 xx xx xx 17 16//RXB0EIDH 15 14 13 12 11 10 09 08//RXB0EIDL 07 06 05 04 03 02 01 0029 bitar uppdelade:[28..27] PMODEPMODE = BOOT[26..24] TYPE[23..16] OFFSET[15...8] RID[7....0] SIDUT:RXB0SIDH = ((BOOT&0x3)<<6)+((type&0x7)<<3)+((offset&0xE0)>>5);RXB0SIDL = ((offset&0x1C)<<3)+(offset&0x3);RXB0EIDH = rid;RXB0EIDL = sid;IN:type = ((RXB0SIDH&0x38)>>3);offset= ((RXB0SIDH&0x7)<<5)+((RXB0SIDL&0xE0)>>3)+(RXB0SIDL&0x3);rid = RXB0EIDH;sid = RXB0EIDL;PMODE = PGM[26..23] CLASS[22...8] ID[7....0] SIDUT:RXB0SIDH = ((PGM&0x3)<<6)+((class&0xF)<<2)+((id&0x6000)>>13);RXB0SIDL = ((id&0x1C00)>>5)+((id&0x300)>>8);RXB0EIDH = (id&0xFF);RXB0EIDL = sid;IN:class= ((RXB0SIDH&0x3C)>>2);id = (((WORD)RXB0SIDH&0x3)<<13)+(((WORD)RXB0SIDL&0xE0)<<5)+((RXB0SIDL&0x3)<<8)+RXB0EIDH;sid = RXB0EIDL;// SE FUNDECFS.Htypedef enum _PACKET_TYPE {ptBOOT=0x0,ptPGM=0x1} PACKET_TYPE;typedef enum _BOOT_TYPE {btADDR=0x0,btPGM=0x1,btDONE=0x2,btACK=0x4,btNACK=0x5,crc=0x6} BOOT_TYPE;typedef enum _PGM_CLASS {pcCTRL=0x0,pcSENSOR=0x1,pcACTUATOR=0x2} PGM_CLASS;typedef struct _CAN_BOOT_PACKET{BYTE type; //3BYTE offset; //8BYTE rid; //8BYTE sid; //8} CAN_BOOT_PACKET;typedef struct _CAN_PGM_PACKET{BYTE class; //4WORD id; //15BYTE sid; //8} CAN_PGM_PACKET;typedef struct _CAN_PACKET{PACKET_TYPE type;CAN_PGM_PACKET pgm;CAN_BOOT_PACKET boot;BYTE length;BYTE data[8];} CAN_PACKET;