Advanced Distributed Systems module at HSLU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

153 lines
4.8 KiB

/*
* Copyright (c) 2022, Erich Styger
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "McuSPI.h"
#if MCUSPI_CONFIG_HW_TEMPLATE!=MCUSPI_CONFIG_HW_TEMPLATE_NONE
#include "McuLib.h"
#if McuLib_CONFIG_CPU_IS_KINETIS
#include "fsl_dspi.h"
#elif McuLib_CONFIG_CPU_IS_LPC55xx
#include "fsl_spi.h"
#endif
#include "McuGPIO.h"
static McuGPIO_Handle_t McuSPI_CSpin;
int McuSPI_SendReceiveBlock(const uint8_t *txDataBuf, uint8_t *rxDataBuf, size_t dataSize) {
#if MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI1
dspi_transfer_t masterXfer;
status_t status;
/* Start master transfer, send data to slave */
masterXfer.txData = (uint8_t*)txDataBuf;
masterXfer.rxData = rxDataBuf;
masterXfer.dataSize = dataSize;
masterXfer.configFlags = kDSPI_MasterCtar0 | MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_TRANSFER | kDSPI_MasterPcsContinuous;
status = DSPI_MasterTransferBlocking(MCUSPI_CONFIG_HW_SPI_MASTER, &masterXfer);
if (status==kStatus_Success) {
return 0; /* ok */
}
return -1; /* error */
#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_LPC55S16_FC3
status_t status;
spi_transfer_t xfer;
/*Start Transfer*/
xfer.txData = (uint8_t*)txDataBuf;;
xfer.rxData = rxDataBuf;
xfer.dataSize = dataSize;
xfer.configFlags = kSPI_FrameAssert;
status = SPI_MasterTransferBlocking(MCUSPI_CONFIG_HW_SPI_MASTER, &xfer);
if (status==kStatus_Success) {
return 0; /* ok */
}
return -1; /* error */
#else
return -1; /* error */
#endif
}
int McuSPI_SendByte(unsigned char ch) {
return McuSPI_SendReceiveBlock(&ch, NULL, 1);
}
int McuSPI_SendReceiveByte(unsigned char ch, unsigned char *chp) {
return McuSPI_SendReceiveBlock(&ch, chp, 1);
}
int McuSPI_ReceiveByte(unsigned char *chp) {
return McuSPI_SendReceiveBlock(NULL, chp, 1);
}
#if 0
static void McuSPI_Test(void) {
uint8_t tx = 'A';
uint8_t rx;
int res;
McuGPIO_SetLow(McuSPI_CSpin);
McuGPIO_SetHigh(McuSPI_CSpin);
res = McuSPI_SendReceiveBlock(&tx, &rx, sizeof(tx));
if (res!=0) {
for(;;) { /* error */ }
}
}
#endif
void McuSPI_SetCS_Low(void) {
McuGPIO_SetLow(McuSPI_CSpin);
}
void McuSPI_SetCS_High(void) {
McuGPIO_SetHigh(McuSPI_CSpin);
}
static void McuSPI_InitCS(void) {
McuGPIO_Config_t config;
MCUSPI_CONFIG_HW_CS_INIT();
McuGPIO_GetDefaultConfig(&config);
config.hw.gpio = MCUSPI_CONFIG_HW_CS_GPIO;
config.hw.port = MCUSPI_CONFIG_HW_CS_PORT;
config.hw.pin = MCUSPI_CONFIG_HW_CS_PIN;
config.isInput = false;
config.isHighOnInit = true; /* CS is LOW active */
McuSPI_CSpin = McuGPIO_InitGPIO(&config);
if (McuSPI_CSpin==NULL) {
for(;;) {} /* error */
}
}
void McuSPI_Init(void) {
McuSPI_InitCS();
#if MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_KINETIS_K22_SPI1
dspi_master_config_t masterConfig;
uint32_t srcClock_Hz;
/* Master config */
masterConfig.whichCtar = kDSPI_Ctar0;
masterConfig.ctarConfig.baudRate = MCUSPI_CONFIG_TRANSFER_BAUDRATE;
masterConfig.ctarConfig.bitsPerFrame = 8U;
masterConfig.ctarConfig.cpol = kDSPI_ClockPolarityActiveHigh;
masterConfig.ctarConfig.cpha = kDSPI_ClockPhaseFirstEdge;
masterConfig.ctarConfig.direction = kDSPI_MsbFirst;
masterConfig.ctarConfig.pcsToSckDelayInNanoSec = 1000000000U / MCUSPI_CONFIG_TRANSFER_BAUDRATE;
masterConfig.ctarConfig.lastSckToPcsDelayInNanoSec = 1000000000U / MCUSPI_CONFIG_TRANSFER_BAUDRATE;
masterConfig.ctarConfig.betweenTransferDelayInNanoSec = 1000000000U / MCUSPI_CONFIG_TRANSFER_BAUDRATE;
masterConfig.whichPcs = MCUSPI_CONFIG_HW_SPI_MASTER_PCS_FOR_INIT;
masterConfig.pcsActiveHighOrLow = kDSPI_PcsActiveLow;
masterConfig.enableContinuousSCK = false;
masterConfig.enableRxFifoOverWrite = false;
masterConfig.enableModifiedTimingFormat = false;
masterConfig.samplePoint = kDSPI_SckToSin0Clock;
srcClock_Hz = MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ;
DSPI_MasterInit(MCUSPI_CONFIG_HW_SPI_MASTER, &masterConfig, srcClock_Hz);
#elif MCUSPI_CONFIG_HW_TEMPLATE==MCUSPI_CONFIG_HW_TEMPLATE_LPC55S16_FC3
spi_master_config_t userConfig = {0};
uint32_t srcFreq = 0;
status_t status;
MCUSPI_CONFIG_HW_SPI_INIT();
SPI_MasterGetDefaultConfig(&userConfig);
srcFreq = MCUSPI_CONFIG_HW_SPI_MASTER_CLK_FREQ;
userConfig.sselNum = (spi_ssel_t)MCUSPI_CONFIG_HW_SPI_SSEL;
userConfig.sselPol = (spi_spol_t)MCUSPI_CONFIG_HW_SPI_SPOL;
userConfig.baudRate_Bps = MCUSPI_CONFIG_TRANSFER_BAUDRATE;
status = SPI_MasterInit(MCUSPI_CONFIG_HW_SPI_MASTER, &userConfig, srcFreq);
if (status!=kStatus_Success) {
for(;;) { /* error */ }
}
#endif
#if 0
McuSPI_Test();
#endif
}
#endif /* #if MCUSPI_CONFIG_HW_TEMPLATE */