stm32H743 使用HAL库SPI读写外部flash失败原因

文章讨论了在使用STM32H743的SPI库时遇到的三个问题:1)发送后多一钟信号导致spiflash读写失败;2)发送命令后出现废数,需替换传输函数;3)大量数据传输时卡死,需判断TXDR标志。提供了解决方案和参考STM32H743手册的建议。
摘要由CSDN通过智能技术生成

1.

错误现象:

通过示波器可以看到数据发完后,多了一个时钟信号。

错误原因:

stm32H743生成的spi库,发送接收函数里面有关闭spi接口的函数(__HAL_SPI_DISABLE()),此函数导致始终发生变化,导致读写spiflash失败.

解决办法:__HAL_SPI_ENABLE()放在片选使能前面,__HAL_SPI_DISABLE()放在片选使能后面。HAL_SPI库不能直接用,要修改一下,把SPI_CloseTransfer()函数里面的__HAL_SPI_DISABLE()注释掉。

2.

错误现象:

先读出一个字节或者四个字节的废数,然后读出正确的数,废数数据量和发送的字节数相同。

错误原因:

发送命令的函数,使用的是HAL_SPI_Transmit();

解决办法:

flash发送命令的函数要使用HAL_SPI_TransmitReceive()函数。

3.

错误现象:

经过上述两处修改,HAL_SPI_Transmit()、HAL_SPI_TransmitReceive()只能读写一个字节,数据量大于1会卡死。

参考:

STM32H743参考手册,spi数据发送和接收过程,文档描述,参考序列处理相关描述

解决方法:

TXDR数据发送结束后,判断TXTF标志位,清TXTFFLAG

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103C8T6是一款基于ARM Cortex-M3内核的微控制器,它广泛应用于嵌入式系统开发。HAL库(Hardware Abstraction Layer)是ST公司提供的一套硬件抽象层库,用于简化STM32微控制器的驱动程序开发。 下面是一个使用HAL库进行SPI读写的示例程序: ```c #include "stm32f1xx_hal.h" SPI_HandleTypeDef hspi1; void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI1_Init(); uint8_t txData = 0x55; uint8_t rxData; while (1) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET); // 使能SPI片选 HAL_SPI_TransmitReceive(&hspi1, &txData, &rxData, 1, HAL_MAX_DELAY); // 发送和接收数据 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET); // 禁用SPI片选 // 处理接收到的数据 // ... HAL_Delay(1000); // 延时1秒 } } void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); } RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2; RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_4; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } static 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_256; 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(); } } ``` 以上是一个简单的SPI读写程序示例,其中使用HAL库提供的函数进行SPI的初始化、发送和接收操作。你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值