Subversion Repositories HomeAutomation

Rev

Rev 80 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 80 Rev 88
Line 1... Line 1...
1
/*********************************************************************
1
/*********************************************************************
2
 *
2
 *
3
 *                  Main application
3
 *                  Main application
4
 *
4
 *
5
 *********************************************************************
5
 *********************************************************************
6
 * FileName:        Main.c
6
 * FileName:        $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canBoot/Source/Main.c $
7
 *
-
 
8
 * Author               Date    Comment
7
 * Last changed:    $LastChangedDate: 2006-11-14 11:44:27 +0100 (Tue, 14 Nov 2006) $
9
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
8
 * By:              $LastChangedBy: johboh $
10
 * Johan Böhlin     21-10-06    Original        (Rev 1.0)
9
 * Revision:        $Revision: 88 $
11
 ********************************************************************/
10
 ********************************************************************/
12
// $Id: Main.c 80 2006-11-11 20:22:39Z johboh $
-
 
13
 
11
 
14
#include <compiler.h>
12
#include <compiler.h>
15
#include <stackTasks.h>
13
#include <stackTasks.h>
16
#include <CANdefs.h>
14
#include <CANdefs.h>
17
#include <CAN.h>
15
#include <CAN.h>
18
#include <boot.h>
16
#include <boot.h>
19
 
17
 
20
/** V E C T O R  R E M A P P I N G *******************************************/
18
/** V E C T O R  R E M A P P I N G *******************************************/
21
 
19
 
22
#pragma code _HIGH_INTERRUPT_VECTOR = 0x000008
20
#pragma code _HIGH_INTERRUPT_VECTOR = 0x000008
23
void _high_ISR (void)
21
void _high_ISR (void)
24
{
22
{
25
    _asm goto RM_HIGH_INTERRUPT_VECTOR _endasm
23
    _asm goto RM_HIGH_INTERRUPT_VECTOR _endasm
26
}
24
}
27
 
25
 
28
#pragma code _LOW_INTERRUPT_VECTOR = 0x000018
26
#pragma code _LOW_INTERRUPT_VECTOR = 0x000018
29
void _low_ISR (void)
27
void _low_ISR (void)
30
{
28
{
31
    _asm goto RM_LOW_INTERRUPT_VECTOR _endasm
29
    _asm goto RM_LOW_INTERRUPT_VECTOR _endasm
32
}
30
}
33
 
31
 
34
#pragma code
32
#pragma code
35
 
33
 
36
 
34
 
37
#ifdef USE_CAN
35
#ifdef USE_CAN
38
    #include <CAN.h>
36
    #include <CAN.h>
39
#endif
37
#endif
40
 
38
 
41
static CAN_PROTO_MESSAGE cm;
39
static CAN_PROTO_MESSAGE cm;
42
static BYTE ful=0;
40
static BYTE ful=0;
43
static DWORD cnt =0;
41
static DWORD cnt =0;
44
 
42
 
45
static void mainInit(void);
43
static void mainInit(void);
46
static BOOL canGetPacket(void);
44
static BOOL canGetPacket(void);
47
void TBLWT_Func(void);
45
void TBLWT_Func(void);
48
void TBLWTPOSTINC_Func (void);
46
void TBLWTPOSTINC_Func (void);
49
void TBLRD_Func(void);
47
void TBLRD_Func(void);
Line 65... Line 63...
65
   
63
   
66
    static BYTE errMsg = ERR_NO_ERROR;
64
    static BYTE errMsg = ERR_NO_ERROR;
67
    static PROGRAM_STATE afterAckPgs = pgsWATING_START;
65
    static PROGRAM_STATE afterAckPgs = pgsWATING_START;
68
    static DWORD pgmAddress = 0;
66
    static DWORD pgmAddress = 0;
69
    static BYTE bytesReceived = 0;
67
    static BYTE bytesReceived = 0;
70
 
68
 
71
    DWORD tBoot;
69
    DWORD tBoot;
