Hi all!
I'm using the XMC4800 Relax Kit V1 and i'm trying to communicate with the N25q032 flash memory using USIC functions (i don't want to use the SPI_MASTER Dave app).
I want to send the WriteEnable command to the flash and read its status (2 if it's right)..
I'm new to Dave, so i can't understand what should i add to my code to make it work...any help will be appreciated!
Here my code:
#include <Dave.h>
#include "xmc_spi.h"
#include "xmc_gpio.h"
#define SPI_MISO P4_6
#define SPI_MOSI P4_7
#define SPI_SCLK P4_2
#define SPI_SS P4_3
const XMC_SPI_CH_CONFIG_t spi_config =
{
.baudrate = 10000000,
.bus_mode = XMC_SPI_CH_BUS_MODE_MASTER,
.parity_mode = XMC_USIC_CH_PARITY_MODE_NONE
};
int main(void)
{
uint16_t tmp;
XMC_GPIO_CONFIG_t gpio_config;
XMC_SPI_CH_Init(XMC_SPI2_CH1, &spi_config);
gpio_config.mode = XMC_GPIO_MODE_INPUT_TRISTATE;
XMC_GPIO_Init(SPI_MISO, &gpio_config);
XMC_SPI_CH_SetInputSource(XMC_SPI2_CH1, XMC_SPI_CH_INPUT_DIN0, USIC2_C1_DX0_P4_6);
XMC_SPI_CH_SetWordLength(XMC_SPI2_CH1, 8);
XMC_SPI_CH_SetFrameLength(XMC_SPI2_CH1, 8);
XMC_SPI_CH_ConfigureShiftClockOutput(XMC_SPI2_CH1, XMC_SPI_CH_BRG_SHIFT_CLOCK_PASSIVE_LEVEL_1_DELAY_D ISABLED, XMC_SPI_CH_BRG_SHIFT_CLOCK_OUTPUT_SCLK); // CPOL=1, CPHA=0
XMC_SPI_CH_Start(XMC_SPI2_CH1);
gpio_config.output_level = XMC_GPIO_OUTPUT_LEVEL_HIGH;
gpio_config.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL;
XMC_GPIO_Init(SPI_SS, &gpio_config);
gpio_config.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL | P4_7_AF_U2C1_DOUT0;
XMC_GPIO_Init(SPI_MOSI, &gpio_config);
gpio_config.mode = XMC_GPIO_MODE_OUTPUT_PUSH_PULL | P4_2_AF_U2C1_SCLKOUT;
XMC_GPIO_Init(SPI_SCLK, &gpio_config);
while(1U)
{
XMC_GPIO_SetOutputLow(SPI_SS);
XMC_SPI_CH_EnableSlaveSelect(XMC_SPI2_CH1, XMC_SPI_CH_SLAVE_SELECT_0);
XMC_SPI_CH_SetTransmitMode(XMC_SPI2_CH1, XMC_SPI_CH_MODE_STANDARD);
XMC_SPI_CH_Transmit(XMC_SPI2_CH1, 0x06, XMC_SPI_CH_MODE_STANDARD);
//Wait till the byte has been transmitted
while((XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) & XMC_SPI_CH_STATUS_FLAG_TRANSMIT_SHIFT_INDICATION) == 0U);
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_TRANSMIT_SHIFT_INDICATION);
while(((XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) & XMC_SPI_CH_STATUS_FLAG_RECEIVE_INDICATION) == 0U) && ((XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) & XMC_SPI_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICAT ION) == 0U));
XMC_SPI_CH_DisableSlaveSelect(XMC_SPI2_CH1);
XMC_GPIO_SetOutputHigh(SPI_SS);
XMC_GPIO_SetOutputLow(SPI_SS);
XMC_SPI_CH_EnableSlaveSelect(XMC_SPI2_CH1, XMC_SPI_CH_SLAVE_SELECT_0);
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_RECEIVE_INDICATION);
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICAT ION);
XMC_SPI_CH_SetTransmitMode(XMC_SPI2_CH1, XMC_SPI_CH_MODE_STANDARD);
XMC_SPI_CH_Transmit(XMC_SPI2_CH1, 0x05, XMC_SPI_CH_MODE_STANDARD);
//Wait till the byte has been transmitted
while((XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) & XMC_SPI_CH_STATUS_FLAG_TRANSMIT_SHIFT_INDICATION) == 0U);
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_TRANSMIT_SHIFT_INDICATION);
while((XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) && XMC_SPI_CH_STATUS_FLAG_RECEIVE_INDICATION == 0U) && (XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) && XMC_SPI_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICAT ION == 0U));
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_RECEIVE_INDICATION);
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICAT ION);
//*******************receive********************
XMC_SPI_CH_Receive(XMC_SPI2_CH1, XMC_SPI_CH_MODE_STANDARD);
while((XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) && XMC_SPI_CH_STATUS_FLAG_RECEIVE_INDICATION == 0U) && (XMC_SPI_CH_GetStatusFlag(XMC_SPI2_CH1) && XMC_SPI_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICAT ION == 0U));
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_RECEIVE_INDICATION);
XMC_SPI_CH_ClearStatusFlag(XMC_SPI2_CH1, XMC_SPI_CH_STATUS_FLAG_ALTERNATIVE_RECEIVE_INDICAT ION);
tmp = XMC_SPI_CH_GetReceivedData(XMC_SPI2_CH1);
XMC_SPI_CH_DisableSlaveSelect(XMC_SPI2_CH1);
XMC_GPIO_SetOutputHigh(SPI_SS);
if(tmp == 0x0002)
DIGITAL_IO_SetOutputHigh(&led);
else
DIGITAL_IO_SetOutputLow(&led);
}
}