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);