72
   
70
   
73
    static BYTE pgmData[64];
71
    static BYTE pgmData[64];
74
 
72
 
75
    static BYTE tmp;
73
    static BYTE tmp;
76
 
74
 
77
    // Inits
75
    // Inits
78
    mainInit();
76
    mainInit();
79
 
77
 
80
    #ifdef USE_CAN
78
    #ifdef USE_CAN
81
        canInit();
79
        canInit();
82
    #endif
80
    #endif
83
 
81
 
84
    tBoot = tickGet();
82
    tBoot = tickGet();
Line 90... Line 88...
90
        CAN_PROTO_MESSAGE outCm;
88
        CAN_PROTO_MESSAGE outCm;
91
        BOOL hasPacket = canGetPacket();
89
        BOOL hasPacket = canGetPacket();
92
 
90
 
93
        tickSubCounter++;
91
        tickSubCounter++;
94
        if (tickSubCounter>TICK_SUB_COUNTER_10MS)
92
        if (tickSubCounter>TICK_SUB_COUNTER_10MS)
95
        {
93
        {
96
            tickCounter++;
94
            tickCounter++;
97
            tickSubCounter=0;
95
            tickSubCounter=0;
-
 
96
            ClrWdt();
98
        }
97
        }
99
 
98
 
100
        switch(pgs)
99
        switch(pgs)
101
        {
100
        {
102
            case pgsWATING_START:
101
            case pgsWATING_START:
Line 104... Line 103...
104
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && cm.funcc==FUNCC_BOOT_INIT && ((((unsigned int)cm.data[RID_HIGH_INDEX])<<8)+cm.data[RID_LOW_INDEX])==MY_ID && cm.nid==MY_NID)
103
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && cm.funcc==FUNCC_BOOT_INIT && ((((unsigned int)cm.data[RID_HIGH_INDEX])<<8)+cm.data[RID_LOW_INDEX])==MY_ID && cm.nid==MY_NID)
105
                {
104
                {
106
                    // Has new start packet
105
                    // Has new start packet
107
                    pgmAddress      = (((DWORD)cm.data[ADDRU_INDEX])<<16)+(((DWORD)cm.data[ADDRH_INDEX])<<8)+((DWORD)cm.data[ADDRL_INDEX]);
106
                    pgmAddress      = (((DWORD)cm.data[ADDRU_INDEX])<<16)+(((DWORD)cm.data[ADDRH_INDEX])<<8)+((DWORD)cm.data[ADDRL_INDEX]);
108
                    programmerSid   = cm.sid;
107
                    programmerSid   = cm.sid;
109
                    t               = tickGet();
108
                    t               = tickGet();
110
                    errMsg          = ERR_NO_ERROR;
109
                    errMsg          = ERR_NO_ERROR;
111
                    afterAckPgs     = pgsWAIT_FIRST_PGM_PACKET;
110
                    afterAckPgs     = pgsWAIT_FIRST_PGM_PACKET;
112
                    pgs             = pgsSEND_ACK;
111
                    pgs             = pgsSEND_ACK;
113
                    // save pgm adress.
112
                    // save pgm adress.
114
                   
113
                   
115
                }
114
                }
116
 
115
 
117
                // Bootloader timeout
116
                // Bootloader timeout
118
                if ((tickGet()-tBoot)>BOOTLOADER_INIT_TIMOUT)
117
                if ((tickGet()-tBoot)>BOOTLOADER_INIT_TIMOUT)
119
                {
118
                {
120
                    pgs = pgsDONE;
119
                    pgs = pgsDONE;
121
                }
120
                }
122
            break;         
121
            break;         
123
 
122
 
124
            case pgsSEND_ACK:
123
            case pgsSEND_ACK:
Line 126... Line 125...
126
                outCm.funct             = FUNCT_BOOTLOADER;
125
                outCm.funct             = FUNCT_BOOTLOADER;
127
                outCm.funcc             = FUNCC_BOOT_ACK;
