fm25cl64bstm32
时间: 2025-01-02 11:37:15 浏览: 7
### FM25CL64BS与STM32集成指南
#### 设备概述
FM25CL64BS是一款基于铁电随机存取存储器(FRAM)技术的串行外设接口(SPI)设备,具有高速读写能力以及无限次擦写寿命的特点[^1]。
对于STM32微控制器而言,其丰富的SPI接口资源使得连接并操作FRAM成为可能。通过配置相应的GPIO引脚作为SPI通信线路,并利用HAL库函数实现数据交换过程中的命令发送、状态查询等功能来完成对FM25CL64BS的操作[^2]。
#### 初始化设置
为了使能SPI总线上的正常通讯,在初始化阶段需执行如下工作:
- 配置SPI模式为主控端(Master Mode),设定时钟极性和相位参数以匹配从机的要求;
- 设置合适的波特率以便于稳定传输信号;
- 启用NSS硬件管理功能或软件控制方式下的片选机制;
```c
// SPI初始化结构体定义
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; // 软件控制NSS
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
HAL_SPI_Init(&hspi1);
}
```
#### 基本读写流程
针对FM25CL64BS的数据访问主要包括两种基本形式——连续读取和单字节/多字节编程(即写入)[^3]:
当进行地址指针定位后的批量读取动作时,先发出`READ_MEMORY_CONTENTS (0x03)`指令连同起始位置信息给目标器件,随后即可接收返回的一系列有效载荷直至所需长度满足为止。
而在实施写保护解除(`WRITE_ENABLE, 0x06`)之后紧接着可以发起一次或多批次的页面写入请求,每页最大容量可达256字节,期间务必遵循官方文档给出的具体协议规范。
```c
// 写入数据到指定地址
void FRAM_Write(uint32_t addr, uint8_t *data, uint16_t length){
uint8_t cmd[4];
WRITE_ENABLE(); // 解除写保护
cmd[0] = WRITE_MEMORY_ARRAY; // 写入命令
cmd[1] = (uint8_t)(addr >> 16); // 地址高位
cmd[2] = (uint8_t)(addr >> 8 ); // 中间位
cmd[3] = (uint8_t)(addr ); // 地址低位
HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET); // 片选低电平激活
HAL_SPI_Transmit(&hspi1, cmd, sizeof(cmd), HAL_MAX_DELAY);
HAL_SPI_Transmit(&hspi1, data, length, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET); // 结束后拉高CS释放总线
}
// 从指定地址开始读取数据
void FRAM_Read(uint32_t addr, uint8_t *buffer, uint16_t length){
uint8_t cmd[4];
cmd[0] = READ_MEMORY_CONTENTS; // 读取命令
cmd[1] = (uint8_t)(addr >> 16); // 地址高位
cmd[2] = (uint8_t)(addr >> 8 ); // 中间位
cmd[3] = (uint8_t)(addr ); // 地址低位
HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_RESET); // 片选低电平激活
HAL_SPI_Transmit(&hspi1, cmd, sizeof(cmd), HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi1, buffer, length, HAL_MAX_DELAY);
HAL_GPIO_WritePin(CS_PORT, CS_PIN, GPIO_PIN_SET); // 结束后拉高CS释放总线
}
```
阅读全文