cancel
Showing results for 
Search instead for 
Did you mean: 

STM32F4Discovery SPI1 last bit problem

alevstiv
Associate II
Posted on September 01, 2015 at 10:35

Hello,

I have a problem  with SPI1 using the STM32F4Discovery. The STM HAL(STM32Cube_FW_F4_V1.5.0 and 

V1.7.0  

) driver is used. When I use HAL_SPI_Transmit (master mode, bidirectional) last bit in returned byte is always zero. If I use a command with multiple returned bytes then last bit(if it is 1)  go over in last bit next byte. But the same code at the SPI2 works fine. An o

scilloscope shows that a slave device works properly. The problem is tested on two the 

STM32F4Discovery boards.

3 REPLIES 3
arkadiuszkoziel93
Associate
Posted on September 01, 2015 at 22:52

Hello,

can you show code?

alevstiv
Associate II
Posted on September 02, 2015 at 09:14

minimal example:


void
SystemClock_Config(
void
);

static
void
MX_GPIO_Init(
void
);

static
void
MX_CRC_Init(
void
);

static
void
MX_SPI1_Init(
void
);

static
void
MX_SPI2_Init(
void
);

static
void
MX_TIM6_Init(
void
);


/* USER CODE BEGIN PFP */


/* USER CODE END PFP */


/* USER CODE BEGIN 0 */


/* USER CODE END 0 */


uint8_t recspi[11];

uint8_t tx_spi_buf[11];


uint8_t puls_com = 0x80;

uint8_t reg_rd_com=0x40;

uint8_t reg_wr_com=0x60;



int
main(
void
)

{

/* USER CODE BEGIN 1 */


/* USER CODE END 1 */


/* MCU Configuration----------------------------------------------------------*/


/* Reset of all peripherals, Initializes the Flash interface and the Systick. */

HAL_Init();


/* Configure the system clock */

SystemClock_Config();


/* Initialize all configured peripherals */

MX_GPIO_Init();

MX_CRC_Init();


MX_TIM6_Init();

MX_USB_DEVICE_Init();


MX_SPI1_Init();

MX_SPI2_Init();


tx_spi_buf[0]=reg_rd_com|0x10;

HAL_GPIO_WritePin(GPIOB_BASE, GPIO_PIN_1, GPIO_PIN_SET);
//reset slave device


HAL_GPIO_WritePin(GPIOC_BASE, GPIO_PIN_5, GPIO_PIN_SET);
// chip select

HAL_Delay(100);

HAL_GPIO_WritePin(GPIOC_BASE, GPIO_PIN_5, GPIO_PIN_RESET);

HAL_SPI_TransmitReceive(&hspi1, tx_spi_buf, recspi, 11, 100);

HAL_GPIO_WritePin(GPIOC_BASE, GPIO_PIN_5, GPIO_PIN_SET);

HAL_Delay(100);

for
(uint8_t i = 1; i < 11; i++) {

trace_printf(
'' %X''
, recspi[i]);

}


while
(1)

{

/* USER CODE END WHILE */


/* USER CODE BEGIN 3 */


}

}


/** System Clock Configuration

*/

void
SystemClock_Config(
void
)

{


RCC_OscInitTypeDef RCC_OscInitStruct;

RCC_ClkInitTypeDef RCC_ClkInitStruct;


__PWR_CLK_ENABLE();


__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);


RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;

RCC_OscInitStruct.HSEState = RCC_HSE_ON;

RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;

RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;

RCC_OscInitStruct.PLL.PLLM = 8;

RCC_OscInitStruct.PLL.PLLN = 336;

RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;

RCC_OscInitStruct.PLL.PLLQ = 7;

HAL_RCC_OscConfig(&RCC_OscInitStruct);


RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1

|RCC_CLOCKTYPE_PCLK2;

RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;

RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;

RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5);


}


/* CRC init function */

void
MX_CRC_Init(
void
)

{

hcrc.Instance = CRC;

HAL_CRC_Init(&hcrc);

}

/* SPI1 init function */

void
MX_SPI1_Init(
void
)

