SPI FLASH 读写时序操作

#include

#include "PPP_SysInit.h"
#include "delay.h"

#include "usart.h"


#define Status_Register_Opcode 0xD7
#define Device_ID_Opcode 0x9F

#define SPI_CS_1 \
{\
delay_us(2);\
GPIO_SetBits(GPIOA,GPIO_Pin_4);\
delay_us(2);\
}\
while (0);\


#define SPI_CS_0 \
{\
delay_us(2);\
GPIO_ResetBits(GPIOA,GPIO_Pin_4);\
delay_us(2);\
}\
while (0);\

#define SPI_SCK_1 GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define SPI_SCK_0 GPIO_ResetBits(GPIOA,GPIO_Pin_5)

#define SPI_SI_1 GPIO_SetBits(GPIOA,GPIO_Pin_7)
#define SPI_SI_0 GPIO_ResetBits(GPIOA,GPIO_Pin_7)

#define SPI_SO GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)

#define SPI_RES_1 GPIO_SetBits(GPIOC,GPIO_Pin_4)
#define SPI_WP_1 GPIO_SetBits(GPIOC,GPIO_Pin_5)


////////////////////////////////////////////////////////////////////
//#define SPI_CS_1 GPIOC->BSRR = GPIO_Pin_10;
//#define SPI_CS_0 GPIOC->BRR = GPIO_Pin_10;

//#define SPI_SCK_1 GPIOC->BSRR = GPIO_Pin_11;
//#define SPI_SCK_0 GPIOC->BRR = GPIO_Pin_11;

//#define SPI_SI_1 GPIOC->BSRR = GPIO_Pin_12;
//#define SPI_SI_0 GPIOC->BRR = GPIO_Pin_12;

//#define SPI_SO_1 GPIOD->BSRR = GPIO_PIN_2;
//#define SPI_SO_0 GPIOD->BRR = GPIO_PIN_2;
///////////////////////////////////////////////////////////////////////
const u8 PCB_Address=0xff;
const u8 TEXT_TO_SEND[]="DMA TEST:IS IT WORKING?";
unsigned char DF_buffer[528];
void delayspi(unsigned char i)
{
unsigned char j,k;
for(j=0;jfor(k=0;k<2;k++);
}



void SPI_IO_INIT()
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);

// CS_SCK_SI_outpnut();
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);

// SO_intpnut();

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
// GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStruct);
SPI_WP_1;
SPI_RES_1;
SPI_CS_1;
SPI_SCK_1;
SPI_SI_1;
}

void SPI_WriteByte(unsigned char wByte)//--------------OK
{
unsigned char i;
for(i=0;i<8;i++)
{
if((wByte<{
SPI_SI_1;
}
else
{
SPI_SI_0;
}
SPI_SCK_0;
SPI_SCK_1;
}
}

unsigned char SPI_ReadByte(void)
{
unsigned char i,j,rByte=0;
for(i=0;i<8;i++)
{
SPI_SCK_0;
SPI_SCK_1;
j=SPI_SO;
rByte<<=1;
if(j)rByte=rByte|0x01;
// rByte<<=1;
}
return rByte;

}

void DF_wait_busy(void)
{
unsigned char state_reg=0x00;
SPI_CS_0;
SPI_WriteByte(0xD7);
while((state_reg&0x80) == 0)
{
state_reg = SPI_ReadByte();
}
SPI_CS_1;
}

void DF_page_erase(unsigned int page)
{


DF_wait_busy();
SPI_CS_0;
SPI_WriteByte(0x81);
SPI_WriteByte((unsigned char)(page >> 9));
SPI_WriteByte((unsigned char)(page << 0));
SPI_WriteByte(0x00);
SPI_CS_1;
}

void DF_write_page(unsigned char buffer, unsigned int page)
{
unsigned int i;
DF_wait_busy();
SPI_CS_0;
if(buffer == 1)
SPI_WriteByte(0x84);
else
SPI_WriteByte(0x87);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
for (i=0;i<264;i++)
SPI_WriteByte(DF_buffer[i]);
SPI_CS_1;
SPI_CS_0;
if(buffer == 1)
SPI_WriteByte(0x83);
else
SPI_WriteByte(0x86);
SPI_WriteByte((unsigned char)(page>>7));
SPI_WriteByte((unsigned char)(page<<1));
SPI_WriteByte(0x00);
SPI_CS_1;
DF_wait_busy();
}

void DF_read_page(unsigned char buffer, unsigned int page)
{
unsigned int i;
SPI_CS_0;
if(buffer == 1)
SPI_WriteByte(0x53);
else
SPI_WriteByte(0x55);
SPI_WriteByte((unsigned char)(page >> 7));
SPI_WriteByte((unsigned char)(page << 1));
SPI_WriteByte(0x00);
SPI_CS_1

DF_wait_busy();
SPI_CS_0

if(buffer == 1)
SPI_WriteByte(0xD4);
else
SPI_WriteByte(0xD6);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);
SPI_WriteByte(0x00);

for (i=0;i<264;i++)
{
DF_buffer[i] = SPI_ReadByte();
}
SPI_CS_1;
}


void DF_Manufacturer_and_Device_ID(unsigned char *ID)
{
unsigned char i;
DF_wait_busy();
SPI_CS_0;
SPI_WriteByte(0x9F);
for(i=0;i<4;i++)
{
ID[i] = SPI_ReadByte();
}
SPI_CS_1;
}



int main(void)
{
unsigned int i;
unsigned char Device_ID[4]={0,0,0,0};
SysInit();
SPI_IO_INIT();
DF_Manufacturer_and_Device_ID(Device_ID);
while(1)
{
SPI_WP_1;
DF_wait_busy();
// DF_Manufacturer_and_Device_ID(Device_ID);
DF_page_erase(3);
for(i = 0;i<264;i++)
DF_buffer[i] = i;
DF_write_page(1,3);
for(i = 0;i<264;i++)
DF_buffer[i] = 0;
DF_read_page(1,3);
delay_ms(10);
//// USART_SendData(USART1,TEXT_TO_SEND[2]);
//// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
// if(DF_buffer[0]!=0x00)
// {
// GPIO_SetBits(GPIOD,GPIO_Pin_3);
// delay_ms(1000);
// GPIO_ResetBits(GPIOD,GPIO_Pin_3);
// delay_ms(1000);
// }

// if((Device_ID[0]==0x1F)||(Device_ID[1]==0x24)||(Device_ID[2]==0x00)||(Device_ID[3]==0x01))
// {
// GPIO_SetBits(GPIOD,GPIO_Pin_0);
// GPIO_SetBits(GPIOD,GPIO_Pin_1);
// GPIO_SetBits(GPIOD,GPIO_Pin_2);
// GPIO_SetBits(GPIOD,GPIO_Pin_3);
// delay_ms(1000);
// GPIO_ResetBits(GPIOD,GPIO_Pin_0);
// GPIO_ResetBits(GPIOD,GPIO_Pin_1);
// GPIO_ResetBits(GPIOD,GPIO_Pin_2);
// GPIO_ResetBits(GPIOD,GPIO_Pin_3);
// delay_ms(10

00);
// }
printf("MID0 = %d\t%x\n\r",Device_ID[0],Device_ID[0]);
printf("MID1 = %d\t%x\n\r",Device_ID[1],Device_ID[1]);
printf("MID2 = %d\t%x\n\r",Device_ID[2],Device_ID[2]);
printf("MID3 = %d\t%x\n\r",Device_ID[3],Device_ID[3]);

for (i=0;i<32;i++)
{
printf("DF_buffer[%d] = %d\t%x\n",i, DF_buffer[i], DF_buffer[i]);
delay_ms(1000);
}
for (i=256;i<264;i++)
{
printf("DF_buffer[%d] = %d\t%x\n",i, DF_buffer[i], DF_buffer[i]);
delay_ms(1000);
}
// printf("DF_buffer[0] = %d\t%x\n",DF_buffer[0],DF_buffer[0]);

}
}

相关文档
最新文档