本文在STM32F103上实现SSH25的驱动,实现数据的写入和读取:
1:此驱动未加擦除时候是否擦除成功的判断,一般写入FLASH不成功的最大原因就是擦除不成功,所以一般特选FLASH里面的一个地址存储一个特征字,比如0x12,当执行完操作擦除命令后,去判断这个特征字是否被擦除为0xff,如果擦除成功,执行写指令,当然,也可以进行CRC校验,判断写入和读取的是否一致;
2:FLASH的写入时,避免被中断打断;
main.c
#include "stdio.h"
#include "sys.h"
#include "USART_Init.h"
#include "SST25_SPI_Init.h"
u8 SSH_Buff[20];
u32 baud_menu[] = {1200,2400,3840,4800,5760,9600,19200,115200};
u16 ARR = 0;
int main()
{
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
Usart_Init(9600); //串口初始化
Spi_Init(); //SPI1/SSH25初始化
Write_State_Register(0X00); //写状态寄存器为0x00,取消写保护,上电默认全片保护
Block_Clear(Clear_4_K,10); //擦除4K扇区
Write_Mul_Byte(0,"sunshine",8); //将"sunshine"字符串写入扇区0
Read_Data(0,8,SSH_Buff); //将扇区0开始8个字节读进SSH_Buff
Usart_Send_Data(SSH_Buff,8); //发送串口打印
delay_ms(1000);
}
SSH_SPI_Init.h
#ifndef SSH25
#define SSH25
#include <stm32f10x.h>
#include "delay.h"
extern u8 ID[3];
typedef enum
{
Clear_4_K = 0,
Clear_32_K = 1,
Clear_64_K = 2,
Clear_ALL_FLASH = 3,
}Block_Cnt;
#define CS_LOW() GPIO_ResetBits(GPIOC, GPIO_Pin_4)
#define CS_HIGH() GPIO_SetBits(GPIOC,GPIO_Pin_4)
/*未使用*/
#define HOLD_LOW()
#define HOLD_HIGH()
/*未使用*/
#define WP_LOW()
#define WP_HIGH()
//函数申明
void Spi_Init(void);
u8 Read_State_Register(void);
void Wait_Busy_Clear(void);
void Write_State_Register(u8 dat);
void Write_Enab