126
                outCm.funcc             = FUNCC_BOOT_ACK;
128
                outCm.nid               = MY_NID;
127
                outCm.nid               = MY_NID;
129
                outCm.sid               = MY_ID;
128
                outCm.sid               = MY_ID;
130
                outCm.data_length       = 8;
129
                outCm.data_length       = 8;
131
                outCm.remote_request    = FALSE;
-
 
132
                outCm.data[ERR_INDEX]   = errMsg;
130
                outCm.data[ERR_INDEX]   = errMsg;
133
                t                       = tickGet();
131
                t                       = tickGet();
134
                pgs                     = afterAckPgs;
132
                pgs                     = afterAckPgs;
135
 
133
 
136
                while(!canSendMessage(outCm,PRIO_HIGH));
134
                while(!canSendMessage(outCm,PRIO_HIGH));
Line 140... Line 138...
140
            case pgsWAIT_FIRST_PGM_PACKET:
138
            case pgsWAIT_FIRST_PGM_PACKET:
141
                // wait for first pgm packet.
139
                // wait for first pgm packet.
142
                if ((tickGet()-t)>PACKET_TIMEOUT)
140
                if ((tickGet()-t)>PACKET_TIMEOUT)
143
                {
141
                {
144
                    // Timeout, resend ack.
142
                    // Timeout, resend ack.
145
                    errMsg          = ERR_NO_ERROR;
143
                    errMsg          = ERR_NO_ERROR;
146
                    afterAckPgs     = pgsWAIT_FIRST_PGM_PACKET;
144
                    afterAckPgs     = pgsWAIT_FIRST_PGM_PACKET;
147
                    pgs             = pgsSEND_ACK;
145
                    pgs             = pgsSEND_ACK;
148
                }
146
                }
149
 
147
 
150
                // If programming packet...
148
                // If programming packet...
151
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && (cm.funcc & 0x3)==FUNCC_BOOT_PGM && cm.nid==MY_NID && cm.sid==programmerSid)
149
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && (cm.funcc & 0x3)==FUNCC_BOOT_PGM && cm.nid==MY_NID && cm.sid==programmerSid)
152
                {
150
                {
153
                    BYTE localIndex = (BYTE)((cm.funcc & 0x1C)>>2)*8;
151
                    BYTE localIndex = (BYTE)((cm.funcc & 0x1C)>>2)*8;
154
 
152
 
155
                    // Save bytes in memory, setup start adress etc..
153
                    // Save bytes in memory, setup start adress etc..
156
                    bytesReceived   = 8;       
154
                    bytesReceived   = 8;       
157
                    pgmData[localIndex+0]=cm.data[0]; pgmData[localIndex+1]=cm.data[1]; pgmData[localIndex+2]=cm.data[2]; pgmData[localIndex+3]=cm.data[3];
155
                    pgmData[localIndex+0]=cm.data[0]; pgmData[localIndex+1]=cm.data[1]; pgmData[localIndex+2]=cm.data[2]; pgmData[localIndex+3]=cm.data[3];
158
                    pgmData[localIndex+4]=cm.data[4]; pgmData[localIndex+5]=cm.data[5]; pgmData[localIndex+6]=cm.data[6]; pgmData[localIndex+7]=cm.data[7];
156
                    pgmData[localIndex+4]=cm.data[4]; pgmData[localIndex+5]=cm.data[5]; pgmData[localIndex+6]=cm.data[6]; pgmData[localIndex+7]=cm.data[7];
159
               
157
               
160
                    pgs             = pgsWAIT_PGM_PACKET;
158
                    pgs             = pgsWAIT_PGM_PACKET;
161
                }
159
                }
162
 
160
 
163
 
161
 
164
            break;
162
            break;
165
 
163
 
166
 
164
 
167
            case pgsWAIT_PGM_PACKET:
165
            case pgsWAIT_PGM_PACKET:
168
       
166
       
169
           
167
           
170
                // If programming packet...
168
                // If programming packet...
171
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && (cm.funcc & 0x3)==FUNCC_BOOT_PGM && cm.nid==MY_NID && cm.sid==programmerSid)
169
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && (cm.funcc & 0x3)==FUNCC_BOOT_PGM && cm.nid==MY_NID && cm.sid==programmerSid)
172
                {
170
                {
173
                    BYTE localIndex = (BYTE)((cm.funcc & 0x1C)>>2)*8;
171
                    BYTE localIndex = (BYTE)((cm.funcc & 0x1C)>>2)*8;
174
                    // Save bytes in memory, inc received bytes.
172
                    // Save bytes in memory, inc received bytes.
175
                    pgmData[localIndex+0]=cm.data[0]; pgmData[localIndex+1]=cm.data[1]; pgmData[localIndex+2]=cm.data[2]; pgmData[localIndex+3]=cm.data[3];
173
                    pgmData[localIndex+0]=cm.data[0]; pgmData[localIndex+1]=cm.data[1]; pgmData[localIndex+2]=cm.data[2]; pgmData[localIndex+3]=cm.data[3];
176
                    pgmData[localIndex+4]=cm.data[4]; pgmData[localIndex+5]=cm.data[5]; pgmData[localIndex+6]=cm.data[6]; pgmData[localIndex+7]=cm.data[7];
174
                    pgmData[localIndex+4]=cm.data[4]; pgmData[localIndex+5]=cm.data[5]; pgmData[localIndex+6]=cm.data[6]; pgmData[localIndex+7]=cm.data[7];
177
                   
175
                   
178
                    bytesReceived   += 8;
176
                    bytesReceived   += 8;
179
                    pgs              = pgsWAIT_PGM_PACKET;
177
                    pgs              = pgsWAIT_PGM_PACKET;
180
                }
178
                }
181
 
179
 
182
                // If adress packet (control packet)..
180
                // If adress packet (control packet)..
Line 189... Line 187...
189
                    pgs             = pgsSEND_ACK;
187
                    pgs             = pgsSEND_ACK;
190
                }
188
                }
191
               
189
               
192
                // If end packet...
190
                // If end packet...
193
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && cm.funcc==FUNCC_BOOT_DONE && cm.nid==MY_NID && cm.sid==programmerSid)
191
                if (hasPacket==TRUE && cm.funct==FUNCT_BOOTLOADER && cm.funcc==FUNCC_BOOT_DONE && cm.nid==MY_NID && cm.sid==programmerSid)
194
                {
192
                {
195
                    // write program.
193
                    // write program.
196
                    // If no bytes received at all, assume end.
194
                    // If no bytes received at all, assume end.
197
                    // If not 64 bytes received, send error ack and wait for first packet.
195
                    // If not 64 bytes received, send error ack and wait for first packet.
198
                    // If 64, write.
196
                    // If 64, write.
199
 
197
 
Line 206... Line 204...
206
                    }
204
                    }
207
                    else if (bytesReceived!=64)
205
                    else if (bytesReceived!=64)
208
                    {
206
                    {
209
                        errMsg          = ERR_ERROR;
207
                        errMsg          = ERR_ERROR;
210
                        afterAckPgs     = pgsWAIT_FIRST_PGM_PACKET;
208
                        afterAckPgs     = pgsWAIT_FIRST_PGM_PACKET;
211
                        pgs             = pgsSEND_ACK;
209
                        pgs             = pgsSEND_ACK;
212
                    }
210
                    }
213
                    else
211
                    else
214
                    {
212
                    {
215
                        pgs              = pgsWRITE_PROGRAM;
213
                        pgs              = pgsWRITE_PROGRAM;
216
                        afterAckPgs     = pgsDONE;
214
                        afterAckPgs     = pgsDONE;
217
                    }
215
                    }
218
                }
216
                }
219
 
217
 
220
                // If bytes received 64, write..
218
                // If bytes received 64, write..
Line 230... Line 228...
230
            break;