{

hspi1.Instance = SPI1;

hspi1.Init.Mode = SPI_MODE_MASTER;

hspi1.Init.Direction = SPI_DIRECTION_2LINES;

hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

hspi1.Init.NSS = SPI_NSS_SOFT;

hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;

hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;

hspi1.Init.TIMode = SPI_TIMODE_DISABLED;

hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;

hspi1.Init.CRCPolynomial = 10;

HAL_SPI_Init(&hspi1);

}


/* SPI2 init function */

void
MX_SPI2_Init(
void
)

{

hspi2.Instance = SPI2;

hspi2.Init.Mode = SPI_MODE_MASTER;

hspi2.Init.Direction = SPI_DIRECTION_2LINES;

hspi2.Init.DataSize = SPI_DATASIZE_8BIT;

hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;

hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;

hspi2.Init.NSS = SPI_NSS_SOFT;

hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;

hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;

hspi2.Init.TIMode = SPI_TIMODE_DISABLED;

hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLED;

hspi2.Init.CRCPolynomial = 10;

HAL_SPI_Init(&hspi2);

}


/* TIM6 init function */

void
MX_TIM6_Init(
void
)

{

TIM_MasterConfigTypeDef sMasterConfig;


htim6.Instance = TIM6;

htim6.Init.Prescaler = 0;

htim6.Init.CounterMode = TIM_COUNTERMODE_UP;

htim6.Init.Period = 0;

HAL_TIM_Base_Init(&htim6);


sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig);

}


/**

* @brief EXTI line detection callbacks

* @param GPIO_Pin: Specifies the pins connected EXTI line

* @retval None

*/



void
HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)

{

if
(GPIO_Pin == GPIO_PIN_0)

{

}

}

/** Configure pins as 

* Analog 

* Input 

* Output

* EVENT_OUT

* EXTI

PC3 ------> I2S2_SD

PA4 ------> I2S3_WS

PB10 ------> I2S2_CK

PC7 ------> I2S3_MCK

PC10 ------> I2S3_CK

PC12 ------> I2S3_SD

PB6 ------> I2C1_SCL

PB9 ------> I2C1_SDA

*/

void
MX_GPIO_Init(
void
)

{


GPIO_InitTypeDef GPIO_InitStruct;


/* GPIO Ports Clock Enable */

__GPIOE_CLK_ENABLE();

__GPIOC_CLK_ENABLE();

__GPIOH_CLK_ENABLE();

__GPIOA_CLK_ENABLE();

__GPIOB_CLK_ENABLE();

__GPIOD_CLK_ENABLE();


/*Configure GPIO pin : PE3 */

GPIO_InitStruct.Pin = GPIO_PIN_3;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);


/*Configure GPIO pin : PC0 */

GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_5;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


/*Configure GPIO pin : PC3 */

GPIO_InitStruct.Pin = GPIO_PIN_3;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


/*Configure GPIO pin : PA0 */

GPIO_InitStruct.Pin = GPIO_PIN_0;

GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


/*Configure GPIO pin : PA4 */

GPIO_InitStruct.Pin = GPIO_PIN_4;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


/*Configure GPIO pin : PB2 */

GPIO_InitStruct.Pin = GPIO_PIN_2;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/*Configure GPIO pin : PB1 */

GPIO_InitStruct.Pin = GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/*Configure GPIO pin : PB10 */

GPIO_InitStruct.Pin = GPIO_PIN_10;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/*Configure GPIO pins : PD12 PD13 PD14 PD15 

PD4 */

GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 

|GPIO_PIN_4;

GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);


/*Configure GPIO pins : PC7 PC10 PC12 */

GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_10|GPIO_PIN_12;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

GPIO_InitStruct.Pull = GPIO_NOPULL;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;

HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);


/*Configure GPIO pin : PD5 */

GPIO_InitStruct.Pin = GPIO_PIN_5;

GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);


/*Configure GPIO pins : PB6 PB9 */

GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_9;

GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;

GPIO_InitStruct.Pull = GPIO_PULLUP;

GPIO_InitStruct.Speed = GPIO_SPEED_LOW;

GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


/*Configure GPIO pin : PE1 */

GPIO_InitStruct.Pin = GPIO_PIN_1;

GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

/* EXTI interrupt init*/

HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI0_IRQn);

}

reply is: A 82 1 0 FE FF 1 FE 1 8A but it must be:A 83 0 0 FF FF 0 FF 0 8B