// Set up the SPI for the MicroSD card void sdSetup(void) { // Configure Port Direction TRISDbits.TRISD5 = 0; // Turn RD5 into output for SCLK TRISDbits.TRISD4 = 1; // Turn RD4 into input for MISO TRISDbits.TRISD3 = 0; // Turn RD3 into output for MOSI TRISDbits.TRISD2 = 0; // Turn RD2 into output for SS TRISDbits.TRISD1 = 1; // Turn RD1 into input for CD (card detect) // Configure PPS pins for MicroSD iPPSInput(IN_FN_PPS_SDI1,IN_PIN_PPS_RP25); // Assign SDI1 to pin RP25 iPPSOutput(OUT_PIN_PPS_RP20,OUT_FN_PPS_SCK1OUT); // Assign SCK1OUT to pin RP20 iPPSOutput(OUT_PIN_PPS_RP22,OUT_FN_PPS_SDO1); // Assign SDO1 to pin RP22 iPPSOutput(OUT_PIN_PPS_RP23,OUT_FN_PPS_SS1OUT); // Assign SS1OUT to pin RP23 // Close SPI in case it's already open CloseSPI1(); // Enable SPI interface // Clear and disable SPI interupts for now SPI1_Clear_Intr_Status_Bit; DisableIntSPI1; ConfigIntSPI1(SPI_INT_DIS); // Interrupts disabled OpenSPI1(0x0000, MASTER_ENABLE_ON, SPI_ENABLE); // Master Mode // SPI enabled }
static void initSPI_OSD(uint16_t priPre, uint16_t secPre) { uint16_t SPICON1Value = 0, SPICON2Value = 0; uint16_t SPISTATValue = 0; #if defined(__dsPIC33E__) SPICON1Value = ENABLE_SDO_PIN & SPI_MODE16_OFF & ENABLE_SCK_PIN & SPI_SMP_OFF & SPI_CKE_ON & SLAVE_ENABLE_OFF & CLK_POL_ACTIVE_HIGH & MASTER_ENABLE_ON & secPre & priPre; // SPICON2Value = FRAME_ENABLE_OFF & FRAME_SYNC_OUTPUT; // & FIFO_BUFFER_DISABLE; // SPISTATValue = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR; // & BUF_INT_SEL_5; SPISTATValue = SPI_ENABLE; #else SPICON1Value = ENABLE_SDO_PIN & SPI_MODE16_OFF & ENABLE_SCK_PIN & SPI_SMP_ON & SPI_CKE_OFF & SLAVE_ENABLE_OFF & CLK_POL_ACTIVE_LOW & MASTER_ENABLE_ON & secPre & priPre; SPICON2Value = FRAME_ENABLE_OFF & FRAME_SYNC_OUTPUT; SPISTATValue = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR; #endif #if (BOARD_TYPE == UDB4_BOARD || BOARD_TYPE == UDB5_BOARD) CloseSPI1(); // ConfigIntSPI1(SPI_INT_DIS & SPI_INT_PRI_6); OpenSPI1(SPICON1Value, SPICON2Value, SPISTATValue); SPI1STATbits.SPIROV = 0; // clear SPI receive overflow _SPI1IF = 0; // clear any pending interrupts // _SPI1IP = INT_PRI_SPI1; // set interrupt priority // _SPI1IE = 1; // turn on SPI interrupts #elif (BOARD_TYPE == AUAV3_BOARD) CloseSPI3(); // ConfigIntSPI3(SPI_INT_DIS & SPI_INT_PRI_6); OpenSPI3(SPICON1Value, SPICON2Value, SPISTATValue); SPI3STATbits.SPIROV = 0; // clear SPI receive overflow _SPI3IF = 0; // clear any pending interrupts // _SPI3IP = INT_PRI_SPI3; // set interrupt priority // _SPI3IE = 1; // turn on SPI interrupts // SPIxSTAT 801C, SPIxCON1 0079, SPIxCON2 0000 #endif }