228
            break;
231
 
229
 
232
 
230
 
233
            case pgsWRITE_PROGRAM:
231
            case pgsWRITE_PROGRAM:
234
 
232
 
-
 
233
                ClrWdt();
235
 
234
 
236
                // Write program and send ack.
235
                // Write program and send ack.
237
 
236
 
238
                // Check addr limit
237
                // Check addr limit
239
                if (pgmAddress<RM_RESET_VECTOR)
238
                if (pgmAddress<RM_RESET_VECTOR)
Line 345... Line 344...
345
    INTCON2bits.RBPU = 0;
344
    INTCON2bits.RBPU = 0;
346
   
345
   
347
    // Enable Interrupts
346
    // Enable Interrupts
348
    INTCONbits.GIEH = 1;
347
    INTCONbits.GIEH = 1;
349
    INTCONbits.GIEL = 1;
348
    INTCONbits.GIEL = 1;
350
 
349
 
351
    // Enable interrupt prirority
350
    // Enable interrupt prirority
352
    RCONbits.IPEN=1;
351
    RCONbits.IPEN=1;
353
   
352
   
354
 
353
 
355
}
354
}
356
 
355
 
357
 
356
 
358
 
357
 
359
/// CAN-------------------------------------------------------
358
/// CAN-------------------------------------------------------
360
 
359
 
361
 
360
 
362
#ifdef USE_CAN
361
#ifdef USE_CAN
363
 
362
 
Line 403... Line 402...
403
    //  Enableing bus wake-up
402
    //  Enableing bus wake-up
404
    BRGCON3bits.WAKDIS = 0;
403
    BRGCON3bits.WAKDIS = 0;
405
   
404
   
406
    // Dont use filter when wakeup
405
    // Dont use filter when wakeup
407
    BRGCON3bits.WAKFIL = 0;
406
    BRGCON3bits.WAKFIL = 0;
408
   
407
   
409
    // Phase_Seg2 = 2 x TQ = 1
408
    // Phase_Seg2 = 2 x TQ = 1
410
    BRGCON3bits.SEG2PH2 = 0;
409
    BRGCON3bits.SEG2PH2 = 0;
411
    BRGCON3bits.SEG2PH1 = 0;
410
    BRGCON3bits.SEG2PH1 = 0;
412
    BRGCON3bits.SEG2PH0 = 1;
411
    BRGCON3bits.SEG2PH0 = 1;
413
 
412
 
414
    ECANCON=0;
413
    ECANCON=0;
415
    ECANCONbits.MDSEL1 = 0;
414
    ECANCONbits.MDSEL1 = 0;
416
    ECANCONbits.MDSEL0 = 1;
415
    ECANCONbits.MDSEL0 = 1;
417
 
416
 
418
 
417
 
419
    // FILTERS AND MASKS
418
    // FILTERS AND MASKS
420
    RXB0CONbits.RXM1=1;
419
    RXB0CONbits.RXM1=1;
421
    RXB0CONbits.RXM0=0;
420
    RXB0CONbits.RXM0=0;
422
 
421
 
Line 469... Line 468...
469
        else if (B2CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10100;  }
468
        else if (B2CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10100;  }
470
        else if (B3CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10101;  }
469
        else if (B3CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10101;  }
471
        else if (B4CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10110;  }
470
        else if (B4CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10110;  }
472
        else if (B5CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10111;  }
471
        else if (B5CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10111;  }
473
        else return FALSE;
472
        else return FALSE;
474
 
473
 
475
 
474
 
476
        //RXB0SIDH 28 27 26 25 24 23 22 21
475
        //RXB0SIDH 28 27 26 25 24 23 22 21
477
        //RXB0SIDL 20 19 18 xx xx xx 17 16
476
        //RXB0SIDL 20 19 18 xx xx xx 17 16
478
        //RXB0EIDH 15 14 13 12 11 10 09 08
477
        //RXB0EIDH 15 14 13 12 11 10 09 08
