HALku 驱动M25P40驱动程序
时间: 2023-10-07 10:13:12 浏览: 117
M25P20, M25P40, M25P80, M25P16, M25P32, SPI FLASH C语言软件驱动源码.zip
5星 · 资源好评率100%
你好!要驱动M25P40闪存芯片,你可以使用HAL库来实现。以下是一个简单的示例代码,展示了如何使用HAL库来读取和写入M25P40芯片中的数据:
```c
#include "stm32f4xx_hal.h"
#include "spi.h"
#define FLASH_CS_Pin GPIO_PIN_4
#define FLASH_CS_GPIO_Port GPIOA
SPI_HandleTypeDef hspi1;
void MX_SPI1_Init(void)
{
/* SPI1 parameter configuration */
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;
HAL_SPI_Init(&hspi1);
}
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(hspi->Instance==SPI1)
{
/* SPI1 clock enable */
__HAL_RCC_SPI1_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI1 GPIO Configuration
PA5 ------> SPI1_SCK
PA6 ------> SPI1_MISO
PA7 ------> SPI1_MOSI
*/
GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* SPI1 CS GPIO pin configuration */
GPIO_InitStruct.Pin = FLASH_CS_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(FLASH_CS_GPIO_Port, &GPIO_InitStruct);
}
}
void FLASH_CS_LOW(void)
{
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_RESET);
}
void FLASH_CS_HIGH(void)
{
HAL_GPIO_WritePin(FLASH_CS_GPIO_Port, FLASH_CS_Pin, GPIO_PIN_SET);
}
void FLASH_SPI_SendByte(uint8_t data)
{
HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
}
uint8_t FLASH_SPI_ReceiveByte(void)
{
uint8_t data;
HAL_SPI_Receive(&hspi1, &data, 1, HAL_MAX_DELAY);
return data;
}
void FLASH_WriteEnable(void)
{
FLASH_CS_LOW();
FLASH_SPI_SendByte(0x06); // 发送写使能命令
FLASH_CS_HIGH();
}
void FLASH_WaitForWriteEnd(void)
{
uint8_t status;
FLASH_CS_LOW();
FLASH_SPI_SendByte(0x05); // 发送读状态寄存器命令
do {
status = FLASH_SPI_ReceiveByte(); // 读取状态寄存器的值
} while ((status & 0x01) == SET); // 检查忙位
FLASH_CS_HIGH();
}
void FLASH_WriteByte(uint32_t addr, uint8_t data)
{
FLASH_WriteEnable(); // 允许写入
FLASH_CS_LOW();
FLASH_SPI_SendByte(0x02); // 发送页编程命令
FLASH_SPI_SendByte((addr >> 16) & 0xFF); // 发送地址高位
FLASH_SPI_SendByte((addr >> 8) & 0xFF); // 发送地址中位
FLASH_SPI_SendByte(addr & 0xFF); // 发送地址低位
FLASH_SPI_SendByte(data); // 发送要写入的数据
FLASH_CS_HIGH();
FLASH_WaitForWriteEnd(); // 等待写操作完成
}
uint8_t FLASH_ReadByte(uint32_t addr)
{
uint8_t data;
FLASH_CS_LOW();
FLASH_SPI_SendByte(0x03); // 发送读取数据命令
FLASH_SPI_SendByte((addr >> 16) & 0xFF); // 发送地址高位
FLASH_SPI_SendByte((addr >> 8) & 0xFF); // 发送地址中位
FLASH_SPI_SendByte(addr & 0xFF); // 发送地址低位
data = FLASH_SPI_ReceiveByte(); // 接收数据
FLASH_CS_HIGH();
return data;
}
```
这个代码使用了SPI1来与M25P40芯片进行通信。你可以根据你的需求修改SPI和GPIO的引脚,以匹配你的硬件连接。在使用之前,确保已经正确初始化SPI和GPIO,并根据需要调用`FLASH_WriteByte`和`FLASH_ReadByte`函数来写入和读取数据。
希望这个示例能对你有所帮助!如果你还有其他问题,请随时提问。
阅读全文