2025-05-14 12:57:39 -05:00
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2016, Freescale Semiconductor, Inc.
|
|
|
|
|
* Copyright 2016-2017 NXP
|
|
|
|
|
* All rights reserved.
|
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
*/
|
|
|
|
|
#include "LPC54114_cm4.h"
|
|
|
|
|
|
|
|
|
|
#include "fsl_spi.h"
|
|
|
|
|
#include "pin_mux.h"
|
|
|
|
|
#include "board.h"
|
|
|
|
|
#include "fsl_debug_console.h"
|
|
|
|
|
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
#include <stdint.h>
|
|
|
|
|
#include "spi.h"
|
2025-06-11 10:55:00 -05:00
|
|
|
#include "io.h"
|
2025-05-14 12:57:39 -05:00
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Definitions
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
#define SPI3_MASTER SPI3
|
|
|
|
|
#define SPI3_MASTER_IRQ FLEXCOMM3_IRQn
|
|
|
|
|
#define SPI3_MASTER_CLK_SRC kCLOCK_Flexcomm3
|
|
|
|
|
#define SPI3_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(3)
|
|
|
|
|
#define LCD_SPI_SSEL 1
|
|
|
|
|
#define LCD_SPI_SPOL kSPI_Spol1ActiveHigh
|
|
|
|
|
|
|
|
|
|
#define RADIO_SPI_SSEL 2
|
|
|
|
|
//#define RADIO_SPI_SPOL kSPI_Spo2ActiveAllLow
|
|
|
|
|
|
|
|
|
|
//SPI0
|
|
|
|
|
#define SPI0_MASTER SPI0
|
|
|
|
|
#define SPI0_MASTER_IRQ FLEXCOMM0_IRQn
|
|
|
|
|
#define SPI0_MASTER_CLK_SRC kCLOCK_Flexcomm0
|
|
|
|
|
#define SPI0_MASTER_CLK_FREQ CLOCK_GetFlexCommClkFreq(3) //TODO: Which clock?
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Prototypes
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Variables
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
//SPI3
|
|
|
|
|
static uint8_t SPI3_txBuff[SPI_XFER_BUFFER_SIZE];
|
|
|
|
|
static uint8_t SPI3_rxBuff[SPI_XFER_BUFFER_SIZE];
|
|
|
|
|
|
|
|
|
|
spi_master_config_t SPI3_config = {0};
|
|
|
|
|
spi_transfer_t SPI3_xfer = {0};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//SPI0
|
|
|
|
|
static uint8_t SPI0_txBuff[SPI_XFER_BUFFER_SIZE];
|
|
|
|
|
static uint8_t SPI0_rxBuff[SPI_XFER_BUFFER_SIZE];
|
|
|
|
|
|
|
|
|
|
spi_master_config_t SPI0_config = {0};
|
|
|
|
|
spi_transfer_t SPI0_xfer = {0};
|
|
|
|
|
|
|
|
|
|
uint8_t Port_State[3]; // copy of Shift register I/O expander
|
|
|
|
|
|
|
|
|
|
/*******************************************************************************
|
|
|
|
|
* Code
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SPI_Init(void)
|
|
|
|
|
{
|
|
|
|
|
// Set GP CS High
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH,SDSIGNAL); // Set SD generator high as default.
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH,SIGNAL); // Set SD generator high as default.
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH,RAMP); //
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH,AMPLITUDE); //
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH,EXPANDER); //
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH,E2PROM); //
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH,PSU_VCTRL); //
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Initializes FC3 for LCD
|
|
|
|
|
uint32_t srcFreq = 0;
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* userConfig.enableLoopback = false;
|
|
|
|
|
* userConfig.enableMaster = true;
|
|
|
|
|
* userConfig.polarity = kSPI_ClockPolarityActiveHigh;
|
|
|
|
|
* userConfig.phase = kSPI_ClockPhaseFirstEdge;
|
|
|
|
|
* userConfig.direction = kSPI_MsbFirst;
|
|
|
|
|
*
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
//SPI3: LCD and RADIO
|
|
|
|
|
SPI_MasterGetDefaultConfig(&SPI3_config);
|
|
|
|
|
srcFreq = SPI3_MASTER_CLK_FREQ;
|
|
|
|
|
SPI3_config.sselNum = (spi_ssel_t)LCD_SPI_SSEL;
|
|
|
|
|
SPI3_config.sselPol = (spi_spol_t)LCD_SPI_SPOL;
|
|
|
|
|
SPI3_config.baudRate_Bps = 500000U;
|
|
|
|
|
SPI_MasterInit(SPI3_MASTER, &SPI3_config, srcFreq);
|
|
|
|
|
|
|
|
|
|
//Link Radio
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//SPI0: other shiat
|
|
|
|
|
SPI_MasterGetDefaultConfig(&SPI0_config);
|
|
|
|
|
srcFreq = SPI0_MASTER_CLK_FREQ;
|
|
|
|
|
SPI0_config.baudRate_Bps = 500000U;
|
|
|
|
|
SPI_MasterInit(SPI0_MASTER, &SPI0_config, srcFreq);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SPI3_Test(void) //NOT USED ANYWHERE
|
|
|
|
|
{
|
|
|
|
|
/* Init Buffer*/
|
|
|
|
|
for (uint32_t i = 0; i < SPI_XFER_BUFFER_SIZE; i++)
|
|
|
|
|
{
|
|
|
|
|
SPI3_txBuff[i] = 0xAA;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
while(1)
|
|
|
|
|
{
|
|
|
|
|
GPIO_PinWrite(GPIO, 0, 6, 1);
|
|
|
|
|
SPI3_SendBytes(SPI3_txBuff, 1);
|
|
|
|
|
GPIO_PinWrite(GPIO, 0, 6, 0);
|
|
|
|
|
uint32_t keithTWPia = 1000000;
|
|
|
|
|
while(keithTWPia--);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SPI3_SendBytes(uint8_t *sendData, uint16_t numBytes)
|
|
|
|
|
{
|
|
|
|
|
uint8_t throwawayBuffer[numBytes];
|
|
|
|
|
|
|
|
|
|
//TODO: Setup userConfig to use LCD_SPI_SSEL and LCD_SPI_SPOL
|
|
|
|
|
|
|
|
|
|
/*Start Transfer*/
|
|
|
|
|
SPI3_xfer.txData = sendData;
|
|
|
|
|
SPI3_xfer.rxData = throwawayBuffer;
|
|
|
|
|
SPI3_xfer.dataSize = numBytes; //sizeof(rxBuff);
|
|
|
|
|
SPI3_xfer.configFlags = kSPI_FrameAssert;
|
|
|
|
|
|
|
|
|
|
SPI_MasterTransferBlocking(SPI3_MASTER, &SPI3_xfer);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SPI0_SendBytes(uint8_t *sendData, uint16_t numBytes, SPI_MODE_t destination) //Extra arg
|
|
|
|
|
{
|
|
|
|
|
uint8_t throwawayBuffer[numBytes];
|
|
|
|
|
|
|
|
|
|
SPI0_SetupForDDS(1, destination); //Enter DDS mode if taking to a DDS
|
|
|
|
|
|
|
|
|
|
SPI0_Chip_Select(CS_LOW, destination);
|
|
|
|
|
|
|
|
|
|
/*Start Transfer*/
|
|
|
|
|
|
|
|
|
|
SPI0_xfer.txData = sendData;
|
|
|
|
|
SPI0_xfer.rxData = throwawayBuffer;
|
|
|
|
|
SPI0_xfer.dataSize = numBytes; //sizeof(rxBuff);
|
|
|
|
|
SPI0_xfer.configFlags = kSPI_FrameAssert;
|
|
|
|
|
|
|
|
|
|
#if 1 //troubleshooting
|
|
|
|
|
status_t status = SPI_MasterTransferBlocking(SPI0_MASTER, &SPI0_xfer);
|
|
|
|
|
if(status != kStatus_Success)
|
|
|
|
|
{
|
|
|
|
|
uint32_t foo = 0;
|
|
|
|
|
foo++; //Code never gets here even when EEPROM test fails.
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
SPI_MasterTransferBlocking(SPI0_MASTER, &SPI0_xfer);
|
|
|
|
|
#endif
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH, destination);
|
|
|
|
|
|
|
|
|
|
SPI0_SetupForDDS(0, destination); //Exit DDS mode if talking to a DDS
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
* Setup SPI0 for talking to the DDS chips
|
|
|
|
|
* DDS chips require cpol = 1, normal state is cpol = 0
|
|
|
|
|
* @arg onOff 1 = enter DDS mode, 0 = exit DDS mode (return to default setup)
|
|
|
|
|
* @arg destination the device we are talking to. Use to determine if talking to a DDS
|
|
|
|
|
*/
|
|
|
|
|
void SPI0_SetupForDDS(uint32_t onOff, SPI_MODE_t destination)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
if((destination == SIGNAL) || (destination == SDSIGNAL) || (destination == RAMP)) //if talking to a DDS
|
|
|
|
|
{
|
|
|
|
|
SPI_Deinit(SPI0_MASTER);
|
|
|
|
|
|
|
|
|
|
SPI_MasterGetDefaultConfig(&SPI0_config);
|
|
|
|
|
SPI0_config.baudRate_Bps = 500000U;
|
|
|
|
|
if(onOff) //Only change required for AD9838
|
|
|
|
|
{
|
|
|
|
|
SPI0_config.polarity = kSPI_ClockPolarityActiveLow; //activeLow = 1
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SPI0_config.polarity = kSPI_ClockPolarityActiveHigh; //activeHigh = 0
|
|
|
|
|
}
|
|
|
|
|
SPI_MasterInit(SPI0_MASTER, &SPI0_config, SPI0_MASTER_CLK_FREQ);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*void SPI0_SendBytes(uint8_t *sendData, uint16_t numBytes, SPI_MODE_t destination) //Extra arg
|
|
|
|
|
{
|
|
|
|
|
uint8_t throwawayBuffer[numBytes];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SPI0_Chip_Select(CS_LOW, destination);
|
|
|
|
|
|
|
|
|
|
/*Start Transfer
|
|
|
|
|
|
|
|
|
|
SPI0_xfer.txData = sendData;
|
|
|
|
|
SPI0_xfer.rxData = throwawayBuffer;
|
|
|
|
|
SPI0_xfer.dataSize = numBytes; //sizeof(rxBuff);
|
|
|
|
|
SPI0_xfer.configFlags = kSPI_FrameAssert;
|
|
|
|
|
|
|
|
|
|
#if 1 //troubleshooting
|
|
|
|
|
status_t status = SPI_MasterTransferBlocking(SPI0_MASTER, &SPI0_xfer);
|
|
|
|
|
if(status != kStatus_Success)
|
|
|
|
|
{
|
|
|
|
|
uint32_t foo = 0;
|
|
|
|
|
foo++; //Code never gets here even when EEPROM test fails.
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
SPI_MasterTransferBlocking(SPI0_MASTER, &SPI0_xfer);
|
|
|
|
|
#endif
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH, destination);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
void SPI0_SendPotData(uint16_t *sendData, uint16_t numWords, SPI_MODE_t destination) //Extra arg
|
|
|
|
|
{
|
|
|
|
|
uint16_t throwawayBuffer[numWords];
|
|
|
|
|
|
|
|
|
|
// Reconfigure SPI to 10 bits
|
|
|
|
|
SPI0_config.dataWidth = kSPI_Data10Bits;
|
|
|
|
|
SPI_MasterInit(SPI0_MASTER, &SPI0_config, SPI3_MASTER_CLK_FREQ);
|
|
|
|
|
|
|
|
|
|
SPI0_Chip_Select(CS_LOW, destination);
|
|
|
|
|
|
|
|
|
|
//Start Transfer
|
|
|
|
|
SPI0_xfer.txData = sendData;
|
|
|
|
|
SPI0_xfer.rxData = throwawayBuffer;
|
|
|
|
|
SPI0_xfer.dataSize = numWords; //sizeof(rxBuff);
|
|
|
|
|
SPI0_xfer.configFlags = kSPI_FrameAssert;
|
|
|
|
|
|
|
|
|
|
SPI_MasterTransferBlocking(SPI0_MASTER, &SPI0_xfer);
|
|
|
|
|
|
|
|
|
|
SPI0_Chip_Select(CS_HIGH, destination);
|
|
|
|
|
|
|
|
|
|
// Return SPI to normal bit length.
|
|
|
|
|
SPI0_config.dataWidth = kSPI_Data8Bits;
|
|
|
|
|
SPI_MasterInit(SPI0_MASTER, &SPI0_config, SPI3_MASTER_CLK_FREQ);
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
void SPI0_Chip_Select(uint8_t state, SPI_MODE_t destination)
|
|
|
|
|
{
|
|
|
|
|
|
2025-06-11 10:55:00 -05:00
|
|
|
switch(destination)
|
|
|
|
|
{
|
|
|
|
|
case SIGNAL:
|
|
|
|
|
|
|
|
|
|
GPIO_WRITE(PIN_SIG_CS, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case SDSIGNAL:
|
|
|
|
|
GPIO_WRITE(PIN_SD_CS, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case BOTH_SIGNAL:
|
|
|
|
|
GPIO_WRITE(PIN_SIG_CS, state);
|
|
|
|
|
GPIO_WRITE(PIN_SD_CS, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case RAMP:
|
|
|
|
|
GPIO_WRITE(PIN_RAMP_CS, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case AMPLITUDE:
|
|
|
|
|
GPIO_WRITE(PIN_POT_CS, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case EXPANDER:
|
|
|
|
|
GPIO_WRITE(PIN_PORT_LE_CS, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case E2PROM:
|
|
|
|
|
GPIO_WRITE(PIN_EEP_CS, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PSU_VCTRL:
|
|
|
|
|
GPIO_WRITE(PIN_POT_CS2, state);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
2025-05-14 12:57:39 -05:00
|
|
|
}
|