STM32F407实现FRAM驱动

发布者:正在搬砖的河马71最新更新时间:2020-06-29 来源: eefocus关键字:STM32F407  FRAM驱动  spi接口初始化 手机看文章 扫描二维码
随时随地手机看文章

spi接口初始化

void SPI1_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

SPI_InitTypeDef SPI_InitStructure;


RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟


//GPIOF9,F10初始化设置

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//PB3~5复用功能输出

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化


GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_SPI1); //PB3复用为 SPI1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_SPI1); //PB4复用为 SPI1

GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_SPI1); //PB5复用为 SPI1



//这里只针对SPI口初始化

RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1

RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1


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_8; //定义波特率预分频的值:波特率预分频值为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外设


//SPI1_ReadWriteByte(0xff);//启动传输  


}

//SPI1速度设置函数

//SpeedSet:0~7

//SPI速度=fAPB2/2^(SpeedSet+1)

//fAPB2时钟一般为84Mhz

void SPI1_SetSpeed(u8 SPI_BaudRatePrescaler)

{

assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));

SPI1->CR1&=0XFFC7;

SPI1->CR1|=SPI_BaudRatePrescaler; //设置SPI1速度

SPI_Cmd(SPI1,ENABLE);

}

//SPI1 读写一个字节

//TxData:要写入的字节

//返回值:读取到的字节

u8 SPI1_ReadWriteByte(u8 TxData)

{

u8 retry = 0;

while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)

{

retry++;

if(retry > 200) return 0;

}//等待发送区空


SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte  数据

retry = 0;


while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)

{

retry++;

if(retry > 200) return 0;

} //等待接收完一个byte


return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据


}


FRAM接口

#ifndef __FRAM_H

#define __FRAM_H


#ifdef __cplusplus

extern “C” {

#endif


#include “stm32f4xx.h”

#define CMD_WREN 0x06

#define CMD_WRDI 0x04

#define CMD_RDSR 0x05

#define CMD_WRSR 0x01

#define CMD_READ 0x03

#define CMD_WRITE 0x02


#define GPIO_CSN GPIOA

#define GPIO_Pin_CSN GPIO_Pin_4

#define GPIO_RCC_CSN RCC_AHB1Periph_GPIOA

#define Set_FRAM_CSN() GPIO_SetBits(GPIO_CSN,GPIO_Pin_CSN)

#define Clr_FRAM_CSN() GPIO_ResetBits(GPIO_CSN,GPIO_Pin_CSN)


void FRAM_Init(void);

void FRAM_Write(u16 writeaddr,u8 *fbuf,u16 n);

void FRAM_Read(u16 readaddr,u8 *fbuf,u16 n);

#ifdef __cplusplus

}

#endif


#endif


#include “fram.h”

#include “spi.h”


//初始化SPI FLASH的IO口

void FRAM_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;


RCC_AHB1PeriphClockCmd(GPIO_RCC_CSN, ENABLE);//使能GPIOB时钟

//GPIOA4

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_CSN;//PB14

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//输出

GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉

GPIO_Init(GPIO_CSN, &GPIO_InitStructure);//初始化


Set_FRAM_CSN();

SPI1_Init();     //初始化SPI

Clr_FRAM_CSN();

SPI1_ReadWriteByte(0xff);//启动传输

Set_FRAM_CSN(); //SPI FLASH不选中


}

void FRAM_Write_Enable(void)

{

u16 i;

Clr_FRAM_CSN();

SPI1_ReadWriteByte(CMD_WREN); //发送读取命令

Set_FRAM_CSN();

i=10;

while(i–);


}

void FRAM_Write(u16 writeaddr,u8 *fbuf,u16 n)

{

u16 i;

FRAM_Write_Enable(); //操作命令之前必须写使能

Clr_FRAM_CSN(); //使能器件

SPI1_ReadWriteByte(CMD_WRITE); //发送读取命令

SPI1_ReadWriteByte((u8)((writeaddr)>>8)); //发送16bit地址

SPI1_ReadWriteByte((u8)writeaddr);

for(i=0;i{

SPI1_ReadWriteByte(fbuf[i]); //循环读数

}

Set_FRAM_CSN();

}


void FRAM_Read(u16 readaddr,u8 *fbuf,u16 n)

{

u16 i;

FRAM_Write_Enable(); //操作命令之前必须写使能

Clr_FRAM_CSN(); //使能器件

SPI1_ReadWriteByte(CMD_READ); //发送读取命令

SPI1_ReadWriteByte((u8)((readaddr)>>8)); //发送16bit地址

SPI1_ReadWriteByte((u8)readaddr);

for(i=0;i{

fbuf[i]=SPI1_ReadWriteByte(0xff); //循环读数

}

Set_FRAM_CSN();

}


总结

1、操作读写之前要发送写使能命令才进行操作

2、FRAM可以按字节操作或连接操作。

关键字:STM32F407  FRAM驱动  spi接口初始化 引用地址:STM32F407实现FRAM驱动

上一篇:绝对值编码器数据接收的问题
下一篇:STM32 网络通信Web Server中 SSI与CGI的应用解析

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved