娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

LPC1768里的SPI驅動示例——基于SST25VF016B

發布者:EnchantingEyes最新更新時間:2021-10-14 來源: eefocus關鍵字:LPC1768  SPI驅動  SST25VF016B 手機看文章 掃描二維碼
隨時隨地手機看文章

這里有個坑,我的路虎開發板原理圖上是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();                     //使能片選信號 

[1] [2]
關鍵字:LPC1768  SPI驅動  SST25VF016B 引用地址:LPC1768里的SPI驅動示例——基于SST25VF016B

上一篇:ARM體系結構之點亮LED燈
下一篇:LPC1788的spi使用

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

隨便看看

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 清新县| 库伦旗| 杂多县| 彝良县| 大竹县| 巨野县| 庆元县| 融水| 鹤岗市| 岑巩县| 贡山| 克山县| 保德县| 海宁市| 沂水县| 徐闻县| 资中县| 万州区| 佛坪县| 大安市| 庆安县| 枞阳县| 定南县| 黄山市| 河西区| 股票| 常山县| 佳木斯市| 耿马| 翁源县| 天峨县| 犍为县| 虹口区| 孙吴县| 壶关县| 双江| 漯河市| 舟山市| 绥江县| 潮州市| 灵丘县|