Skip to main content
alevstiv
Associate
September 1, 2015
Question

STM32F4Discovery SPI1 last bit problem

  • September 1, 2015
  • 3 replies
  • 838 views
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.

    This topic has been closed for replies.

    3 replies

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

    Hello,

    can you show code?

    alevstiv
    alevstivAuthor
    Associate
    September 2, 2015
    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
    waclawek.jan
    Super User
    September 2, 2015