Advertisement
Guest User

Untitled

a guest
Sep 8th, 2017
339
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.72 KB | None | 0 0
  1. /* Sadly, the MCC doesn't know about 28-pin SPDIP package for 24F PIC series, so
  2.  * we need to write initialization code by ourself
  3.  *
  4.  * Initialization must be done as follows:
  5.  *
  6.  * 1) Select pin alternate functions for both SPI1 and SPI2
  7.  * 2) Select GPIO mode and directions for pins -READY_D and -READY_H
  8.  *
  9.  * The pinout for the SPDIP-28 package can be found on page 4 of the manual. For
  10.  * SPI1 we use pins 2, 3, 4 and 5 for MOSI, MISO, CLK and -SS functions respectively.
  11.  * For SPI2 pins 15, 16, 17 and 18 will be used. Here mapping of the physical
  12.  * pin numbers to logical RP pins:
  13.  *
  14.  *           SPI-1               SPI-2
  15.  * MOSI     2 (RP26)            15 (RP6)
  16.  * MISO     3 (RP27)            16 (RP7)
  17.  * CLK      6 (RP2)             17 (RP8)
  18.  * -CS      7 (RP3)             18 (RP9)
  19.  *
  20.  * See tables 11-6 for input mapping info and 11-7 for output function numbers
  21.  */
  22. void
  23. init_pins(void)
  24. {
  25.     /* Unlock configuration registers
  26.      */
  27.     __builtin_write_OSCCONL(OSCCON & 0xBF);
  28. #if 0
  29.     /* APF for SPI1
  30.      */
  31.     RPINR20bits.SDI1R = 26;         // SDI (RP26)
  32.     RPOR13bits.RP27R = _RPOUT_SDO1; // SDO
  33.     RPINR20bits.SCK1R = 2;          // CLK (RP2)
  34.     RPINR21bits.SS1R = 3;           // -SS (RP3)
  35.  
  36.     /* APF for SPI2
  37.      */
  38.     RPINR22bits.SDI2R = 6;          // SDI (RP6)
  39.     RPOR3bits.RP7R = _RPOUT_SDO2;   // SDO
  40.     RPINR22bits.SCK2R = 8;          // CLK (RP8)
  41.     RPINR23bits.SS2R = 9;           // -SS (RP9)
  42. #else
  43.     RPINR20bits.SDI1R = 0x001A;     //RA0->SPI1:SDI1;
  44.     RPOR13bits.RP27R = 0x0007;      //RA1->SPI1:SDO1;
  45.     RPINR20bits.SCK1R = 0x0002;     //RB2->SPI1:SCK1IN;
  46.     RPINR21bits.SS1R = 0x0003;      //RB3->SPI1:SS1IN;
  47.  
  48.     RPINR22bits.SDI2R = 0x0006;     //RB6->SPI2:SDI2;
  49.     RPOR3bits.RP7R = 0x000A;        //RB7->SPI2:SDO2;
  50.     RPINR22bits.SCK2R = 0x0008;     //RB8->SPI2:SCK2IN;
  51.     RPINR23bits.SS2R = 0x0009;      //RB9->SPI2:SS2IN;
  52. #endif
  53.     /* Lock registers back
  54.      */
  55.      __builtin_write_OSCCONL(OSCCON | 0x40);
  56.  
  57. #define CON1L_FLAGS ( \
  58.         (1<<15) /* SPIEN=1                              */ | \
  59.         (1<<8)  /* CKE=1                                */ | \
  60.         (0<<7)  /* SEN=0                                */ | \
  61.         (1<<6)  /* CKP=1, Idle on high level            */ | \
  62.         (0<<5)  /* MSTEN=0 Slave mode                   */ | \
  63.         (1<<0)  /* ENHBUF=1 Enhanced Buffer mode enable */ \
  64.     )
  65.  
  66.  
  67.     // AUDEN disabled; FRMEN enabled; AUDMOD I2S; FRMSYPW One clock wide; AUDMONO stereo; FRMCNT 0; MSSEN disabled; FRMPOL disabled; IGNROV disabled; SPISGNEXT not sign-extended; FRMSYNC disabled; URDTEN disabled; IGNTUR disabled;
  68.     SPI1CON1H = 0x0010;
  69.     // WLENGTH 0;
  70.     SPI1CON2L = 0x0000;
  71.     // SPIROV disabled; FRMERR disabled;
  72.     SPI1STATL = 0x0000;
  73.     // SPI1BRGL 0;
  74.     SPI1BRGL = 0x0000;
  75.     // SPITBFEN disabled; SPITUREN disabled; FRMERREN disabled; SRMTEN disabled; SPIRBEN disabled; BUSYEN disabled; SPITBEN disabled; SPIROVEN disabled; SPIRBFEN disabled;
  76.     SPI1IMSKL = 0x0000;
  77.     // RXMSK 0; TXWIEN disabled; TXMSK 0; RXWIEN disabled;
  78.     SPI1IMSKH = 0x0000;
  79.     // SPI1URDTL 0;
  80.     SPI1URDTL = 0x0000;
  81.     // SPI1URDTH 0;
  82.     SPI1URDTH = 0x0000;
  83.     // SPIEN enabled; DISSDO disabled; MCLKEN FOSC/2; CKP Idle:High, Active:Low; SSEN enabled; MSTEN Slave; MODE16 disabled; SMP Middle; DISSCK disabled; SPIFE Frame Sync pulse precedes; CKE Idle to Active; MODE32 disabled; SPISIDL disabled; ENHBUF enabled; DISSDI disabled;
  84.     SPI1CON1L = 0x8101;
  85.  
  86.  
  87.     // AUDEN disabled; FRMEN enabled; AUDMOD I2S; FRMSYPW One clock wide; AUDMONO stereo; FRMCNT 0; MSSEN disabled; FRMPOL disabled; IGNROV disabled; SPISGNEXT not sign-extended; FRMSYNC disabled; URDTEN disabled; IGNTUR disabled;
  88.     SPI2CON1Lbits.SPIEN = 0;
  89.  
  90.     SPI2BUFL = 0;
  91.     SPI2BUFH = 0;
  92.  
  93.     IFS2bits.SPI2IF = 0;
  94.     IFS3bits.SPI2RXIF = 0;
  95.     IPC8bits.SPI2IP = 5;
  96.     IPC14bits.SPI2RXIP = 5;
  97.  
  98.     IEC2bits.SPI2IE = 1;
  99.     IEC3bits.SPI2RXIE = 1;
  100.  
  101.     SPI2STATLbits.SPIROV = 0;
  102.  
  103.     SPI2CON1L = 0x0000;
  104.  
  105.     SPI2CON1Lbits.SPIEN = 1;
  106.  
  107.     /* Enable SPI RX interrupts
  108.      */
  109.     IEC0bits.SPI1IE = 1;
  110.     IEC3bits.SPI1RXIE = 1;
  111.  
  112.     IFS0bits.SPI1IF = 0;
  113.     IFS3bits.SPI1RXIF = 0;
  114.  
  115.     /* Setup GPIOs
  116.      */
  117.     LATA = 0x0000;
  118.     LATB = 0x0000;
  119.  
  120.     TRISA = 0x000D;
  121.     TRISB = 0xFF4F;
  122.  
  123.     ANSA = 0x0000;          // All pins is digital
  124.     ANSB = 0x0000;
  125.  
  126.     /* IOC
  127.      */
  128.     IOCNAbits.IOCNA2 = 1;   // Enable IOC on RA2 on high-to-low transition
  129.     IOCNBbits.IOCNB10 = 1;  // .. and on the RB10
  130.     IEC1bits.IOCIE = 1;     // Global enable IOC interrupts
  131.     PADCONbits.IOCON = 1;   // Enable Interrupt-on-change functionality
  132.     IFS1bits.IOCIF = 0;     // clear IOC interrupt flag
  133.     IPC4bits.IOCIP = 1;
  134.  
  135.     IOCFA = 0;
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement