#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
INT8U Adressbuf2,Adressbuf1,Adressbuf0;
/*#define A0_H GPIOC->BSRR=GPIO_Pin_4
#define A0_L GPIOC->BRR=GPIO_Pin_4
#define CSLCDS_H GPIOB->BSRR=GPIO_Pin_2
#define CSLCDS_L GPIOB->BRR=GPIO_Pin_2
#define RSTLCDS_H GPIOB->BSRR=GPIO_Pin_11
#define RSTLCDS_L GPIOB->BRR=GPIO_Pin_11 */
#define SPI_FLASH_CS_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4)
#define SPI_FLASH_CS_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4)
#define MAX_ADDR 0x7FF /* 定义芯片内部最大地址 */
#define SEC_MAX 511 /* 定义最大扇区号 */
#define SEC_SIZE 0x1000 /* 扇区大小 */
/**********************************************************************
* 设置 PB12(SPI_CS) SPI片选 输出
* 设置 PB13(SPI_CLK) 存储时钟
* 设置 PB14(SPI_MISO) 存储数据线
* 设置 PB15(SPI_MOSI) 存储数据线
**********************************************************************/
/* 定义操作MB85RS16所需的数据 */
typedef enum ERTYPE{Sec1,Sec8,Sec16,Chip} ErType;
typedef enum IDTYPE{Manu_ID,Dev_ID,Jedec_ID} idtype;
void SPI_Configuration(void)
{
SPI_InitTypeDef SPI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
/* PA5,6,7 SCK,MISO,MOSI*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 |GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* PB12-CS*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* SPI2 configuration */
SPI_Cmd(SPI1, DISABLE); //必须先禁能,才能改变MODE
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //两线全双工
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //8位
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //CPOL=1 时钟悬空高
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //CPHA=1 数据捕获第2个
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //软件NSS
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; //2分频
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前
SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC7
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
}
/********************************************************************
纳秒级延时程序,最小延时208纳秒(dly=1),其他(>10)是51*dly纳秒,
通过t1定时器可以看出来
*********************************************************************/
void DelayNS (INT32U dly)
{
//WDT_pro();
for ( ; dly>0; dly--);
//WDT_pro();
}
/*******************************************************************************
* Function Name : Flash_ReadWriteByte
* Description : 通过硬件SPI发送一个字节到SST25VF016B
* Input : - data: 发送的数据
* Output : None
* Return : MB85RS16 返回的数据
* Attention : None
*******************************************************************************/
uint8_t Flash_ReadWriteByte(uint8_t data)
{
/* Loop while DR register in not emplty */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
/* Send byte through the SPI2 peripheral */
SPI_I2S_SendData(SPI1, data);
/* Wait to receive a byte */
while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
/* Return the byte read from the SPI bus */
return SPI_I2S_ReceiveData(SPI1);
}
/* 以下函数在移植时无需修改 */
/*******************************************************************************
* Function Name : MB85RS16
* Description : MB85RS16的读函数,可选择读ID和读数据操作
* Input : - Dst: 目标地址,范围 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
* - RcvBufPt: 接收缓存的指针
* - NByte: 要读取的数据字节数
* Output : 操作成功则返回OK,失败则返回ERROR
* Return : MB85RS16 返回的数据
* Attention : 若某功能下,某一入口参数无效,可在该入口参数处填Invalid,该参数将被忽略
*******************************************************************************/
uint8_t SSTF016B_RD(uint32_t Dst, uint8_t* RcvBufPt ,uint32_t NByte)
{
uint32_t i = 0;
if ((Dst+NByte > MAX_ADDR)||(NByte == 0)) return (ERROR); /* 检查入口参数 */
//Adressbuf2=(0xf0000&Dst)>>16;
Adressbuf1=(0xff00&Dst)>>8;
Adressbuf0=(0x00ff&Dst);
SPI_FLASH_CS_LOW();
Flash_ReadWriteByte(0x03); /* 发送读命令 */
//Flash_ReadWriteByte(((Dst & 0x7F00) >> 16)); /* 发送地址信息:该地址由3个字节组成 */
Flash_ReadWriteByte(Adressbuf1);
Flash_ReadWriteByte(Adressbuf0);
Flash_ReadWriteByte(0xFF); /* 发送一个哑字节以读取数据 */
for (i = 0; i<NByte; i++)
{
RcvBufPt[i] = Flash_ReadWriteByte(0x55);
}
SPI_FLASH_CS_HIGH();
return (ENABLE);
}
/*******************************************************************************
* Function Name : MB85RS16
* Description : MB85RS16的读ID函数,可选择读ID和读数据操作
* Input : - IDType: ID类型。用户可在Jedec_ID,Dev_ID,Manu_ID三者里选择
* Output : - RcvbufPt: 存储ID变量的指针
* Return : 操作成功则返回OK,失败则返回ERROR
* Attention : 若填入的参数不符合要求,则返回ERROR
*******************************************************************************/
uint8_t SSTF016B_RdID(idtype IDType,uint32_t* RcvbufPt)
{
uint32_t temp = 0;
if (IDType == Jedec_ID)
{
//SPI_FLASH_CS_LOW();
Flash_ReadWriteByte(0x9F); /* 发送读JEDEC ID命令(9Fh) */
temp = (temp | Flash_ReadWriteByte(0x00)) << 8; /* 接收数据 */
temp = (temp | Flash_ReadWriteByte(0x00)) << 8;
temp = (temp | Flash_ReadWriteByte(0x00)); /* 在本例中,temp的值应为0xBF2541 */
//SPI_FLASH_CS_HIGH();
*RcvbufPt = temp;
return (ENABLE);
}
if ((IDType == Manu_ID) || (IDType == Dev_ID) )
{
//SPI_FLASH_CS_LOW();
Flash_ReadWriteByte(0x90); /* 发送读ID命令 (90h or ABh) */
Flash_ReadWriteByte(0x00); /* 发送地址 */
Flash_ReadWriteByte(0x00); /* 发送地址 */
Flash_ReadWriteByte(IDType); /* 发送地址 - 不是00H就是01H */
temp = Flash_ReadWriteByte(0x00); /* 接收获取的数据字节 */
//SPI_FLASH_CS_HIGH();
*RcvbufPt = temp;
return (ENABLE);
}
else
{
return (ERROR);
}
}
/*******************************************************************************
* Function Name : MB85RS16
* Description : MB85RS16的写函数,可写1个和多个数据到指定地址
* Input : - Dst: 目标地址,范围 0x0 - MAX_ADDR(MAX_ADDR = 0x1FFFFF)
* - SndbufPt: 发送缓存区指针
* - NByte: 要写的数据字节数
* Output : None
* Return : 操作成功则返回OK,失败则返回ERROR
* Attention : 若某功能下,某一入口参数无效,可在该入口参数处填Invalid,该参数将被忽略
*******************************************************************************/
uint8_t SSTF016B_WR(uint32_t Dst, uint8_t* SndbufPt,uint32_t NByte)
{
//uint8_t temp = 0;//StatRgVal = 0;
uint32_t i = 0;
if (( (Dst+NByte-1 > MAX_ADDR)||(NByte == 0) ))
{
return (ERROR); /* 检查入口参数 */
}
SPI_FLASH_CS_LOW();
Flash_ReadWriteByte(0x05); /* 发送读状态寄存器命令 */
//temp = Flash_ReadWriteByte(0xFF); /* 保存读得的状态寄存器值 */
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW();
Flash_ReadWriteByte(0x06); /* 使状态寄存器可写 */
SPI_FLASH_CS_HIGH();
SPI_FLASH_CS_LOW();
Flash_ReadWriteByte(0x01); /* 发送写状态寄存器指令 */
Flash_ReadWriteByte(0); /* �
- 1
- 2
- 3
- 4
前往页