Subversion Repositories HomeAutomation

Rev

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

  1. #include "../Include/CANdefs.h"
  2. #include "../Include/stackTasks.h"
  3. #include "../Include/CAN.h"
  4. #include "../Include/uart.h"
  5.  
  6. static void canGetPacket(void);
  7.  
  8. #ifdef USE_CAN
  9.  
  10.  
  11. /*
  12. *   Function: canInit
  13. *
  14. *   Input:  none
  15. *   Output: none
  16. *   Pre-conditions: none
  17. *   Affects: Changes can registers.
  18. *   Depends: none.
  19. */
  20. void canInit()
  21. {
  22.     CANCON = 0x80; //request config mode
  23.     while ((CANSTAT & 0xE0) != 0x80 ); //wait for config mode request
  24.  
  25.     // BAUD AND TQS
  26.  
  27.     BRGCON1=0;
  28.    
  29.     // Sync_Seq = 2 x TQ = 1
  30.     BRGCON1bits.SJW1=0;
  31.     BRGCON1bits.SJW0=1;
  32.    
  33.     // Setting BRP.
  34.     BRGCON1=BRGCON1|CAN_BRP;
  35.    
  36.     // Maximum PHEG1
  37.     BRGCON2bits.SEG2PHTS = 1;
  38.    
  39.     // Phase_Seg1 = 2 x TQ = 1
  40.     BRGCON2bits.SEG1PH2 = 0;
  41.     BRGCON2bits.SEG1PH1 = 0;
  42.     BRGCON2bits.SEG1PH0 = 1;
  43.    
  44.     // Prop_Seq = 2 x TQ = 1
  45.     BRGCON2bits.PRSEG2 = 0;
  46.     BRGCON2bits.PRSEG1 = 0;
  47.     BRGCON2bits.PRSEG0 = 1;
  48.    
  49.     //  Enableing bus wake-up
  50.     BRGCON3bits.WAKDIS = 0;
  51.    
  52.     // Dont use filter when wakeup
  53.     BRGCON3bits.WAKFIL = 0;
  54.    
  55.     // Phase_Seg2 = 2 x TQ = 1
  56.     BRGCON3bits.SEG2PH2 = 0;
  57.     BRGCON3bits.SEG2PH1 = 0;
  58.     BRGCON3bits.SEG2PH0 = 1;
  59.  
  60.     ECANCON=0;
  61.     ECANCONbits.MDSEL1 = 0;
  62.     ECANCONbits.MDSEL0 = 1;
  63.  
  64.  
  65.     // FILTERS AND MASKS
  66.     RXB0CONbits.RXM1=1;
  67.     RXB0CONbits.RXM0=0;
  68.  
  69.  
  70.     // INTERRUPTS
  71.    
  72.     // Diable transmit interrupt
  73.     TXBIE = 0;
  74.  
  75.     //rx any interrupt
  76.     PIR3 = 0;
  77.     PIE3 = 0b00000011;
  78.  
  79.     // High interrupt
  80.     IPR3 =0b00000011;
  81.  
  82.     // Programmable buffers interrupt
  83.     BIE0  = 0xFF;  
  84.  
  85.  
  86.     //loopback mode or not
  87.     #ifdef CAN_LOOPBACK_MODE
  88.         CANCON = 0x40;//request loopback mode
  89.         while ((CANSTAT & 0xE0) != 0x40 );//wait for loopback mode
  90.     #else
  91.         CANCON = 0x00;//request normal mode
  92.         while ((CANSTAT & 0xE0) != 0x00 );//wait for normal mode
  93.     #endif
  94.  
  95. }
  96.  
  97.  
  98. /*
  99. *   Function: canISR
  100. *
  101. *   Input:  none
  102. *   Output: none
  103. *   Pre-conditions: a call to canInit()
  104. *   Affects: interrupt registers and receive data buffers
  105. *   Depends: ..
  106. */
  107. void canISR()
  108. {
  109.     if (PIR3bits.RXBnIF || PIR3bits.RXB1IF || PIR3bits.RXB0IF)
  110.     {
  111.  
  112.         // Get which buffer that is ful.
  113.              if (RXB0CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10000; canGetPacket(); }
  114.         else if (RXB1CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10001; canGetPacket(); }
  115.         else if (B0CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10010; canGetPacket(); }
  116.         else if (B1CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10011; canGetPacket(); }
  117.         else if (B2CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10100; canGetPacket(); }
  118.         else if (B3CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10101; canGetPacket(); }
  119.         else if (B4CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10110; canGetPacket(); }
  120.         else if (B5CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10111; canGetPacket(); }
  121.    
  122.         if (PIR3bits.RXBnIF) {PIR3bits.RXBnIF = 0;}
  123.         if (PIR3bits.RXB1IF) {PIR3bits.RXB1IF = 0;}
  124.         if (PIR3bits.RXB0IF) {PIR3bits.RXB0IF = 0;}
  125.    
  126.     }
  127. }
  128.  
  129.  
  130. /*
  131. *   Function: canGetPacket
  132. *
  133. *   Input:  none
  134. *   Output: none
  135. *   Pre-conditions: a call to canISR and an packet is available and banked to RXB0
  136. *   Affects: Calls canParse() function in main for parsing received packet.
  137. *   Depends: none.
  138. */
  139. void canGetPacket()
  140. {
  141.         CAN_MESSAGE cm;
  142.  
  143.         // Set extended mode or not.
  144.         cm.extended=(RXB0SIDLbits.EXID==0?FALSE:TRUE);
  145.  
  146.         // Clear
  147.         cm.ident=0;
  148.  
  149.  
  150.         if (cm.extended==TRUE)
  151.         {
  152.             //Read extended ident.
  153.  
  154.             //xx xx xx 28 27 26 25 24   23 22 21 20 19 18 17 16   15 14 13 12 11 10 09 08   07 06 05 04 03 02 01 00
  155.  
  156.             //RXB0SIDH 28 27 26 25 24 23 22 21
  157.             //RXB0SIDL 20 19 18 xx xx xx 17 16
  158.             //RXB0EIDH 15 14 13 12 11 10 09 08
  159.             //RXB0EIDL 07 06 05 04 03 02 01 00
  160.  
  161.  
  162.             cm.ident = (((DWORD)RXB0SIDH)<<21) + (((DWORD)(RXB0SIDL & 0xE0))<<13) + (((DWORD)(RXB0SIDL & 0x03))<<16) + (((DWORD)RXB0EIDH)<<8) + (BYTE)RXB0EIDL;
  163.  
  164.         }
  165.         else
  166.         {
  167.             //Read standard ident.
  168.  
  169.             //xx xx xx xx xx 10 09 08   07 06 05 04 03 02 01 00
  170.  
  171.             //RXB0SIDH 10 09 08 07 06 05 04 03
  172.             //RXB0SIDL 02 01 00 xx xx xx xx xx
  173.  
  174.             cm.ident = (((DWORD)RXB0SIDH)<<3) + (((DWORD)RXB0SIDL)>>5);
  175.         }
  176.  
  177.         // Data length
  178.         cm.data_length=RXB0DLC;
  179.  
  180.         // Data one bye one, for speed
  181.         cm.data[0]=RXB0D0;  cm.data[1]=RXB0D1;
  182.         cm.data[2]=RXB0D2;  cm.data[3]=RXB0D3;
  183.         cm.data[4]=RXB0D4;  cm.data[5]=RXB0D5;
  184.         cm.data[6]=RXB0D6;  cm.data[7]=RXB0D7;
  185.  
  186.         // Clear ful status
  187.         RXB0CONbits.RXFUL=0;
  188.  
  189.         //Call main parser
  190.         canParse(cm);
  191. }
  192.  
  193.  
  194. /*
  195. *   Function: canSendMessage
  196. *
  197. *   Input:  CAN_MESSAGE to send
  198. *   Output: True if packet scheduled sucess, false otherwise.
  199. *   Pre-conditions: canInit
  200. *   Affects: ..
  201. *   Depends: ..
  202. */
  203. BOOL canSendMessage(CAN_MESSAGE cm)
  204. {
  205.  
  206.  
  207.     if ( TXB0CONbits.TXREQ == 0 )
  208.     {
  209.         uartPutrs("TXREQ not set.");
  210.  
  211.     }
  212.     else { uartPutrs("TXREQ is set."); return FALSE;}
  213.  
  214.  
  215.  
  216.  
  217. /*
  218.     if ( TXB0CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00011; }
  219.     if ( TXB1CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00100; }
  220.     if ( TXB2CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00101; }
  221.     // None of the transmit buffers were empty.
  222.     else { return FALSE;}
  223.  
  224.    
  225.     // Set extended mode or not.
  226.     RXB0SIDLbits.EXID=(cm.extended==TRUE?1:0);
  227.  
  228.  
  229.         if (cm.extended==TRUE)
  230.         {
  231.             RXB0SIDL=RXB0SIDL|0b00001000;
  232.         //  _asm
  233.         //      bsf RXB0SIDL, 3, 0
  234.         //  _endasm
  235.         }
  236.         else
  237.         {
  238.             RXB0SIDL=RXB0SIDL&0b11110111;
  239.         //  _asm
  240.         //      bcf RXB0SIDL, 3, 0
  241.         //  _endasm
  242.         }
  243.  
  244.        
  245.  
  246.  
  247.         if (cm.extended==TRUE)
  248.         {
  249.             //Write extended ident.
  250.    
  251.             //xx xx xx 28 27 26 25 24   23 22 21 20 19 18 17 16   15 14 13 12 11 10 09 08   07 06 05 04 03 02 01 00
  252.  
  253.             //RXB0SIDH 28 27 26 25 24 23 22 21
  254.             //RXB0SIDL 20 19 18 xx xx xx 17 16
  255.             //RXB0EIDH 15 14 13 12 11 10 09 08
  256.             //RXB0EIDL 07 06 05 04 03 02 01 00
  257.  
  258.  
  259.             RXB0SIDH =  (BYTE)((cm.ident>>21));
  260.             RXB0SIDL = ((BYTE)(cm.ident>>16) & 0x03) + ((BYTE)(cm.ident>>13) & 0xE0);
  261.             RXB0EIDH =  (BYTE)(cm.ident>>8);
  262.             RXB0EIDL =  (BYTE)cm.ident;
  263.  
  264.         }
  265.         else
  266.         {
  267.             //Write standard ident.
  268.        
  269.             //xx xx xx xx xx 10 09 08   07 06 05 04 03 02 01 00
  270.  
  271.             //RXB0SIDH 10 09 08 07 06 05 04 03
  272.             //RXB0SIDL 02 01 00 xx xx xx xx xx
  273.  
  274.             RXB0SIDH=  (BYTE)(cm.ident>>3);
  275.             RXB0SIDL= ((BYTE)(cm.ident<<5) & 0xE0);
  276.  
  277.         }
  278.  
  279.         // Data length
  280.         if (cm.data_length>8) RXB0DLC=8; else RXB0DLC=cm.data_length;
  281.  
  282.         // Data one bye one, for speed
  283.         RXB0D0=cm.data[0];  RXB0D1=cm.data[1];
  284.         RXB0D2=cm.data[2];  RXB0D3=cm.data[3];
  285.         RXB0D4=cm.data[4];  RXB0D5=cm.data[5];
  286.         RXB0D6=cm.data[6];  RXB0D7=cm.data[7];
  287.  
  288.         // mark as redy to transmit
  289.         _asm
  290.             bsf RXB0CON, 3, 0
  291.         _endasm
  292.  
  293.  
  294.         return TRUE;
  295. */
  296. }
  297.  
  298.  
  299.  
  300. #endif //USE_CAN
  301.