SPI on mcxc242

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

SPI on mcxc242

715 次查看
ravicha
Contributor II

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

 

 

 

 

0 项奖励
回复
6 回复数

568 次查看
Ricksosal
Contributor I

Thank you for sharing. Pako highway

0 项奖励
回复

697 次查看
Celeste_Liu
NXP Employee
NXP Employee

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

 

0 项奖励
回复

607 次查看
ravicha
Contributor II

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.

0 项奖励
回复

550 次查看
Celeste_Liu
NXP Employee
NXP Employee

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

0 项奖励
回复

677 次查看
ravicha
Contributor II

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


ravicha_0-1749814649692.png

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.

标记 (1)
0 项奖励
回复

620 次查看
Celeste_Liu
NXP Employee
NXP Employee

Hello @ravicha ,

Is the following picture what you want to achieve?

Celeste_Liu_0-1750060223392.png

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

0 项奖励
回复