ChibiOS/testhal/STM32/STM32F4xx/FSMC_NAND/dma_storm_spi.c

91 lines
2.2 KiB
C
Raw Normal View History

#include "ch.h"
#include "hal.h"
/*
******************************************************************************
* DEFINES
******************************************************************************
*/
#define SPI_BUF_SIZE 512
/*
******************************************************************************
* EXTERNS
******************************************************************************
*/
/*
******************************************************************************
* PROTOTYPES
******************************************************************************
*/
static void spi_end_cb(SPIDriver *spip);
/*
******************************************************************************
* GLOBAL VARIABLES
******************************************************************************
*/
static uint8_t testbuf_ram[SPI_BUF_SIZE];
static const uint8_t testbuf_flash[SPI_BUF_SIZE];
/*
*
*/
static const SPIConfig spicfg = {
spi_end_cb,
GPIOA,
GPIOA_SPI1_NSS,
0, //SPI_CR1_BR_1 | SPI_CR1_BR_0
};
static uint32_t its;
static binary_semaphore_t sem;
static bool stop = false;
/*
******************************************************************************
******************************************************************************
* LOCAL FUNCTIONS
******************************************************************************
******************************************************************************
*/
static void spi_end_cb(SPIDriver *spip){
its++;
if (stop){
chSysLockFromISR();
chBSemSignalI(&sem);
chSysUnlockFromISR();
return;
}
else{
chSysLockFromISR();
spiStartExchangeI(spip, SPI_BUF_SIZE, testbuf_flash, testbuf_ram);
chSysUnlockFromISR();
}
}
/*
******************************************************************************
* EXPORTED FUNCTIONS
******************************************************************************
*/
void dma_storm_spi_start(void){
its = 0;
stop = false;
chBSemObjectInit(&sem, true);
spiStart(&SPID1, &spicfg);
spiStartExchange(&SPID1, SPI_BUF_SIZE, testbuf_flash, testbuf_ram);
}
uint32_t dma_storm_spi_stop(void){
stop = true;
chBSemWait(&sem);
spiStop(&SPID1);
return its;
}