30#if HAL_USE_SPI || defined(__DOXYGEN__)
41#if KINETIS_SPI_USE_SPI0 || defined(__DOXYGEN__)
46#if KINETIS_SPI_USE_SPI1 || defined(__DOXYGEN__)
61 if (ssport == GPIOA) {
70 }
else if (ssport == GPIOB) {
79 }
else if (ssport == GPIOD && sspad == 3) {
81 }
else if (ssport == GPIOE && sspad == 6) {
91 static const int baudRates[] = { 21000000, 10500000, 5250000, 2626000, 1312500, 656250, 328125, 164060 };
93 if (spip->config->cr1 & SPI_CR1_BR_0)
95 if (spip->config->cr1 & SPI_CR1_BR_1)
97 if (spip->config->cr1 & SPI_CR1_BR_2)
112 SPIDriver *spi = (SPIDriver *)userData;
120 SPIDriver *spi = (SPIDriver *)userData;
136#if KINETIS_SPI_USE_SPI0
137 spiObjectInit(&
SPID1);
139#if KINETIS_SPI_USE_SPI1
140 spiObjectInit(&
SPID2);
154 if (spip->state == SPI_STOP) {
156#if KINETIS_SPI_USE_SPI0
157 if (&
SPID1 == spip) {
163#if KINETIS_SPI_USE_SPI1
164 if (&
SPID2 == spip) {
170 spip->isMaster = (spip->config->cr1 & SPI_CR1_MSTR) != 0;
173 int pcsIdx =
spi_detectPCS(spip->isMaster, spip->config->ssport, spip->config->sspad, &pcsAlt);
175 spip->flags |= pcsIdx;
177 palSetPadMode(spip->config->ssport, spip->config->sspad, PAL_MODE_ALTERNATE(pcsAlt));
180 palSetPadMode(spip->config->ssport, spip->config->sspad, PAL_MODE_OUTPUT_OPENDRAIN);
185 if (spip->isMaster) {
191 masterConfig.
bitsPerFrame = (spip->config->cr1 & SPI_CR1_DFF) ? 16 : 8;
202 if (spip->config->circular)
233 if (spip->state == SPI_READY) {
237#if KINETIS_SPI_USE_SPI0
238 if (&
SPID1 == spip) {
243#if KINETIS_SPI_USE_SPI1
244 if (&
SPID2 == spip) {
260 if (!(spip->flags & LPSPI_MASTER_PCS_MASK))
261 palClearPad(spip->config->ssport, spip->config->sspad);
274 if (!(spip->flags & LPSPI_MASTER_PCS_MASK))
275 palSetPad(spip->config->ssport, spip->config->sspad);
315 const void *txbuf,
void *rxbuf) {
316 spip->handleXfer.txData = (uint8_t *)txbuf;
317 spip->handleXfer.rxData = rxbuf;
318 spip->handleXfer.dataSize = n;
319 spip->handleXfer.configFlags = spip->flags;
321 if (spip->isMaster) {
343 spip->handleXfer.txData = (uint8_t *)txbuf;
344 spip->handleXfer.rxData = NULL;
345 spip->handleXfer.dataSize = n;
346 spip->handleXfer.configFlags = spip->flags;
348 if (spip->isMaster) {
370 spip->handleXfer.txData = NULL;
371 spip->handleXfer.rxData = (uint8_t *)rxbuf;
372 spip->handleXfer.dataSize = n;
373 spip->handleXfer.configFlags = spip->flags;
375 if (spip->isMaster) {
382#if (SPI_SUPPORTS_CIRCULAR == TRUE) || defined(__DOXYGEN__)
394 dmaStreamDisable(spip->dmatx);
395 dmaStreamDisable(spip->dmarx);
414 uint16_t rxFrame = 0;
415 spip->handleXfer.txData = (uint8_t *)&frame;
416 spip->handleXfer.rxData = (uint8_t *)&rxFrame;
417 spip->handleXfer.dataSize =
sizeof(frame);
418 spip->handleXfer.configFlags = spip->flags;
420 if (spip->isMaster) {
static const struct @5 baudRates[]
GPIO_TypeDef * ioportid_t
Port Identifier.
void spi_lld_ignore(SPIDriver *spip, size_t n)
Ignores data on the SPI bus.
static int32_t spi_detectBaudRate(SPIDriver *spip)
SPIDriver SPID1
SPI0 driver identifier.
void spi_lld_slave_callback(LPSPI_Type *base, lpspi_slave_handle_t *handle, status_t status, void *userData)
void spi_lld_abort(SPIDriver *spip)
Aborts the ongoing SPI operation, if any.
void spi_lld_select(SPIDriver *spip)
Asserts the slave select signal and prepares for transfers.
void spi_lld_receive(SPIDriver *spip, size_t n, void *rxbuf)
Receives data from the SPI bus.
void spi_lld_init(void)
Low level SPI driver initialization.
void spi_lld_exchange(SPIDriver *spip, size_t n, const void *txbuf, void *rxbuf)
Exchanges data on the SPI bus.
void spi_lld_stop(SPIDriver *spip)
Deactivates the SPI peripheral.
void spi_lld_master_callback(LPSPI_Type *base, lpspi_master_handle_t *handle, status_t status, void *userData)
void spi_lld_send(SPIDriver *spip, size_t n, const void *txbuf)
Sends data over the SPI bus.
static int32_t spi_detectPCS(bool isMaster, ioportid_t ssport, uint16_t sspad, int *alt)
uint16_t spi_lld_polled_exchange(SPIDriver *spip, uint16_t frame)
Exchanges one frame using a polled wait.
void spi_lld_start(SPIDriver *spip)
Configures and activates the SPI peripheral.
SPIDriver SPID2
SPI1 driver identifier.
void spi_lld_unselect(SPIDriver *spip)
Deasserts the slave select signal.
enum _clock_ip_name clock_ip_name_t
Peripheral clock name difinition used for clock gate, clock source and clock divider setting....
uint32_t CLOCK_GetIpFreq(clock_ip_name_t name)
Gets the clock frequency for a specific IP module.
int32_t status_t
Type used for all status and error return values.
void LPSPI_MasterInit(LPSPI_Type *base, const lpspi_master_config_t *masterConfig, uint32_t srcClock_Hz)
Initializes the LPSPI master.
void LPSPI_SlaveInit(LPSPI_Type *base, const lpspi_slave_config_t *slaveConfig)
LPSPI slave configuration.
status_t LPSPI_SlaveTransferNonBlocking(LPSPI_Type *base, lpspi_slave_handle_t *handle, lpspi_transfer_t *transfer)
LPSPI slave transfer data using an interrupt method.
void LPSPI_SlaveGetDefaultConfig(lpspi_slave_config_t *slaveConfig)
Sets the lpspi_slave_config_t structure to default values.
status_t LPSPI_MasterTransferBlocking(LPSPI_Type *base, lpspi_transfer_t *transfer)
LPSPI master transfer data using a polling method.
void LPSPI_SlaveTransferCreateHandle(LPSPI_Type *base, lpspi_slave_handle_t *handle, lpspi_slave_transfer_callback_t callback, void *userData)
Initializes the LPSPI slave handle.
status_t LPSPI_MasterTransferNonBlocking(LPSPI_Type *base, lpspi_master_handle_t *handle, lpspi_transfer_t *transfer)
LPSPI master transfer data using an interrupt method.
void LPSPI_MasterTransferCreateHandle(LPSPI_Type *base, lpspi_master_handle_t *handle, lpspi_master_transfer_callback_t callback, void *userData)
Initializes the LPSPI master handle.
void LPSPI_Deinit(LPSPI_Type *base)
De-initializes the LPSPI peripheral. Call this API to disable the LPSPI clock.
void LPSPI_MasterGetDefaultConfig(lpspi_master_config_t *masterConfig)
Sets the lpspi_master_config_t structure to default values.
@ kLPSPI_MasterPcsContinuous
@ kLPSPI_ClockPolarityActiveHigh
@ kLPSPI_ClockPolarityActiveLow
@ kLPSPI_ClockPhaseFirstEdge
@ kLPSPI_ClockPhaseSecondEdge
LPSPI master configuration structure.
lpspi_shift_direction_t direction
uint32_t betweenTransferDelayInNanoSec
uint32_t lastSckToPcsDelayInNanoSec
lpspi_which_pcs_t whichPcs
uint32_t pcsToSckDelayInNanoSec
lpspi_clock_polarity_t cpol
LPSPI master transfer handle structure used for transactional API.
LPSPI slave configuration structure.
LPSPI slave transfer handle structure used for transactional API.