LPC 1768のSPI駆動例-SST 25 VF 016 Bベース

8756 ワード

ここに穴があって、私の路虎开発板の原理図の上でAT 45 DB 161のこのようなチップで、実际にはシルクプリントはSST 25 VF 016 Bで、この2つのデバイスはすべてストレージデバイスで、しかしそれらは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>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();                     //       
	SST25_Send_Byte(0x9f);        // ID  
	ID[0] = SST25_Receive_Byte(); //  ID
	ID[1] = SST25_Receive_Byte(); 
	ID[2] = SST25_Receive_Byte();    
	CS_HIGH();                    //       
}
	char SSH_Buff[32];
	#define TEST_STR	"have a good time!"	
	
	SPI_FLASH_Init();
	Read_ID();	
	memset(SSH_Buff,0,sizeof(SSH_Buff));
	Read_Data(0,sizeof(TEST_STR)-1,(u8*)SSH_Buff);
	
	if(strcmp(SSH_Buff,TEST_STR)!=0)
	{
		Write_State_Register(0x00);  //       0x00,     ,        
		Block_Clear(Clear_4_K,0);    //  4K  
		Write_Mul_Byte(0,TEST_STR,sizeof(TEST_STR)-1); //  TEST_STR        0       
		memset(SSH_Buff,0,sizeof(SSH_Buff));
		Read_Data(0,sizeof(TEST_STR)-1,(u8*)SSH_Buff);
		_DBG("Fisrt Wirte:");
	}
	else
	{
		_DBG("Read ok! ");
	}
	_DBG(SSH_Buff);