2021-11-18 05:45 AM
Hi,
I am trying to use Nucleo-l4p5 as SPI Master and NRF52 as slave.
Issue : nrf is reading wrong and partial data and when I am connecting GND of both boards, it stops working.
Solutions tried so far:
// ST master code
while (1)
{
if (count%2 == 1)
{
memset(buffer1, buffer1, 6);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_SPI_Transmit(&hspi3, &buffer1, 6, 100);
HAL_Delay(10);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_SET);
}
else
{
memset(buffer1, buffer1, 6);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_SPI_Transmit(&hspi3, &buffer1, 6, 100);
HAL_Delay(10);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_SET);
}
count++;
HAL_Delay(1000);
Clock is configured for PCLK1(60) and PCLK2(120)
This is the configuration:
static void MX_SPI3_Init(void)
{
/* USER CODE BEGIN SPI3_Init 0 */
/* USER CODE END SPI3_Init 0 */
/* USER CODE BEGIN SPI3_Init 1 */
/* USER CODE END SPI3_Init 1 */
/* SPI3 parameter configuration*/
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES;
hspi3.Init.DataSize = SPI_DATASIZE_8BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 7;
hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI3_Init 2 */
/* USER CODE END SPI3_Init 2 */
}
2021-11-18 05:56 AM
GND needs to be common between the boards so they both have the same reference voltage.
What data do you receive and what data are you expecting instead?
> memset(buffer1, buffer1, 6);
What is this supposed to do?
2021-11-18 09:22 PM
Sorry for the typo, this is what I am sending:
while (1)
{
if (count%2 == 1)
{
memset(buffer1, 68, 6);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_SPI_Transmit(&hspi3, &buffer1, 6, 100);
HAL_Delay(10);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_SET);
}
else
{
memset(buffer1, 65, 6);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_RESET);
HAL_Delay(10);
HAL_SPI_Transmit(&hspi3, &buffer1, 6, 100);
HAL_Delay(10);
HAL_GPIO_WritePin(cs_port, cs_pin, GPIO_PIN_SET);
}
count++;
HAL_Delay(1000);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
This is what I get at Receiving side:
<info> app: Transfer completed. Received: DDD
<info> app: Transfer completed. Received: ADD
<info> app: Transfer completed. Received: AAA
<info> app: Transfer completed. Received: AAAAA
<info> app: Transfer completed. Received: AAAAAA
<info> app: Transfer completed. Received: DDAAAA
<info> app: Transfer completed. Received: DDDDDA
The issue is I am not able to check operation while GND common, as I stop getting data at all.
Do 144-pin Nucleo boards have Isolated supplies or something?
2021-11-19 05:36 AM
If connecting GND breaks things, there is a hardware issue somewhere. Since the SPI signal is low a 0V and high at 3.3V, you need to ensure both parties have the save 0V reference. I do not believe any Nucleo boards have isolated supplies. Easy enough to check with a multimeter.
How do you know the issue isn't on the slave side? Can you put a logic analyzer on the lines to inspect data coming out?
I would wager your (new) code is correct and the issue is elsewhere.