#include "flash.h"
/********************************************************
//project:STM32F1 SPI读写FM25CL64驱动代码
//date:2013.09.26
//author:huangzheng
//annotation:适用铁电存储器fm25系列读写代码,直接读写一个字节
//
**********************************************************/
//初始化SPI FLASH的IO口
SPI_InitTypeDef SPI_InitStructure;
void SPI_Flash_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //SPI CS
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_2);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //选择了串行时钟的稳态:时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //数据捕获于第二个时钟沿
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式
SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器
SPI_Cmd(SPI1, ENABLE); //使能SPI外设
}
u8 SPIx_ReadWriteByte(u8 TxData) //SPI 发送接收字节
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
{
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //检查指定的SPI标志位设置与否:接受缓存非空标志位
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}
#define FM25CL64_Reset_CS GPIO_ResetBits(GPIOA,GPIO_Pin_2)
#define FM25CL64_Set_CS GPIO_SetBits(GPIOA,GPIO_Pin_2)
void SPI_write_FM25CL64(u8 data,u16 address)//写入一个字节到特定地址空间
{
u8 addr_tempH,addr_tempL;
addr_tempH = (u8)((address&0xff00)>>8); //获取高8位地址
addr_tempL = (u8)(address&0x00ff); //获取低8位地址
FM25CL64_Reset_CS;
SPIx_ReadWriteByte(FM25CL64_WREN_INST); //写使能
SPIx_ReadWriteByte(FM25CL64_WRITE_INST); //写存储器寄存器操作吗
SPIx_ReadWriteByte(addr_tempH); //写入高八位地址,高3位忽略
SPIx_ReadWriteByte(addr_tempL); //
SPIx_ReadWriteByte(data); //写入数据
FM25CL64_Set_CS;
}
u8 SPI_read_FM25CL64(u16 address)//读出特定地址空间的数据
{
u8 dat,addr_tempH,addr_tempL;
addr_tempH = (u8)((address&0xff00)>>8);
addr_tempL = (u8)(address&0x00ff);
FM25CL64_Reset_CS;
SPIx_ReadWriteByte(FM25CL64_READ_INST); //读存储器寄存器操作码
SPIx_ReadWriteByte(addr_tempH);
SPIx_ReadWriteByte(addr_tempL);
dat=SPIx_ReadWriteByte(0x00); //读取数据,0x00给予读取数据所需的时钟
FM25CL64_Set_CS;
return (dat);
}
STM32F103单片机_SPI读写FM25CL64铁电存储器驱动程序代码.zip
版权申诉
5星 · 超过95%的资源 125 浏览量
2022-06-02
11:28:44
上传
评论 4
收藏 2KB ZIP 举报
SKCQTGZX
- 粉丝: 87
- 资源: 5820
最新资源
- 二叉树7-1-1.cpp
- android 9.0 原生模拟器 签名文件
- 技术面试最后反问面试官的话 校招面试非技术问题有哪些 非技术问题如何回答.png
- NB-IOT-BC26全网通模块Altium+ CADENCE +PADS三种格式(原理图SCH+PCB封装库)文件.zip
- 基于微信小程序开发的校园失物招领系统源码毕业设计(优质项目源码).zip
- 词向量是一种将自然语言中的单词转换为数值向量的技术,它能够捕捉词义和上下文信息
- nmap与masscan的简单使用
- MyBatis动态SQL.pdf
- 基于stm32单片机protues仿真的温湿度控制系统设计(仿真图、源代码)
- 词向量:自然语言处理的基石
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页