這里有個坑,我的路虎開發板原理圖上是AT45DB161這樣的芯片,實際上絲印卻是SST25VF016B,這兩個器件都是存儲設備,但是它們不是pin對pin的,這里大家需要注意下?。?!
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
* File Name : spi_flash.h
* Author : MCD Application Team
* Version : V2.0.3
* Date : 09/22/2008
* Description : Header for spi_flash.c file.
********************************************************************************
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __SPI_FLASH_H__
#define __SPI_FLASH_H__
/* Includes ------------------------------------------------------------------*/
#include "lpc17xx.h"
#include "def.h"
typedef enum
{
Clear_4_K = 0,
Clear_32_K = 1,
Clear_64_K = 2,
Clear_ALL_FLASH = 3,
}Block_Cnt;
/* Exported macro ------------------------------------------------------------*/
/* Select SPI FLASH: Chip Select pin low P0.16 */
#define CS_LOW() LPC_GPIO0->FIOCLR = (1<<16) //GPIO_ResetBits(GPIO_CS, GPIO_Pin_CS)
/* Deselect SPI FLASH: Chip Select pin high */
#define CS_HIGH() LPC_GPIO0->FIOSET = (1<<16) //GPIO_SetBits(GPIO_CS, GPIO_Pin_CS)
void SPI_FLASH_Init(void);
void Read_ID(void);
void Read_Data(long add,u16 cnt,u8 *buff);
u8 Read_State_Register(void);
void Write_State_Register(u8 dat);
void Write_Mul_Byte(u32 add,u8 *buff,u32 cnt);
void Block_Clear(Block_Cnt flag,u32 add);
#endif /* __SPI_FLASH_H */
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************
本文在STM32F103上實現SSH25的驅動,實現數據的寫入和讀?。?p>1:此驅動未加擦除時候是否擦除成功的判斷,一般寫入FLASH不成功的最大原因就是擦除不成功,
所以一般特選FLASH里面的一個地址存儲一個特征字,比如0x12,當執行完操作擦除命令后,
去判斷這個特征字是否被擦除為0xff,如果擦除成功,執行寫指令,當然,也可以進行CRC校驗,
判斷寫入和讀取的是否一致;
2:FLASH的寫入時,避免被中斷打斷;
---------------------
作者:恰馮同學年少
來源:CSDN
原文:https://blog.csdn.net/golf_research/article/details/52133604
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "sst25VF016b.h"
#include "lpc17xx_spi.h"
#include "lpc17xx_libcfg.h"
#include "lpc17xx_pinsel.h"
#include "lpc17xx_gpio.h"
#include "def.h"
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void delay_us(int a)
{
int i=a*25;
while(i--);
}
/*******************************************************************************
* Function Name : SPI_FLASH_Init
* Description : Initializes the peripherals used by the SPI FLASH driver.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void SPI_FLASH_Init(void)
{
/*
* Initialize SPI pin connect
* P0.15 - SCK;
* P0.16 - SSEL - used as GPIO
* P0.17 - MISO
* P0.18 - MOSI
*/
PINSEL_CFG_Type PinCfg;
SPI_CFG_Type SPI_ConfigStruct;
PinCfg.Funcnum = 3;
PinCfg.OpenDrain = 0;
PinCfg.Pinmode = 0;
PinCfg.Portnum = 0;
PinCfg.Pinnum = 15;
PINSEL_ConfigPin(&PinCfg);
PinCfg.Pinnum = 17;
PINSEL_ConfigPin(&PinCfg);
PinCfg.Pinnum = 18;
PINSEL_ConfigPin(&PinCfg);
// PinCfg.Pinnum = 16;
// PinCfg.Funcnum = 0;
// PINSEL_ConfigPin(&PinCfg);
LPC_GPIO0->FIODIR|=(1<<16); //CS引腳配置為輸出(默認為輸入)
/* Deselect the FLASH: Chip Select high */
CS_HIGH();
// initialize SPI configuration structure to default
SPI_ConfigStructInit(&SPI_ConfigStruct);
// Initialize SPI peripheral with parameter given in structure above
SPI_Init(LPC_SPI, &SPI_ConfigStruct);
}
/*SST25發送一個字節的數據*/
u8 SST25_Send_Byte(u8 dat)
{
LPC_SPI->SPDR = dat; //--- 向SPI寫數據 ---
while(0 == (LPC_SPI->SPSR & (1<<7))); //--- 等待SPI發送完畢 ---
return(LPC_SPI->SPDR);
}
/*SST25讀取一個字節的數據*/
u8 SST25_Receive_Byte(void)
{
return SST25_Send_Byte(0xff);
}
/*讀狀態寄存器*/
u8 Read_State_Register(void)
{
u8 flag = 0;
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x05); //發送讀狀態寄存器操作碼0x05*/
flag = SST25_Receive_Byte();
CS_HIGH(); //禁止片選信號
return flag;
}
/*等待內部擦除或者編程操作結束*/
void Wait_Busy_Clear(void)
{
while((Read_State_Register()&0x01) != 0x00);
}
/*寫狀態寄存器*/
void Write_State_Register(u8 dat)
{
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x50); //發送寫狀態寄存器使能操作碼0x50
CS_HIGH(); //禁止片選信號
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x01); //發送寫狀態寄存器操作碼0x01
SST25_Send_Byte(dat); //寫狀態寄存器為0x00
CS_HIGH(); //禁止片選信號
Wait_Busy_Clear();
}
/*寫使能操作*/
void Write_Enable(void)
{
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x06); //發送寫使能操作碼0x06
CS_HIGH(); //禁止片選信號
}
/*寫禁止操作*/
void Write_Disable()
{
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x04); //發送寫使能操作碼0x04
CS_HIGH(); //禁止片選信號
}
/* 讀操作:0x03 */
void Read_Data(long add,u16 cnt,u8 *buff)
{
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x03); //發送寫使能操作碼0x03
SST25_Send_Byte(add>>16);//發送存儲地址,24位
SST25_Send_Byte(add>>8); //發送存儲地址,24位
SST25_Send_Byte(add); //發送存儲地址,24位
for(;cnt>0;cnt--)
*(buff++) = SST25_Receive_Byte();
CS_HIGH(); //禁止片選信號
}
/* 高速讀:0x0B */
void Read_High_Speed_Data(u32 add,u16 cnt,u8 *buff)
{
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x0b); //發送寫使能操作碼0x0b
SST25_Send_Byte(add>>16);//發送存儲地址,24位
SST25_Send_Byte(add>>8); //發送存儲地址,24位
SST25_Send_Byte(add); //發送存儲地址,24位
SST25_Send_Byte(0x00); //發送一個空周期
for(;cnt>0;cnt--)
*(buff++) = SST25_Receive_Byte();
CS_HIGH(); //禁止片選信號
}
/* 寫單個字節操作,字節編程:0x02 */
void Write_Byte(u32 add,u8 dat)
{
Write_Enable(); //寫使能
CS_LOW(); //使能片選信號
SST25_Send_Byte(0x02); //發送字節編程操作碼0x02*/
SST25_Send_Byte(add>>16);//發送存儲地址,24位
SST25_Send_Byte(add>>8); //發送存儲地址,24位
SST25_Send_Byte(add); //發送存儲地址,24位
SST25_Send_Byte(dat); //發送寫入的數據
CS_HIGH(); //禁止片選信號
Wait_Busy_Clear();
}
/* 寫多個字節操作,AAI編程:0xAD */
void Write_Mul_Byte(u32 add,u8 *buff,u32 cnt)
{
u32 i = 0;
Write_Enable(); //寫使能
CS_LOW(); //使能片選信號
SST25_Send_Byte(0xad); //發送AAI編程操作碼0xad*/
SST25_Send_Byte(add>>16);//發送存儲地址,24位
SST25_Send_Byte(add>>8); //發送存儲地址,24位
SST25_Send_Byte(add); //發送存儲地址,24位
SST25_Send_Byte(buff[0]);//發送寫入的數據
SST25_Send_Byte(buff[1]);//發送寫入的數據
CS_HIGH(); //禁止片選信號
i = 2;
while(i delay_us(10); CS_LOW(); //使能片選信號 SST25_Send_Byte(0xad); //發送AAI編程操作碼0xad*/ SST25_Send_Byte(buff[i++]);//發送寫入的數據 SST25_Send_Byte(buff[i++]);//發送寫入的數據 CS_HIGH(); //禁止片選信號 } delay_us(10); Write_Disable(); //退出AAI模式 delay_us(10); Wait_Busy_Clear(); //等待寫結束 } /*4k扇區擦除或者32k塊擦除或者64k塊擦除*/ const u8 bclr_cmd[]={0x20,0x52,0xd8,0x60}; void Block_Clear(Block_Cnt flag,u32 add) { if(flag<4) { Write_Enable(); //寫使能 CS_LOW(); //使能片選信號 SST25_Send_Byte(bclr_cmd[flag]); //發送扇區擦除操作碼0x20 SST25_Send_Byte(add>>16);//發送存儲地址,24位 SST25_Send_Byte(add>>8); //發送存儲地址,24位 SST25_Send_Byte(add); //發送存儲地址,24位 CS_HIGH(); //禁止片選信號 Wait_Busy_Clear(); //等待寫結束 } } u8 ID[3];//0xBF2541 /* 讀設備ID:0x9F */ void Read_ID(void) { CS_LOW(); //使能片選信號
上一篇:ARM體系結構之點亮LED燈
下一篇:LPC1788的spi使用
- 熱門資源推薦
- 熱門放大器推薦
設計資源 培訓 開發板 精華推薦
- AD8604ARQZ 低側運算放大器電流監視器的典型應用
- TG-5021CG_CC1020,用于無線應用的 CC1020 低功耗射頻收發器的 14.7456 MHz 外部振蕩電路
- RPI-A-橫版-分享工程_retroarch 開源掌機
- LT8570IMS8E-1 1MHz VFD(真空熒光顯示器)電源開關的典型應用
- DC427B-A,使用 LTC1966CMS8 RMS 至 DC 轉換器的演示板
- 【立創開發板】梁山派游戲機
- AM2G-1207DH30Z ±7.2V 2 瓦 DC-DC 轉換器的典型應用,用于開/關控制應用
- LTC4269-2 的典型應用 - IEEE 802.3at 高功率 PD 和具有 AUX 支持的同步正向控制器
- 老王0.8元oled屏
- Sg2525A穩壓脈寬調制器典型應用電路