/*! * @brief SPI master DMA non-blocking. * * Thid function uses SPI master to send an array to slave * and receive the array back from slave, * then compare whether the two buffers are the same. */ int main (void) { uint8_t loopCount = 0; uint32_t j; uint32_t failCount = 0; uint32_t calculatedBaudRate; spi_dma_master_state_t spiDmaMasterState; dma_state_t state; spi_dma_master_user_config_t userDmaConfig = { #if FSL_FEATURE_SPI_16BIT_TRANSFERS .bitCount = kSpi8BitMode, #endif .polarity = kSpiClockPolarity_ActiveHigh, .phase = kSpiClockPhase_FirstEdge, .direction = kSpiMsbFirst, .bitsPerSec = TRANSFER_BAUDRATE }; // init the hardware, this also sets up up the SPI pins for each specific SoC hardware_init(); // Init OSA layer. OSA_Init(); PRINTF("\r\nSPI board to board dma-non-blocking example"); PRINTF("\r\nThis example run on instance %d", (uint32_t)SPI_MASTER_INSTANCE); PRINTF("\r\nBe sure master's SPI%d and slave's SPI%d are connected\r\n", (uint32_t)SPI_MASTER_INSTANCE, (uint32_t)SPI_MASTER_INSTANCE); // Set up and init the master DMA_DRV_Init(&state); // Init the dspi module for eDMA operation SPI_DRV_DmaMasterInit(SPI_MASTER_INSTANCE, &spiDmaMasterState); SPI_DRV_DmaMasterConfigureBus(SPI_MASTER_INSTANCE, &userDmaConfig, &calculatedBaudRate); if (calculatedBaudRate > userDmaConfig.bitsPerSec) { PRINTF("\r\n**Something failed in the master bus config \r\n"); return -1; } else { PRINTF("\r\nBaud rate in Hz is: %d\r\n", calculatedBaudRate); } while(1) { // Initialize the source buffer for (j = 0; j < TRANSFER_SIZE; j++) { s_spiSourceBuffer[j] = j + loopCount; } // Reset the sink buffer for (j = 0; j < TRANSFER_SIZE; j++) { s_spiSinkBuffer[j] = 0; } // Start the transfer SPI_DRV_DmaMasterTransferBlocking(SPI_MASTER_INSTANCE, NULL, s_spiSourceBuffer, NULL, TRANSFER_SIZE, MASTER_TRANSFER_TIMEOUT); while (SPI_DRV_DmaMasterGetTransferStatus(SPI_MASTER_INSTANCE, NULL) == kStatus_SPI_Busy) { } // Delay sometime to wait slave receive and send back data OSA_TimeDelay(500U); //Receive data from slave SPI_DRV_DmaMasterTransfer(SPI_MASTER_INSTANCE, NULL, NULL, s_spiSinkBuffer, TRANSFER_SIZE); while (SPI_DRV_DmaMasterGetTransferStatus(SPI_MASTER_INSTANCE, NULL) == kStatus_SPI_Busy) { } // Verify the contents of the master sink buffer // refer to the slave driver for the expected data pattern failCount = 0; // reset failCount variable for (j = 0; j < TRANSFER_SIZE; j++) { if (s_spiSinkBuffer[j] != s_spiSourceBuffer[j]) { failCount++; } } // Print out transmit buffer. PRINTF("\r\nMaster transmit:"); for (j = 0; j < TRANSFER_SIZE; j++) { // Print 16 numbers in a line. if ((j & 0x0F) == 0) { PRINTF("\r\n "); } PRINTF(" %02X", s_spiSourceBuffer[j]); } // Print out receive buffer. PRINTF("\r\nMaster receive:"); for (j = 0; j < TRANSFER_SIZE; j++) { // Print 16 numbers in a line. if ((j & 0x0F) == 0) { PRINTF("\r\n "); } PRINTF(" %02X", s_spiSinkBuffer[j]); } if (failCount == 0) { PRINTF("\r\n Spi master transfer succeed! \r\n"); } else { PRINTF("\r\n **failures detected in Spi master transfer! \r\n"); } // Wait for press any key. PRINTF("\r\nPress any key to run again\r\n"); GETCHAR(); loopCount++; } }
// Setup the board as a spi master int main (void) { uint8_t loopCount = 0; uint32_t j; uint32_t failCount = 0; uint8_t * pRxBuff; uint32_t calculatedBaudRate; spi_master_state_t spiMasterState; spi_dma_master_state_t spiDmaMasterState; dma_state_t state; spi_dma_master_user_config_t userDmaConfig = { #if FSL_FEATURE_SPI_16BIT_TRANSFERS .bitCount = kSpi8BitMode, #endif .polarity = kSpiClockPolarity_ActiveHigh, .phase = kSpiClockPhase_FirstEdge, .direction = kSpiMsbFirst, .bitsPerSec = TRANSFER_BAUDRATE }; // init the hardware, this also sets up up the SPI pins for each specific SoC hardware_init(); dbg_uart_init(); OSA_Init(); printf("\r\n SPI board to board dma-blocking example"); printf("\r\n This example run on instance 0 "); printf("\r\n Be sure master's SPI0 and slave's SPI0 are connected "); //USER CONFIGURABLE OPTION FOR SPI INSTANCE // Configure SPI pin configure_spi_pins(SPI_MASTER_INSTANCE); printf("\rIMPORTANT, MAKE SURE TO FIRST SET UP THE SPI SLAVE BOARD!\r\n"); //USER CONFIGURABLE OPTION FOR RXBUFF pRxBuff = s_spiSinkBuffer; // Set up and init the master DMA_DRV_Init(&state); // Init the dspi module for eDMA operation SPI_DRV_DmaMasterInit(SPI_MASTER_INSTANCE, &spiDmaMasterState); SPI_DRV_DmaMasterConfigureBus(SPI_MASTER_INSTANCE, &userDmaConfig, &calculatedBaudRate); if (calculatedBaudRate > userDmaConfig.bitsPerSec) { printf("\r**Something failed in the master bus config \r\n"); return -1; } printf("\r\nSpi master SYNC test with various baud rates \r\n"); printf("\r\nBaudRate set to %dHz\r\n", calculatedBaudRate); while(1) { // Initialize the source buffer for (j = 0; j < TRANSFER_SIZE; j++) { s_spiSourceBuffer[j] = j + loopCount; } // Reset the sink buffer for (j = 0; j < TRANSFER_SIZE; j++) { s_spiSinkBuffer[j] = 0; } /* Start the transfer */ if (SPI_DRV_DmaMasterTransferBlocking(SPI_MASTER_INSTANCE, NULL, s_spiSourceBuffer, NULL, TRANSFER_SIZE, MASTER_TRANSFER_TIMEOUT) == kStatus_SPI_Timeout) { printf("\r**Sync transfer timed-out \r\n"); } // Delay sometime to wait slave receive and send back data OSA_TimeDelay(500U); if (SPI_DRV_DmaMasterTransferBlocking(SPI_MASTER_INSTANCE, NULL, NULL, s_spiSinkBuffer, TRANSFER_SIZE, MASTER_TRANSFER_TIMEOUT) == kStatus_SPI_Timeout) { printf("\r**Sync transfer timed-out \r\n"); } // Verify the contents of the master sink buffer // refer to the slave driver for the expected data pattern failCount = 0; // reset failCount variable for (j = 0; j < TRANSFER_SIZE; j++) { if (s_spiSinkBuffer[j] != s_spiSourceBuffer[j]) { failCount++; } } if (failCount == 0) { printf("\r\nMaster transmit:"); for (j = 0; j < TRANSFER_SIZE; j++) { if (j%16 == 0) { printf("\r\n "); } printf(" %02X", s_spiSourceBuffer[j]); } printf("\r\nMaster receive:"); for (j = 0; j < TRANSFER_SIZE; j++) { if (j%16 == 0) { printf("\r\n "); } printf(" %02X", s_spiSinkBuffer[j]); } printf("\r\n"); printf("\r Spi master blocking transfer succeed! \r\n"); } else { printf("\r\nSource buffer:"); for (j = 0; j < TRANSFER_SIZE; j++) { if (j%16 == 0) { printf("\r\n "); } printf(" %02X", s_spiSourceBuffer[j]); } printf("\r\nSink buffer:"); for (j = 0; j < TRANSFER_SIZE; j++) { if (j%16 == 0) { printf("\r\n "); } printf(" %02X", s_spiSinkBuffer[j]); } printf("\r\n"); printf("\r **failures detected in Spi master blocking transfer! \r\n"); } // Wait for press any key. printf("\r\nPress any key to run again\r\n"); getchar(); loopCount++; } }