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. #ifdef USE_CAN
  7.  
  8. /*
  9. *   Function: canInit
  10. *
  11. *   Input:  none
  12. *   Output: none
  13. *   Pre-conditions: none
  14. *   Affects: Changes can registers.
  15. *   Depends: none.
  16. */
  17. void canInit()
  18. {
  19.     CANCON=0b10000000;
  20.     while(!CANSTATbits.OPMODE2);
  21.    
  22.     ECANCON=0;
  23.  
  24.     BRGCON1=0b01001001;
  25.     BRGCON2=0b10001001;
  26.     BRGCON3=0b00000001;
  27.  
  28.     // Set Mask 0 to not mask any filter bit
  29.     RXM0SIDH = 0xFF;
  30.     RXM0SIDL = 0xE3;
  31.     RXM0EIDH = 0xFF;
  32.     RXM0EIDL = 0xFF;
  33.  
  34.     MSEL0=MSEL1=MSEL2=MSEL3=0;
  35.  
  36.  
  37.     CIOCON=0b00100000;
  38.  
  39.  
  40.     PIE3=0b00000011;
  41.     IPR3=0b00000011;
  42.    
  43.     CANCON=0b01000000;
  44.     while(CANSTATbits.OPMODE2);
  45. }
  46.  
  47.  
  48. /*
  49. *   Function: canISR
  50. *
  51. *   Input:  none
  52. *   Output: none
  53. *   Pre-conditions: a call to canInit()
  54. *   Affects: interrupt registers and receive data buffers
  55. *   Depends: ..
  56. */
  57. void canISR()
  58. {
  59.     if (PIR3bits.RXB0IF==1 && PIE3bits.RXB0IE==1)
  60.     {
  61.         CAN_MESSAGE cm;
  62.  
  63.         uartPutrs("IF1");
  64.        
  65.         // Set extended mode or not.
  66.         cm.extended=RXB0SIDLbits.EXID;
  67.  
  68.         // Clear
  69.         cm.ident[0]=cm.ident[1]=cm.ident[2]=cm.ident[3]=0;
  70.  
  71.  
  72.         if (cm.extended==TRUE)
  73.         {
  74.             //Read extended ident.
  75.             cm.ident[0]=RXB0EIDL;
  76.             cm.ident[1]=RXB0EIDH;
  77.             cm.ident[2]=(RXB0SIDL & 0b00000011)+((RXB0SIDL & 0b11100000)>3)+((RXB0SIDH & 0b00000111)<5);
  78.             cm.ident[3]=RXB0SIDH>3;
  79.         }
  80.         else
  81.         {
  82.             //Read standard ident.
  83.             cm.ident[0]=((RXB0SIDL & 0b11100000)>5)+(RXB0SIDH>2);
  84.             cm.ident[1]=RXB0SIDH>5;
  85.         }
  86.  
  87.         // Data length
  88.         cm.data_length=RXB0DLC;
  89.  
  90.         // Data one bye one, for speed
  91.         cm.data[0]=RXB0D0;  cm.data[1]=RXB0D1;
  92.         cm.data[2]=RXB0D2;  cm.data[3]=RXB0D3;
  93.         cm.data[4]=RXB0D4;  cm.data[5]=RXB0D5;
  94.         cm.data[6]=RXB0D6;  cm.data[7]=RXB0D7;
  95.  
  96.        
  97.         //Call main parser
  98.         canParse(cm);
  99.  
  100.         RXB0CONbits.RXFUL=0;
  101.         PIR3bits.RXB0IF=0;
  102.     }    
  103.     if (PIR3bits.RXB1IF==1 && PIE3bits.RXB1IE==1)
  104.     {
  105.         CAN_MESSAGE cm;
  106.  
  107.         uartPutrs("IF2");
  108.  
  109.         // Set extended mode or not.
  110.         cm.extended=RXB1SIDLbits.EXID;
  111.  
  112.         // Clear
  113.         cm.ident[0]=cm.ident[1]=cm.ident[2]=cm.ident[3]=0;
  114.  
  115.  
  116.         if (cm.extended==TRUE)
  117.         {
  118.             //Read extended ident.
  119.             cm.ident[0]=RXB1EIDL;
  120.             cm.ident[1]=RXB1EIDH;
  121.             cm.ident[2]=(RXB1SIDL & 0b00000011)+((RXB1SIDL & 0b11100000)>3)+((RXB1SIDH & 0b00000111)<5);
  122.             cm.ident[3]=RXB1SIDH>3;
  123.         }
  124.         else
  125.         {
  126.             //Read standard ident.
  127.             cm.ident[0]=((RXB1SIDL & 0b11100000)>5)+(RXB1SIDH>2);
  128.             cm.ident[1]=RXB1SIDH>5;
  129.         }
  130.  
  131.         // Data length
  132.         cm.data_length=RXB1DLC;
  133.  
  134.         // Data one bye one, for speed
  135.         cm.data[0]=RXB1D0;  cm.data[1]=RXB1D1;
  136.         cm.data[2]=RXB1D2;  cm.data[3]=RXB1D3;
  137.         cm.data[4]=RXB1D4;  cm.data[5]=RXB1D5;
  138.         cm.data[6]=RXB1D6;  cm.data[7]=RXB1D7;
  139.  
  140.  
  141.         //Call main parser
  142.         canParse(cm);
  143.  
  144.         RXB1CONbits.RXFUL=0;
  145.         PIR3bits.RXB1IF=0;
  146.     }
  147.  
  148. }
  149.  
  150.  
  151. /*
  152. *   Function: canSendMessage
  153. *
  154. *   Input:  CAN_MESSAGE to send
  155. *   Output: True if packet scheduled sucess, false otherwise.
  156. *   Pre-conditions: canInit
  157. *   Affects: ..
  158. *   Depends: ..
  159. */
  160. BOOL canSendMessage(CAN_MESSAGE cm)
  161. {
  162.     BYTE defECANCON;
  163.    
  164.     // Find the first empty transmitter.
  165.     if ( TXB0CONbits.TXREQ == 0 )
  166.     {
  167.         uartPutrs("Sending..");
  168.  
  169.         // Set extended mode or not.
  170.         TXB0SIDLbits.EXIDE=cm.extended;
  171.  
  172.         if (cm.extended==TRUE)
  173.         {
  174.             //Write extended ident.
  175.             TXB0SIDH=(cm.ident[3]<3)+(cm.ident[2]>5);
  176.             TXB0SIDL=(TXB0SIDL & 0b00011100)+((cm.ident[2] & 0b0001100)<3)+(cm.ident[2] & 0b00000011);
  177.             TXB0EIDH=cm.ident[1];
  178.             TXB0EIDL=cm.ident[0];
  179.         }
  180.         else
  181.         {
  182.             //Write standard ident.
  183.             TXB0SIDH=(cm.ident[1]<5)+(cm.ident[0]>3);
  184.             TXB0SIDL=(TXB0SIDL & 0b00011111)+(cm.ident[0]<5);
  185.         }
  186.  
  187.         // Data length
  188.         if (cm.data_length>8) TXB0DLC=8; else TXB0DLC=cm.data_length;
  189.  
  190.         // Data one bye one, for speed
  191.         TXB0D0=cm.data[0];  TXB0D1=cm.data[1];
  192.         TXB0D2=cm.data[2];  TXB0D3=cm.data[3];
  193.         TXB0D4=cm.data[4];  TXB0D5=cm.data[5];
  194.         TXB0D6=cm.data[6];  TXB0D7=cm.data[7];
  195.  
  196.         // mark as redy to transmit
  197.         TXB0CONbits.TXREQ=1;
  198.  
  199.         while(TXB0CONbits.TXREQ);
  200.  
  201.  
  202.     }
  203.     // None of the transmit buffers were empty.
  204.     else {uartPutrs("No free tx."); return FALSE;}
  205.    
  206.  
  207.    
  208.  
  209.         return TRUE;
  210.  
  211. }
  212.  
  213.  
  214. #endif //USE_CAN
  215.