這里有個坑,我的路虎開發板原理圖上是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的驅動,實現數據的寫入和讀取:
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使用
推薦閱讀
史海拾趣
為了進一步推動其技術在建筑行業的應用,EnOcean發起并建立了EnOcean聯盟。該聯盟由來自建筑行業的400多家公司組成,致力于推廣基于EnOcean無線標準的免維護無線解決方案。通過與聯盟成員的合作,EnOcean不斷拓展其市場份額,并為智慧樓宇及能源管理提供更穩定的硬件解決方案。
ESS科技公司的創始人在1984年創建了這家位于美國加利福尼亞州的公司,起初專注于將音響壓縮重建技術應用于電子音響圖書和問候卡。然而,隨著個人電腦的普及和多媒體市場的快速增長,ESS決定調整戰略,全力發展個人電腦音頻技術。1993年,ESS推出了其首批PC音頻半導體產品ES488,這是一個12位的單聲道音質硅片。隨后,ESS不斷推出新產品,如ES688,一個16位立體音質硅片,這些產品為ESS帶來了可觀的收益。1995年,ESS成功在美國納斯達克上市,標志著公司進入了一個全新的發展階段。
長運通注重與高校和研究機構的合作,積極引進和培養人才。公司與電子科技大學、西安電子科技大學等知名高校建立了緊密的合作關系,共同開展技術研發和人才培養。通過與高校的合作,長運通不僅獲得了更多的技術資源支持,也為公司培養了一批高素質的研發人才。這些人才為公司的發展提供了強有力的支撐。
某蘇州半導體公司自成立以來就堅持國際化戰略,積極拓展海外市場。公司擁有一支高素質的研發團隊和技術人員隊伍,不斷引進國際先進技術和設備,提高產品質量和競爭力。同時,公司積極參與國際交流與合作,與國際知名半導體企業建立了長期穩定的合作關系。這些舉措使公司在國際市場上獲得了良好的聲譽和地位,產品遠銷歐美、日韓等國家和地區。隨著公司規模的不斷擴大和實力的不斷增強,某蘇州半導體公司將繼續秉承國際化戰略,推動公司向更高層次、更廣領域發展。
這些故事展示了蘇州半導體公司在不同領域和方面的發展和成就。這些公司憑借自身的技術實力、創新能力和市場洞察力,在激烈的競爭中脫穎而出,成為電子行業的佼佼者。
在電子產品市場競爭激烈的背景下,Alpha (Taiwan)公司始終堅持品質至上的原則。公司建立了嚴格的質量管理體系,從原材料采購到生產流程,再到產品出廠,每一個環節都進行嚴格把控。同時,公司還定期對員工進行品質意識培訓,確保每一位員工都能充分認識到品質對于公司發展的重要性。正是憑借這種對品質的執著追求,Alpha (Taiwan)公司的電子產品在市場上贏得了良好的口碑,贏得了眾多客戶的信賴。
誰用74HC245做過s51的下載線......希望大蝦們關注一下哈.......(急) 我用74HC245做的S51并行下載線, 怎么用聶忠強寫的那軟件燒寫時,檢測不到器件...... 如果有那位大俠用過,希望大蝦能把郵箱留下 。。。 哈哈......小弟一點點要求........謝謝.... 希望大蝦幫幫忙.....小弟....先謝了..... [ 本帖最后由 wang ...… 查看全部問答∨ |
疊拓(原迪易通)信息技術有限公司 (Tieto),成立于1968年,是一家北歐的從事軟件解決方案的全外資集團公司,分別在赫爾辛基和斯德哥爾摩證券交易所掛牌。是綜合實力北歐地區第一,歐洲前三的IT業務供應商。 請將簡歷發送到 xiaoli.yang@tieto.co ...… 查看全部問答∨ |
isd1420語音芯片通過編程可以實現分段錄放音,循環放音等功能。 我今天編了下,只實現了分段錄音的功能,錄完之后怎么讓它把多段錄音一次性給放出來呢?弄不出來,做過的人請教下… 查看全部問答∨ |
|
我采用ads7843進行觸摸屏數據轉換,DOUT腳始終是高電平,采集的數據始終是同樣的值8190,8190(12位 最大值) 郁悶中 ,不知如何解決,請用過ads7843的朋友指點一二。 下面是程序中讀ads7843數據部分。 // A/D 通道選擇命令字和工作寄存器 #def ...… 查看全部問答∨ |
如題 中興通訊 西安研究所 月薪:4500-7000,面談 如有興趣, 請電話聯系:029-88723851 郵件:bi.zehongxa@zte.com.cn 崗位要求: 嵌入式開發。 設備驅動開發。 要求:熟悉c ...… 查看全部問答∨ |
在程序中作循環 執行時間比較長 若循環次數少 則改變的數組中個數少 若多加兩次循環 改變的個數就多 不知道是不是運行時ram占用過大 地址沖突? 如何看程序運行占用的ram?… 查看全部問答∨ |
有8個數碼管,每4個為一組,使用動態掃描來實現方法一:使用兩個浮點變量作為參數 void show(float digitron1,float digitron0); 在函數里面分別去digitron1、digitron0的各個位的數值,然后通 ...… 查看全部問答∨ |
今天發張單片機連接 4x3 數字鍵盤的電路,作者是美國電工羅伯辛海。很多應用中,都需要接一個用單片機控制的數字鍵盤,傳統方法是用很多I/O引腳,例如接一個數字快輸盤就要7個I/O腳。在這個電路中,只需要2個I/O 引腳就可以了。 大多數時鐘I/O都 ...… 查看全部問答∨ |