Subversion Repositories HomeAutomation

Rev

Rev 339 | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed


Paketstruktur:

PMODE 2 bit. 0x0 = BOOT, 0x1 = PGM

    vid PMODE = BOOT
        TYPE  3 bitar. 0x0 = ADDRPACKET, 0x1 = PGMPACKET, 0x2 = DONEPACKET, 0x4 = ACK, 0x5 = NACK, 0x6 = CRC
        OFFSET 8 bitar.
        RID    8 bitar.
        SID    8 bitar.

    vid PMODE = PGM
        CLASS   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.    
annars
P4: 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]=CRC
    H 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 00


29 bitar uppdelade:

[28..27] PMODE

PMODE = BOOT

[26..24] TYPE
[23..16] OFFSET
[15...8] RID
[7....0] SID 

UT:



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] SID

UT:

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.H




typedef 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; //3
    BYTE  offset; //8
    BYTE     rid; //8
    BYTE     sid; //8
} CAN_BOOT_PACKET;


typedef struct _CAN_PGM_PACKET
{
    BYTE   class; //4
    WORD      id; //15
    BYTE     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;