SPI communication

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
User17188
Level 1
Level 1
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
#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_DISABLED, 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_INDICATION) == 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_INDICATION);


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_INDICATION == 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_INDICATION);




//*******************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_INDICATION == 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_INDICATION);

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);






}
}
0 Likes
0 Replies