2024-04-30 05:28 AM
Sorry, I have another question to ask everyone.
I am currently using the STM32F429ZIT6 to receive data from the AD7366 via SPI.
My Code:
int main(){
/*
Initialize all configured...
*/
while(1){
/* CNVST Enable */
GPIOA->ODR &= 0x0FF7F;
/* Waiting BUSY */
while(!(GPIOA->IDR & 0x8000));
GPIOA->ODR |= 0x0080;
while(GPIOA->IDR & 0x8000);
/* CS Enable */
GPIOA->ODR &= ~(1<<4);
HAL_SPI_Receive(&hspi1, data_ptr, 1, 1);
/* CS Disable */
GPIOA->ODR |= 0x0010;
}
}
When I use a slower SPI frequency, both the timing and the data are correct.
If SPI Config hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128:
static void MX_SPI1_Init(void)
{
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END SPI1_Init 0 */
/* USER CODE BEGIN SPI1_Init 1 */
/* USER CODE END SPI1_Init 1 */
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
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;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
RXNE Reset & DR Data is Correct
Blue is CS, Yellow is SCK
However, when I set the SPI frequency to be faster, errors occur.
If SPI Config hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64:
static void MX_SPI1_Init(void)
{
/* USER CODE BEGIN SPI1_Init 0 */
/* USER CODE END SPI1_Init 0 */
/* USER CODE BEGIN SPI1_Init 1 */
/* USER CODE END SPI1_Init 1 */
/* SPI1 parameter configuration*/
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi1.Init.DataSize = SPI_DATASIZE_16BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_64;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN SPI1_Init 2 */
/* USER CODE END SPI1_Init 2 */
}
RXNE no Reset
Blue is CS, Yellow is SCK
I have checked the STM32F429 Errata sheet[1] write:
master receive-only mode (simplex receive or half-duplex bidirectional receive phase) and an SCK strobing
edge has not occurred since the transition of the RXNE flag from low to high.
I'm not sure if this is the cause. If RXNE is causing the issue, how can this be resolved on STM32F4 in general?
Thank you all.
[1] STM32F427/437 and STM32F429/439 device errata - Errata sheet