cancel
Showing results for 
Search instead for 
Did you mean: 

Hello! I've a little issue regarding SPI communication with a TI DRV8308 chip.

AErik
Associate II

The problem is that the (working) TI DVM board starts the MOSI communication one half clk cycle before I manage to do it with my Nucleo-F030R8 so the the information gets bit-shifted into the chip and miss-interpreted.

I'm using HAL and I've tried every different setting available with no luck. What am I missing here? 

The analyser plots attached pretty much sums it up. 

I would be very grateful if you could help me. 😊

uint8_t Cmd[1] = {0x80};
 
HAL_GPIO_WritePin(SPI_CS_GPIO_Port,SPI_CS_Pin,SET);
HAL_Delay(2);
HAL_SPI_Transmit(&hspi1, Cmd, 1, 0xFF);
HAL_GPIO_WritePin(SPI_CS_GPIO_Port,SPI_CS_Pin,RESET);
 
//settings
 
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_2EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_ENABLE;
 
 
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    Error_Handler();
  }
 
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
 
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(spiHandle->Instance==SPI1)
  {
  /* USER CODE BEGIN SPI1_MspInit 0 */
 
  /* USER CODE END SPI1_MspInit 0 */
    /* SPI1 clock enable */
    __HAL_RCC_SPI1_CLK_ENABLE();
  
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /**SPI1 GPIO Configuration    
    PA6     ------> SPI1_MISO
    PA7     ------> SPI1_MOSI
    PB3     ------> SPI1_SCK 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF0_SPI1;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
 
    /* SPI1 interrupt Init */
    HAL_NVIC_SetPriority(SPI1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(SPI1_IRQn);
  /* USER CODE BEGIN SPI1_MspInit 1 */
 
  /* USER CODE END SPI1_MspInit 1 */
  }
}

5 REPLIES 5
S.Ma
Principal

SPI have option for not using TI nss pulse mode, maybe this could help make the communication work? Try and compare. Usually it is related to data sampling clock edge

AErik
Associate II

Hello!

Thanks for your showed interest.

I think that option is already activated:

hspi1.Init.TIMode = SPI_TIMODE_ENABLE;

S.Ma
Principal

Try disabling it. Then check which clock polarity works. Polarity and phase are adjustable. You can control the nss gpio manually by sw.

AErik
Associate II

Tooodelou! =)

Sometimes, just taking a break and write onto a public forum, get's you going again. Without knowing to much in the low parts of SPI this is what got it working with my particular TI DRV8308:

  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_128;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;

I just post it for future references.

The strange part about this is that when I read about the difference between TI and Motorola, it struck me that this particular IC was more like Motorola than TI. There is a good post on this forum describing some user having problem with TI DRV8305, and reading that datasheet reveals that that IC has a completely different SPI, more TI like.

https://community.st.com/s/question/0D50X00009XkYMnSAN/stm32f334-spi-ti-mode

S.Ma
Principal

Making progress, great!