SPI_FLASHCardCSpin*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);//NSS1
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOC,&GPIO_InitStructure);//NSS2
/*DeselecttheFLASH:
ChipSelecthigh*/
NSS1_HIGH();
NSS1_HIGH();
/*SPI1configuration*/
//W25X16:
datainputontheDIOpinissampledontherisingedgeoftheCLK.
//DataontheDOandDIOpinsareclockedoutonthefallingedgeofCLK.
SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode=SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize=SPI_DataSize_8b;
//SPI模式3
//SPI_InitStructure.SPI_CPOL=SPI_CPOL_High;
//SPI_InitStructure.SPI_CPHA=SPI_CPHA_2Edge;
//SPI模式0
SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge;
//软件片选
SPI_InitStructure.SPI_NSS=SPI_NSS_Soft;
//硬件片选
//SPI_InitStructure.SPI_NSS=SPI_NSS_Hard;
SPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_8;//72M/8=9Mhz,供电
SPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial=7;
SPI_Init(SPI1,&SPI_InitStructure);
/*EnableSPI1*/
SPI_Cmd(SPI1,DISABLE);
}
/*********************************************ENDOFFILE**********************/
voidNSS_CS_ENABLE(uint8_tNSS)
{
if(NSS==1){NSS1_LOW();NSS2_HIGH();}
elseif(NSS==2){NSS2_LOW();NSS1_HIGH();}
}
voidNSS_CS_DISABLE()
{
NSS1_HIGH();
NSS2_HIGH();
}
voidSPI_WREN(uint8_tnss)
{
NSS_CS_ENABLE(nss);
SPI_WriteByte(WREN);
NSS_CS_DISABLE();
//Delay_ms
(1);
}
voidSPI_WRDI(uint8_tnss)
{
NSS_CS_ENABLE(nss);
SPI_WriteByte(WRDI);
NSS_CS_DISABLE();
//Delay_ms
(1);
}
voidSPI_EEPROM_WRITE_Start(void)
{
SPI_Cmd(SPI1,ENABLE);
SPI_WREN
(1);
NSS_CS_ENABLE
(1);
SPI_WriteByte(WRSR);
SPI_WriteByte(0X02);
NSS_CS_DISABLE();
SPI_WREN
(2);
NSS_CS_ENABLE
(2);
SPI_WriteByte(WRSR);
SPI_WriteByte(0X02);
NSS_CS_DISABLE();
SPI_Cmd(SPI1,DISABLE);
}
voidSPI_EEPROM_WRITE_END(void)
{
SPI_Cmd(SPI1,ENABLE);
SPI_WRDI
(1);
SPI_WRDI
(2);
SPI_Cmd(SPI1,DISABLE);
}
uint8_tSPI_WriteByte(uint8_tdata)
{
/*LoopwhileDRregisterinnotemplty*/
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
/*SendbytethroughtheSPI1peripheral*/
SPI_I2S_SendData(SPI1,data);
/*Waittoreceiveabyte*/
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
/*ReturnthebytereadfromtheSPIbus*/
returnSPI_I2S_ReceiveData(SPI1);
}
uint8_tSPI_ReadByte(void)
{
return(SPI_WriteByte(Dummy_Byte));
//while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE)==RESET);
//returnSPI_I2S_ReceiveData(SPI1);
}
uint8_tAT25_GetStatus(uint8_tNSS)
{
uint8_ttmp=0;
SPI_WREN(NSS);
NSS_CS_ENABLE(NSS);
SPI_WriteByte(RDSR);
tmp=SPI_ReadByte();
NSS_CS_DISABLE();
returntmp;
}
voidAT25_WaitReady(uint8_tNSS)
{
while((0x01&AT25_GetStatus(NSS))!
=0);
}
/*
单字节操作,读和写
*/
uint8_tAT25_ReadByte(uint32_taddr)
{
uint8_ttmp;
uint8_tnss=1;
if(addr>=(uint32_t)(1024*128*2))
return0;
if(addr>=(uint32_t)(1024*128))
{addr=addr-(uint32_t)(1024*128);nss=2;}
elsenss=1;
SPI_Cmd(SPI1,ENABLE);
AT25_WaitReady(nss);
SPI_WREN(nss);
NSS_CS_ENABLE(nss);
SPI_WriteByte(READ);
SPI_WriteByte((uint8_t)((addr&0x010000)>>16));/*A16*/
SPI_WriteByte((uint8_t)((addr&0x00FF00)>>8));/*A15-A8*/
SPI_WriteByte((uint8_t)(addr&0x0000FF));/*A7-A0*/
tmp=SPI_ReadByte();
NSS_CS_DISABLE();
SPI_Cmd(SPI1,DISABLE);
returntmp;
}
voidAT25_WriteByte(uint8_tdata,uint32_taddr)
{
uint8_tnss=1;
uint32_ttt=1024*128*2;
if(addr>=tt)
return;
if(addr>=(uint32_t)(1024*128))
{addr=addr-(uint32_t)(1024*128);nss=2;}
elsenss=1;
SPI_Cmd(SPI1,ENABLE);
AT25_WaitReady(nss);
SPI_WREN(nss);
NSS_CS_ENABLE(nss);
SPI_WriteByte(WRITE);
SPI_WriteByte((uint8_t)((addr&0x010000)>>16));/*A16*/
SPI_WriteByte((uint8_t)((addr&0x00FF00)>>8));/*A15-A8*/
SPI_WriteByte((uint8_t)(addr&0x0000FF));/*A7-A0*/
SPI_WriteByte(data);
NSS_CS_DISABLE();
SPI_Cmd(SPI1,DISABLE);
}
////////////多字节操作
/**
*@brief将缓冲区中的数据写到I2CEEPROM中
*@param
*@argpBuffer:
缓冲区指针
*@argWriteAddr:
写地址
*@argNumByteToWrite:
写的字节数
*@retval无
*/
voidSPI_EE_BufferWrite(u8*pBuffer,u32WriteAddr,u16NumByteToWrite,uint8_tNSS)
{
u32NumOfPage=0,NumOfSingle=0,Addr=0,count=0;
Addr=WriteAddr%I2C_PageSize;
count=I2C_PageSize-Addr;
NumOfPage=NumByteToWrite/I2C_PageSize;
NumOfSingle=NumByteToWrite%I2C_PageSize;
/*IfWriteAddrisI2C_PageSizealigned*/
if(Addr==0)
{
/*IfNumByteToWriteif(NumOfPage==0)
{
SPI_EE_PageWrite(pBuffer,WriteAddr,NumOfSingle,NSS);
}
/*IfNumByteToWrite>I2C_PageSize*/
else
{
while(NumOfPage--)
{
SPI_EE_PageWrite(pBuffer,WriteAddr,I2C_PageSize,NSS);
WriteAddr+=I2C_PageSize;
pBuffer+=I2C_PageSize;
}
if(NumOfSingle!
=0)
{
SPI_EE_PageWrite(pBuffer,WriteAddr,NumOfSingle,NSS);
}
}
}
/*IfWriteAddrisnotI2C_PageSizealigned*/
else
{
/*IfNumByteToWriteif(NumOfPage==0)
{
SPI_EE_PageWrite(pBuffer,WriteAddr,NumOfSingle,NSS);
}
/*IfNumByteToWrite>I2C_PageSize*/
else
{
NumByteToWrite-=count;
NumOfPage=NumByteToWrite/I2C_PageSize;
NumOfSingle=NumByteToWrite%I2C_PageSize;
if(count!
=0)
{
SPI_EE_PageWrite(pBuffer,WriteAddr,count,NSS);
WriteAddr+=count;
pBuffer+=count;
}
while(NumOfPage--)
{
SPI_EE_PageWrite(pBuffer,WriteAddr,I2C_PageSize,NSS);
WriteAddr+=I2C_PageSize;
pBuffer+=I2C_PageSize;
}
if(NumOfSingle!
=0)
{
SPI_EE_PageWrite(pBuffer,WriteAddr,NumOfSingle,NSS);
}
}
}
}
/**
*@brief在EEPROM的一个写循环中可以写多个字节,但一次写入的字节数
*不能超过EEPROM页的大小,AT24C02每页有8个字节
*@param
*@argpBuffer:
缓冲区指针
*@argWriteAddr:
写地址
*@argNumByteToWrite:
写的字节数
*@retval无
*/
voidSPI_EE_PageWrite(u8*pBuffer,u32WriteAddr,u16NumByteToWrite,uint8_tNSS)
{
SPI_Cmd(SPI1,ENABLE);
AT25_WaitReady(NSS);
SPI_WREN(NSS);
NSS_CS_ENABLE(NSS);
SPI_WriteByte(WRITE);
SPI_WriteByte((uint8_t)((WriteAddr&0x010000)>>16));/*A16*/
SPI_WriteByte((uint8_t)((WriteAddr&0x00FF00)>>8));/*A15-A8*/
SPI_WriteByte((uint8_t)(WriteAddr&0x0000FF));/*A7-A0*/
/*Whilethereisdatatobewritten*/
while(NumByteToWrite--)
{
/*Sendthecurrentbyte*/
SPI_WriteByte(*pBuffer);
/*Pointtothenextbytetobewritten*/
pBuffer++;
}
/*SendSTOPcondition*/
NSS_CS_DISABLE();
SPI_Cmd(SPI1,DISABLE);
}
/**
*@brief从EEPROM里面读取一块数据
*@param
*@argpBuffer:
存放从EEPROM读取的数据的缓冲区指针
*@argWriteAddr:
接收数据的EEPROM的地址
*@argNumByteToWrite:
要从EEPROM读取的字节数
*@retval无
*/
voidSPI_EE_BufferRead(u8*pBuffer,u32ReadAddr,u16NumByteToRead,uint8_tNSS)
{
uint8_tnss=NSS;
SPI_Cmd(SPI1,ENABLE);
AT25_WaitReady(nss);
SPI_WREN(NSS);
NSS_CS_ENABLE(nss);
SPI_WriteByte(READ);
SPI_WriteByte((uint8_t)((ReadAddr&0x010000)>>16));/*A16*/
SPI_WriteByte((uint8_t)((ReadAddr&0x00FF00)>>8));/*A15-A8*/
SPI_WriteByte((uint8_t)(ReadAddr&0x0000FF));/*A7-A0*/
/*Whilethereisdatatoberead*/
while(NumByteToRead)
{
*pBuffer=SPI_ReadByte();
pBuffer++;
NumByteToRead--;
}
/*EnableAcknowledgementtobereadyforanotherreception*/
NSS_CS_DISABLE();
SPI_Cmd(SPI1,DISABLE);
}
//*****wdz*******//
voidSPI_EE_BufferWrite2(u8*pBuffer,u32WriteAddr,u16NumByteToWrite)
{
u32temp=WriteAddr+NumByteToWrite-1;
u32number=WriteAddr+NumByteToWrite-1024*128;
if(temp<1024*128)
{
SPI_EE_BufferWrite(pBuffer,WriteAddr,NumByteToWrite,1);
}
elseif(WriteAddr<1024*128&&temp>=1024*128)
{
SPI_EE_BufferWrite(pBuffer,WriteAddr,NumByteToWrite-number,1);
SPI_EE_BufferWrite(pBuffer+NumByteToWrite-number,0,number,2);
}
elseif(WriteAddr>=1024*128)
{
SPI_EE_BufferWrite(pBuffer,WriteAddr-1024*128,NumByteToWrite,2);
}
}
voidSPI_EE_Buff