Dear Community,
I am currently working on SPI communication between an IMXRT1064 EVK (configured as the slave) and a SAMA5D4 (configured as the master). On the IMXRT1064, I am using LPSPI1 with the following pin configurations:
When connecting the wires as follows:
The slave only receives and prints 5 zeros (0x00) as output, even though the master is sending 5 bytes (1, 2, 3, 4, 5). Similarly, when the slave sends the same sequence (1, 2, 3, 4, 5) to the master, the master receives only zeros (0x00).
However, if I modify the connections as follows:
The slave correctly receives the data (1, 2, 3, 4, 5) from the master. But, if I additionally connect the master’s MISO pin to the slave’s MOSI pin, the data becomes corrupted on both ends, and neither the master nor the slave receives the correct values.
I suspect there might be an issue with the LPSPI clock configuration on the IMXRT1064. The clock frequency seems to remain fixed at 600 MHz, even when I change the clock divider value. I am unsure whether the LPSPI clock is enabled properly.
For reference, I have attached the relevant code below. I would appreciate any insights or suggestions to resolve this issue as soon as possible.
Code:
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "fsl_lpspi.h"
#include "pin_mux.h"
#include "board.h"
#include "fsl_common.h"
#if ((defined FSL_FEATURE_SOC_INTMUX_COUNT) && (FSL_FEATURE_SOC_INTMUX_COUNT))
#include "fsl_intmux.h"
#endif
/*******************************************************************************
* Definitions
******************************************************************************/
/* Slave related */
#define EXAMPLE_LPSPI_SLAVE_BASEADDR (LPSPI1)
#define EXAMPLE_LPSPI_SLAVE_IRQN (LPSPI1_IRQn)
#define EXAMPLE_LPSPI_SLAVE_PCS_FOR_INIT (kLPSPI_Pcs0)
#define EXAMPLE_LPSPI_SLAVE_PCS_FOR_TRANSFER (kLPSPI_SlavePcs0)
/* Select USB1 PLL PFD0 (720 MHz) as lpspi clock source */
#define EXAMPLE_LPSPI_CLOCK_SOURCE_SELECT (2U)
/* Clock divider for master lpspi clock source */
#define EXAMPLE_LPSPI_CLOCK_SOURCE_DIVIDER (60U)
#define TRANSFER_SIZE 5U /*! Transfer dataSize */
/*******************************************************************************
* Prototypes
******************************************************************************/
/* LPSPI user callback */
void LPSPI_SlaveUserCallback(LPSPI_Type *base, lpspi_slave_handle_t *handle, status_t status, void *userData);
/*******************************************************************************
* Variables
******************************************************************************/
uint8_t slaveRxData[TRANSFER_SIZE] = {0U};
uint8_t slaveTxData[TRANSFER_SIZE] = {0U};
lpspi_slave_handle_t g_s_handle;
volatile bool isTransferCompleted = false;
/*******************************************************************************
* Code
******************************************************************************/
void LPSPI_SlaveUserCallback(LPSPI_Type *base, lpspi_slave_handle_t *handle, status_t status, void *userData)
{
if (status == kStatus_Success)
{
PRINTF("This is LPSPI slave transfer completed callback. \r\n");
PRINTF("It's a successful transfer. \r\n\r\n");
}
if (status == kStatus_LPSPI_Error)
{
PRINTF("This is LPSPI slave transfer completed callback. \r\n");
PRINTF("Error occurred in this transfer. \r\n\r\n");
}
isTransferCompleted = true;
}
/*!
* @brief Main function
*/
int main(void)
{
BOARD_ConfigMPU();
BOARD_InitBootPins();
BOARD_InitBootClocks();
BOARD_InitDebugConsole();
/*Set clock source for LPSPI*/
CLOCK_SetMux(kCLOCK_LpspiMux, EXAMPLE_LPSPI_CLOCK_SOURCE_SELECT);
CLOCK_SetDiv(kCLOCK_LpspiDiv, EXAMPLE_LPSPI_CLOCK_SOURCE_DIVIDER);
// int clockfreq = CLOCK_GetDiv(kCLOCK_LpspiDiv);
// int clockfreq = CLOCK_GetFreq(kCLOCK_CpuClk);
uint32_t clockfreq = CLOCK_GetFreq(kCLOCK_Lpspi1);
//PRINTF("LPSPI board to board polling example.\r\n");
uint32_t i;
lpspi_slave_config_t slaveConfig;
lpspi_transfer_t slaveXfer;
/*Slave config*/
LPSPI_SlaveGetDefaultConfig(&slaveConfig);
slaveConfig.whichPcs = EXAMPLE_LPSPI_SLAVE_PCS_FOR_INIT;
for (i = 0U; i < TRANSFER_SIZE; i++)
{
slaveTxData[i] = i+1;
}
LPSPI_SlaveInit(EXAMPLE_LPSPI_SLAVE_BASEADDR, &slaveConfig);
LPSPI_SlaveTransferCreateHandle(EXAMPLE_LPSPI_SLAVE_BASEADDR, &g_s_handle, LPSPI_SlaveUserCallback, NULL);
while (1)
{
PRINTF("\r\n Slave is running...\r\n");
PRINTF("\r\n Clock freq:- %d\r\n",clockfreq);
/* Reset the receive buffer */
for (i = 0U; i < TRANSFER_SIZE; i++)
{
slaveRxData[i] = 0U;
}
/* Set slave transfer ready to receive data */
isTransferCompleted = false;
slaveXfer.txData = slaveTxData;
slaveXfer.rxData = slaveRxData;
slaveXfer.dataSize = TRANSFER_SIZE;
slaveXfer.configFlags = EXAMPLE_LPSPI_SLAVE_PCS_FOR_TRANSFER | kLPSPI_SlaveByteSwap;
/* Slave start receive */
LPSPI_SlaveTransferNonBlocking(EXAMPLE_LPSPI_SLAVE_BASEADDR, &g_s_handle, &slaveXfer);
while (!isTransferCompleted)
{
}
/* Set slave transfer ready to send back data */
// isTransferCompleted = false;
//
// slaveXfer.txData = slaveRxData;
// slaveXfer.rxData = NULL;
// slaveXfer.dataSize = TRANSFER_SIZE;
// slaveXfer.configFlags = EXAMPLE_LPSPI_SLAVE_PCS_FOR_TRANSFER | kLPSPI_SlaveByteSwap;
//
// /* Slave start send */
// LPSPI_SlaveTransferNonBlocking(EXAMPLE_LPSPI_SLAVE_BASEADDR, &g_s_handle, &slaveXfer);
//
// while (!isTransferCompleted)
// {
// }
/* Print out receive buffer */
PRINTF("\r\n Slave received:");
for (i = 0U; i < TRANSFER_SIZE; i++)
{
/* Print 16 numbers in a line */
if ((i & 0x0FU) == 0U)
{
PRINTF("\r\n ");
}
PRINTF(" %02X", slaveRxData[i]);
}
PRINTF("\r\n");
}
}
已解决! 转到解答。
Hello @Jayaganesh,
In order to support you better, can you provide me the frame of all LPSPI signals?
Also, as mentioned in the table 14-5 called "System Clock Frequency Values" in the RM, the maximum clock source of LPSPI is 132MHz. Please take in mind this value. At the same time, the function called "CLOCK_GetFreq" that you are currently using in your code, receives an enum called "clock_name_t" instead "clock_ip_name_t" that is the enum of "kCLOCK_Lpspi1".
In the other hand, The SDK (version 2.16) offers the example called "lpspi_loopback" where you can corroborate if your board is working as expected, also if you have two RT1060's boards, you can use the SDK (version 2.16) example called "lpspi_interrupt_b2b_master" with "lpspi_interrupt_b2b_slave". I highly recommend see the readme of the example that you will use. Where is inside the folder called "doc", as shown in the next image:
BR
Habib
Thank You Habib for the previous support, i have another doubt! How to set lpspi2 clock to 10mhz or lesser! I used PLL2 pfd2
Hello again @Jayaganesh,
In order to set lpspi2 clock to 10 Mhz or lesser I can see two ways:
1. Modify the dividers what are involucrate in the flow clock.
2. Use Config tools. MCUXpresso Ecosystem offers config tools, where is an integrated suite of configuration tools, is designed to guide customers from first evaluation to production software development.
This link has many trainings that could help you to learn more about how use config tools, also in the same link you can see the file called "MCUXpresso Config Tools User's Guide (IDE)" that could be helpful.
Also, if you experience any issue do not hesitate to let me know.
BR
Habib.
Hello @Jayaganesh,
In order to support you better, can you provide me the frame of all LPSPI signals?
Also, as mentioned in the table 14-5 called "System Clock Frequency Values" in the RM, the maximum clock source of LPSPI is 132MHz. Please take in mind this value. At the same time, the function called "CLOCK_GetFreq" that you are currently using in your code, receives an enum called "clock_name_t" instead "clock_ip_name_t" that is the enum of "kCLOCK_Lpspi1".
In the other hand, The SDK (version 2.16) offers the example called "lpspi_loopback" where you can corroborate if your board is working as expected, also if you have two RT1060's boards, you can use the SDK (version 2.16) example called "lpspi_interrupt_b2b_master" with "lpspi_interrupt_b2b_slave". I highly recommend see the readme of the example that you will use. Where is inside the folder called "doc", as shown in the next image:
BR
Habib