void DRV_SPI0_Initialize(void) { PLIB_SPI_Disable(SPI_ID_1); PLIB_SPI_MasterEnable(SPI_ID_1); PLIB_SPI_SlaveSelectEnable(SPI_ID_1); PLIB_SPI_StopInIdleDisable(SPI_ID_1); PLIB_SPI_ClockPolaritySelect(SPI_ID_1, SPI_CLOCK_POLARITY_IDLE_LOW); PLIB_SPI_OutputDataPhaseSelect(SPI_ID_1, SPI_OUTPUT_DATA_PHASE_ON_IDLE_TO_ACTIVE_CLOCK); PLIB_SPI_InputSamplePhaseSelect(SPI_ID_1, SPI_INPUT_SAMPLING_PHASE_IN_MIDDLE); PLIB_SPI_CommunicationWidthSelect(SPI_ID_1, SPI_COMMUNICATION_WIDTH_8BITS); PLIB_SPI_FramedCommunicationDisable( SPI_ID_1 ); PLIB_SPI_AudioProtocolDisable(SPI_ID_1); PLIB_SPI_FIFOEnable( SPI_ID_1 ); PLIB_SPI_BaudRateSet(SPI_ID_1, SYS_CLK_PeripheralFrequencyGet(CLK_BUS_PERIPHERAL_2), 1000000); PLIB_SPI_Enable(SPI_ID_1); }
SYS_MODULE_OBJ DRV_SPI0_Initialize(void) { DRV_SPI_OBJ *dObj = (DRV_SPI_OBJ*)NULL; dObj = &gDrvSPI0Obj; /* Disable the SPI module to configure it*/ PLIB_SPI_Disable ( SPI_ID_1 ); /* Set up Master or Slave Mode*/ PLIB_SPI_MasterEnable ( SPI_ID_1 ); PLIB_SPI_PinDisable(SPI_ID_1, SPI_PIN_SLAVE_SELECT); /* Set up if the SPI is allowed to run while the rest of the CPU is in idle mode*/ PLIB_SPI_StopInIdleDisable( SPI_ID_1 ); /* Set up clock Polarity and output data phase*/ PLIB_SPI_ClockPolaritySelect( SPI_ID_1, SPI_CLOCK_POLARITY_IDLE_LOW ); PLIB_SPI_OutputDataPhaseSelect( SPI_ID_1, SPI_OUTPUT_DATA_PHASE_ON_IDLE_TO_ACTIVE_CLOCK ); /* Set up the Input Sample Phase*/ PLIB_SPI_InputSamplePhaseSelect ( SPI_ID_1, SPI_INPUT_SAMPLING_PHASE_IN_MIDDLE); /* Communication Width Selection */ PLIB_SPI_CommunicationWidthSelect ( SPI_ID_1, SPI_COMMUNICATION_WIDTH_8BITS ); /* Baud rate selection */ PLIB_SPI_BaudRateSet( SPI_ID_1 , SYS_CLK_PeripheralFrequencyGet(CLK_BUS_PERIPHERAL_2), 1000000 ); /* Protocol selection */ PLIB_SPI_FramedCommunicationDisable( SPI_ID_1 ); #if defined (PLIB_SPI_ExistsAudioProtocolControl) if (PLIB_SPI_ExistsAudioProtocolControl(SPI_ID_1)) { PLIB_SPI_AudioProtocolDisable(SPI_ID_1); } #endif /* Buffer type selection */ #if defined (PLIB_SPI_ExistsFIFOControl) if (PLIB_SPI_ExistsFIFOControl( SPI_ID_1 )) { PLIB_SPI_FIFODisable( SPI_ID_1 ); } #endif PLIB_SPI_BufferClear( SPI_ID_1 ); PLIB_SPI_ReceiverOverflowClear ( SPI_ID_1 ); /* Initialize Queue only once for all instances of SPI driver*/ if (DRV_SPI_SYS_QUEUE_Initialize(&qmInitData, &hQueueManager) != DRV_SPI_SYS_QUEUE_SUCCESS) { SYS_ASSERT(false, "\r\nSPI Driver: Could not create queuing system."); return SYS_MODULE_OBJ_INVALID; } /* Update the Queue parameters. */ qInitData.maxElements = 10; //Queue size qInitData.reserveElements = 1; //Mininmum number of job queues reserved /* Create Queue for this instance of SPI */ if (DRV_SPI_SYS_QUEUE_CreateQueue(hQueueManager, &qInitData, &dObj->queue) != DRV_SPI_SYS_QUEUE_SUCCESS) { SYS_ASSERT(false, "\r\nSPI Driver: Could not set up driver instance queue."); return SYS_MODULE_OBJ_INVALID; } /* Update the SPI OBJECT parameters. */ dObj->operationStarting = NULL; dObj->operationEnded = NULL; SYS_INT_SourceDisable(INT_SOURCE_SPI_1_TRANSMIT); SYS_INT_SourceDisable(INT_SOURCE_SPI_1_RECEIVE); SYS_INT_SourceEnable(INT_SOURCE_SPI_1_ERROR); /* Clear all interrupt sources */ SYS_INT_SourceStatusClear(INT_SOURCE_SPI_1_TRANSMIT); SYS_INT_SourceStatusClear(INT_SOURCE_SPI_1_RECEIVE); SYS_INT_SourceStatusClear(INT_SOURCE_SPI_1_ERROR); /* Enable the Module */ PLIB_SPI_Enable(SPI_ID_1); return (SYS_MODULE_OBJ)DRV_SPI_INDEX_0 ; }