479
        //RXB0EIDL 07 06 05 04 03 02 01 00
478
        //RXB0EIDL 07 06 05 04 03 02 01 00
480
 
479
 
481
        //funct xx xx xx xx 28 27 26 25
480
        //funct xx xx xx xx 28 27 26 25
482
        //funcc xx xx xx xx xx xx 24 23 22 21 20 19 18 17 16 15 
481
        //funcc xx xx xx xx xx xx 24 23 22 21 20 19 18 17 16 15 
483
        //nid   xx xx 14 13 12 11 10 09 
482
        //nid   xx xx 14 13 12 11 10 09 
484
        //sid   xx xx xx xx xx xx xx 08 07 06 05 04 03 02 01 00
483
        //sid   xx xx xx xx xx xx xx 08 07 06 05 04 03 02 01 00
485
 
484
 
486
 
485
 
487
        cm.funct=((RXB0SIDH & 0xF0)>>4);
486
        cm.funct=((RXB0SIDH & 0xF0)>>4);
488
        cm.funcc=(((WORD)(RXB0SIDH & 0x0F))<<6)+(((WORD)(RXB0SIDL & 0xE0))>>2)+(((WORD)(RXB0SIDL & 0x03))<<1)+(((WORD)(RXB0EIDH & 0x80))>>7);
487
        cm.funcc=(((WORD)(RXB0SIDH & 0x0F))<<6)+(((WORD)(RXB0SIDL & 0xE0))>>2)+(((WORD)(RXB0SIDL & 0x03))<<1)+(((WORD)(RXB0EIDH & 0x80))>>7);
489
        cm.nid=((RXB0EIDH & 0x7E)>>1);
488
        cm.nid=((RXB0EIDH & 0x7E)>>1);
490
        cm.sid=(((WORD)(RXB0EIDH & 0x01))<<8)+RXB0EIDL;
489
        cm.sid=(((WORD)(RXB0EIDH & 0x01))<<8)+RXB0EIDL;
491
 
490
 
492
 
491
 
493
        // Data length
492
        // Data length
494
        cm.data_length=(RXB0DLCbits.DLC3<<3)+(RXB0DLCbits.DLC2<<2)+(RXB0DLCbits.DLC1<<1)+RXB0DLCbits.DLC0;
493
        cm.data_length=(RXB0DLCbits.DLC3<<3)+(RXB0DLCbits.DLC2<<2)+(RXB0DLCbits.DLC1<<1)+RXB0DLCbits.DLC0;
495
 
494
 
496
        // Remote request
-
 
497
        cm.remote_request=(RXB0DLCbits.RXRTR==0?FALSE:TRUE);
-
 
498
 
-
 
499
        // Data one bye one, for speed
495
        // Data one bye one, for speed
500
        cm.data[0]=RXB0D0;  cm.data[1]=RXB0D1;
496
        cm.data[0]=RXB0D0;  cm.data[1]=RXB0D1;
501
        cm.data[2]=RXB0D2;  cm.data[3]=RXB0D3;
497
        cm.data[2]=RXB0D2;  cm.data[3]=RXB0D3;
502
        cm.data[4]=RXB0D4;  cm.data[5]=RXB0D5;
498
        cm.data[4]=RXB0D4;  cm.data[5]=RXB0D5;
503
        cm.data[6]=RXB0D6;  cm.data[7]=RXB0D7;
499
        cm.data[6]=RXB0D6;  cm.data[7]=RXB0D7;
Line 517... Line 513...
517
*   Pre-conditions: canInit
513
*   Pre-conditions: canInit
518
*   Affects: ..
514
*   Affects: ..
519
*   Depends: ..
515
*   Depends: ..
520
*/
516
*/
521
BOOL canSendMessage(CAN_PROTO_MESSAGE cm,CAN_PRIORITY prio)
517
BOOL canSendMessage(CAN_PROTO_MESSAGE cm,CAN_PRIORITY prio)
522
{
518
{
523
   
519
   
524
    if ( TXB0CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00011; }
520
    if ( TXB0CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00011; }
525
    if ( TXB1CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00100; }
521
    if ( TXB1CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00100; }
526
    if ( TXB2CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00101; }
522
    if ( TXB2CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00101; }
527
    // None of the transmit buffers were empty. 
523
    // None of the transmit buffers were empty. 
528
    else { return FALSE;}
524
    else { return FALSE;}
529
 
525
 
530
    if (prio<0 || prio>3) prio = 0;
526
    if (prio<0 || prio>3) prio = 0;
531
 
527
 
532
 
528
 
533
        //RXB0SIDH 28 27 26 25 24 23 22 21
529
        //RXB0SIDH 28 27 26 25 24 23 22 21
534
        //RXB0SIDL 20 19 18 xx xx xx 17 16
530
        //RXB0SIDL 20 19 18 xx xx xx 17 16
535
        //RXB0EIDH 15 14 13 12 11 10 09 08
531
        //RXB0EIDH 15 14 13 12 11 10 09 08
536
        //RXB0EIDL 07 06 05 04 03 02 01 00
532
        //RXB0EIDL 07 06 05 04 03 02 01 00
Line 542... Line 538...
542
 
538
 
543
        RXB0SIDH = (BYTE)((cm.funct & 0x0F)<<4)+(BYTE)((cm.funcc & 0x03C0)>>6);
539
        RXB0SIDH = (BYTE)((cm.funct & 0x0F)<<4)+(BYTE)((cm.funcc & 0x03C0)>>6);
544
        RXB0SIDL = (BYTE)((cm.funcc & 0x003F)<<2)+(BYTE)((cm.funcc & 0x0006)>>1);
540
        RXB0SIDL = (BYTE)((cm.funcc & 0x003F)<<2)+(BYTE)((cm.funcc & 0x0006)>>1);
545
        RXB0EIDH = (BYTE)((cm.funcc & 0x0001)<<7)+(BYTE)((cm.nid & 0x3F)<<1)+(BYTE)((cm.sid & 0x0100)>>8);
541
        RXB0EIDH = (BYTE)((cm.funcc & 0x0001)<<7)+(BYTE)((cm.nid & 0x3F)<<1)+(BYTE)((cm.sid & 0x0100)>>8);
546
        RXB0EIDL = (BYTE)((cm.sid & 0x00FF));
542
        RXB0EIDL = (BYTE)((cm.sid & 0x00FF));
547
 
543
 
548
        // Data length
544
        // Data length
549
        RXB0DLC = 0;
545
        RXB0DLC = 0;
550
        if (cm.data_length>8) RXB0DLC=8; else RXB0DLC=cm.data_length;
546
        if (cm.data_length>8) RXB0DLC=8; else RXB0DLC=cm.data_length;
551
       
547
       
552
        // Remote request
548
        // NOT Remote request
553
        if (cm.remote_request==TRUE)
-
 
554
        {
-
 
555
            _asm
-
 
556
                bsf RXB0DLC, 6, 0
-
 
557
            _endasm
-
 
558
        }
-
 
559
        else
-
 
560
        {
-
 
561
            _asm
549
        _asm
562
                bcf RXB0DLC, 6, 0
550
            bcf RXB0DLC, 6, 0
563
            _endasm
551
        _endasm
564
        }
552
 
565
 
553
 
566
        // Data one bye one, for speed
554
        // Data one bye one, for speed
567
        RXB0D0=cm.data[0];  RXB0D1=cm.data[1];
555
        RXB0D0=cm.data[0];  RXB0D1=cm.data[1];
568
        RXB0D2=cm.data[2];  RXB0D3=cm.data[3];
556
        RXB0D2=cm.data[2];  RXB0D3=cm.data[3];
569
        RXB0D4=cm.data[4];  RXB0D5=cm.data[5];
557
        RXB0D4=cm.data[4];  RXB0D5=cm.data[5];