i am trying to communicate using one mcxc242 board as master and other mcxc242 board as slave using spi_polling_b2b_trnsfer master slave code i am not able to send string from slave to master , master only received one byte
master code :
/// MASTER CODE
#include "fsl_spi.h"
#include "fsl_gpio.h"
#include "fsl_port.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include <string.h>
#define EXAMPLE_SPI_MASTER SPI1
#define EXAMPLE_SPI_MASTER_CLK_SRC kCLOCK_BusClk
#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(kCLOCK_BusClk)
#define SPI_CS_PORT PORTD
#define SPI_CS_GPIO GPIOD
#define SPI_CS_PIN 4U
void spi_cs_init(void)
{
CLOCK_EnableClock(kCLOCK_PortD);
PORT_SetPinMux(SPI_CS_PORT, SPI_CS_PIN, kPORT_MuxAsGpio);
gpio_pin_config_t cs_config = {kGPIO_DigitalOutput, 1};
GPIO_PinInit(SPI_CS_GPIO, SPI_CS_PIN, &cs_config);
GPIO_PinWrite(SPI_CS_GPIO, SPI_CS_PIN, 1); // CS HIGH (idle)
}
void spi_cs_low(void) {
GPIO_PinWrite(SPI_CS_GPIO, SPI_CS_PIN, 0);
}
void spi_cs_high(void) {
GPIO_PinWrite(SPI_CS_GPIO, SPI_CS_PIN, 1);
}
int main(void)
{
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
spi_cs_init();
PRINTF("SPI Master Started - Sending Data\n");
spi_master_config_t masterConfig;
SPI_MasterGetDefaultConfig(&masterConfig);
SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, EXAMPLE_SPI_MASTER_CLK_FREQ);
for (int i = 0; i < 2; i++) {
uint8_t txChar[14] = "GOOD MORNING";
spi_transfer_t xferSend = {
.txData = txChar,
.rxData = NULL,
.dataSize = 14,
};
spi_cs_low();
SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xferSend);
spi_cs_high();
PRINTF("Sent string: %s\n", txChar);
SDK_DelayAtLeastUs(100000, CLOCK_GetFreq(kCLOCK_CoreSysClk));
uint8_t rxBuffer[12] = {0};
uint8_t dummyTx[11];
memset(dummyTx, 0xFF, sizeof(dummyTx));
spi_transfer_t xferRecv = {
.txData = dummyTx,
.rxData = rxBuffer,
.dataSize = 11,
};
spi_cs_low();
SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xferRecv);
spi_cs_high();
rxBuffer[11] = '\0';
PRINTF("Received from slave: %s\n", rxBuffer);
}
while (1) {}
}
SLAVE CODE:
#include "fsl_spi.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include <string.h>
#define EXAMPLE_SPI_SLAVE SPI1
#define MESSAGE_SIZE 13
#define BUFFER_SIZE (MESSAGE_SIZE + 1)
int main(void)
{
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
PRINTF("SPI Slave Continuous RX (Polling)\n");
spi_slave_config_t slaveConfig;
SPI_SlaveGetDefaultConfig(&slaveConfig);
SPI_SlaveInit(EXAMPLE_SPI_SLAVE, &slaveConfig);
uint8_t rxBuffer[BUFFER_SIZE];
while (1)
{
memset(rxBuffer, 0, sizeof(rxBuffer));
for (int i = 0; i < MESSAGE_SIZE; i++) {
while (!(SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_RxBufferFullFlag)) {}
rxBuffer[i] = SPI_ReadData(EXAMPLE_SPI_SLAVE);
}
rxBuffer[MESSAGE_SIZE] = '\0';
PRINTF("Received: %s\r\n", rxBuffer);
if (strcmp((char*)rxBuffer, "HELLO AMBIMAT") == 0) {
char reply[] = "HOW ARE YOU";
for (int i = 0; i < strlen(reply); i++) {
while (!(SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_TxBufferEmptyFlag)) {}
SPI_WriteData(EXAMPLE_SPI_SLAVE, reply[i]);
// Wait for dummy read from master
while (!(SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_RxBufferFullFlag)) {}
(void)SPI_ReadData(EXAMPLE_SPI_SLAVE);
}
PRINTF("Sent response: %s\r\n", reply);
}
SDK_DelayAtLeastUs(1000000, CLOCK_GetFreq(kCLOCK_CoreSysClk));
}
}
Hello @ravicha ,
Thanks for your post. You mentioned that " i am not able to send string from slave to master , master only received one byte". I am not clear about that. Could you please help to provide some captures to help me better understand it.
Have a nice day.
Celeste
thanks @Celeste_Liu for your reply, given code by you if fine here i want send whole string from master to slave and recieved whole string from slave to master for example if master send "hello good morning" to slave then slave have to send "hi good morning" .
problem is we have to send char by char cant send whole string at a time.
SPI can only transfer binary data (byte streams). You can first convert the string into a byte array (such as UTF-8 or ASCII encoding).
Hey @Celeste_Liu glad to have your reply.
master code:
#include "fsl_spi.h"
#include "fsl_gpio.h"
#include "fsl_port.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include <string.h>
#define EXAMPLE_SPI_MASTER SPI1
#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(kCLOCK_BusClk)
#define SPI_CS_PORT PORTD
#define SPI_CS_GPIO GPIOD
#define SPI_CS_PIN 4U
void spi_cs_init(void)
{
CLOCK_EnableClock(kCLOCK_PortD);
PORT_SetPinMux(SPI_CS_PORT, SPI_CS_PIN, kPORT_MuxAsGpio);
gpio_pin_config_t cs_config = {kGPIO_DigitalOutput, 1};
GPIO_PinInit(SPI_CS_GPIO, SPI_CS_PIN, &cs_config);
GPIO_PinWrite(SPI_CS_GPIO, SPI_CS_PIN, 1); // CS High (idle)
}
void spi_cs_low(void) { GPIO_PinWrite(SPI_CS_GPIO, SPI_CS_PIN, 0); }
void spi_cs_high(void) { GPIO_PinWrite(SPI_CS_GPIO, SPI_CS_PIN, 1); }
int main(void)
{
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
spi_cs_init();
PRINTF("SPI Master Full-Duplex Transfer\n");
spi_master_config_t masterConfig;
SPI_MasterGetDefaultConfig(&masterConfig);
SPI_MasterInit(EXAMPLE_SPI_MASTER, &masterConfig, EXAMPLE_SPI_MASTER_CLK_FREQ);
uint8_t txData[2] = {0x0A, 0x0B};
uint8_t rxData[2] = {0};
spi_transfer_t xfer = {
.txData = txData,
.rxData = rxData,
.dataSize = 2
};
spi_cs_low();
SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xfer);
spi_cs_high();
PRINTF("Sent to slave: ");
for (int i = 0; i < 2; i++) PRINTF("%02X ", txData[i]);
PRINTF("\n");
PRINTF("Received from slave: ");
for (int i = 0; i < 2; i++) PRINTF("%02X ", rxData[i]);
PRINTF("\n");
while (1);
}
slave code :
#include "fsl_spi.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include <string.h>
#define EXAMPLE_SPI_SLAVE SPI1
#define TRANSFER_SIZE 2
int main(void)
{
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
PRINTF("SPI Slave Ready\n");
spi_slave_config_t slaveConfig;
SPI_SlaveGetDefaultConfig(&slaveConfig);
SPI_SlaveInit(EXAMPLE_SPI_SLAVE, &slaveConfig);
uint8_t txData[TRANSFER_SIZE] = {0xAA, 0xBB};
uint8_t rxData[TRANSFER_SIZE] = {0};
// preload response into TX FIFO
for (int i = 0; i < TRANSFER_SIZE; i++) {
while (!(SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_TxBufferEmptyFlag)) {}
SPI_WriteData(EXAMPLE_SPI_SLAVE, txData[i]);
}
// wait and read incoming data
for (int i = 0; i < TRANSFER_SIZE; i++) {
while (!(SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_RxBufferFullFlag)) {}
rxData[i] = SPI_ReadData(EXAMPLE_SPI_SLAVE);
}
PRINTF("Received from master: ");
for (int i = 0; i < TRANSFER_SIZE; i++) PRINTF("%02X ", rxData[i]);
PRINTF("\n");
while (1);
}
here i am trying to send two byte from master to slave and want slave respond two byte back but
master send proper two byte but slave didnt recieve anything and from slave side master able to
get one byte only.
Hello @ravicha ,
Is the following picture what you want to achieve?
Please see my code below:
master code:
#include "fsl_spi.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include <string.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define EXAMPLE_SPI_MASTER SPI1
#define EXAMPLE_SPI_MASTER_SOURCE_CLOCK kCLOCK_BusClk
#define EXAMPLE_SPI_MASTER_CLK_FREQ CLOCK_GetFreq(kCLOCK_BusClk)
void spi_cs_low(void) { GPIO_PinWrite(GPIOD, 4U, 0); }
void spi_cs_high(void) { GPIO_PinWrite(GPIOD, 4U, 1); }
int main(void)
{
spi_master_config_t userConfig = {0};
uint32_t srcFreq = 0;
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
gpio_pin_config_t cs_config = {kGPIO_DigitalOutput, 1};
GPIO_PinInit(GPIOD, 4u, &cs_config);
spi_cs_high();
PRINTF("\n\rMaster Start...\n\r");
SPI_MasterGetDefaultConfig(&userConfig);
srcFreq = EXAMPLE_SPI_MASTER_CLK_FREQ;
SPI_MasterInit(EXAMPLE_SPI_MASTER, &userConfig, srcFreq);
uint8_t txData[2] = {0x0A, 0x0B};
uint8_t rxData[2] = {0};
spi_transfer_t xfer = {
.txData = txData,
.rxData = rxData,
.dataSize = 2
};
spi_cs_low();
SPI_MasterTransferBlocking(EXAMPLE_SPI_MASTER, &xfer);
spi_cs_high();
PRINTF("Sent to slave: ");
for (int i = 0; i < 2; i++) PRINTF("%02X ", txData[i]);
PRINTF("\n");
PRINTF("Received from slave: ");
for (int i = 0; i < 2; i++) PRINTF("%02X ", rxData[i]);
PRINTF("\n");
while (1);
{
}
}
slave code:
#include "fsl_spi.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
#include "fsl_debug_console.h"
#include <string.h>
/*******************************************************************************
* Definitions
******************************************************************************/
#define EXAMPLE_SPI_SLAVE SPI1
#define TRANSFER_SIZE 2
int main(void)
{
spi_slave_config_t userConfig;
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
PRINTF("\n\rSlave is working....\n\r");
SPI_SlaveGetDefaultConfig(&userConfig);
SPI_SlaveInit(EXAMPLE_SPI_SLAVE, &userConfig);
uint8_t txData[TRANSFER_SIZE] = {0xAA, 0xBB};
uint8_t rxData[TRANSFER_SIZE] = {0};
for (int i = 0; i < TRANSFER_SIZE; i++) {
while (!(SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_TxBufferEmptyFlag));
SPI_WriteData(EXAMPLE_SPI_SLAVE, txData[i]);
}
for (int i = 0; i < TRANSFER_SIZE; i++) {
while (!(SPI_GetStatusFlags(EXAMPLE_SPI_SLAVE) & kSPI_TxBufferEmptyFlag)) {}
rxData[i] = SPI_ReadData(EXAMPLE_SPI_SLAVE);
}
PRINTF("Received from master: ");
for (int i = 0; i < TRANSFER_SIZE; i++) PRINTF("%02X ", rxData[i]);
PRINTF("\n");
while (1)
{
}
}
BRs,
Celeste