void SPI_Test(void)
{
uint8_t temp = 22;
SPI_ChipErase();
SPI_PageProgram(0X02,1,temp);
SPI_ReadData(0x02,1);
}
/**写数据,返回读数据**/
uint8_t SPI_SendByte(uint8_t pData)
{
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,pData);
while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI1);
}
void SPI_WriteEN(void)
{
SPI_CS_LOW();
SPI_SendByte(0x06);
SPI_CS_HIGH();
}
/**忙等待**/
void SPI_WaitForWriteEnd(void)
{
uint8_t spi_status = 0;
SPI_CS_LOW();
SPI_SendByte(0x05);
do
{
spi_status = SPI_SendByte(0xff);
}while((spi_status & 0x01) == SET);
SPI_CS_HIGH();
}
/**页写数据**/
void SPI_PageProgram(uint32_t addr,int size,uint8_t data)
{
uint8_t addr1,addr2,addr3;
addr1 = (addr&0xff0000) >> 16;
addr2 = (addr&0xff00) >> 8;
addr3 = (addr&0xff);
SPI_WriteEN();
SPI_CS_LOW();
SPI_SendByte(0X02);
SPI_SendByte(addr1);
SPI_SendByte(addr2);
SPI_SendByte(addr3);
{
SPI_SendByte(data);
}
SPI_CS_HIGH();
SPI_WaitForWriteEnd();
printf("write is ok");
}
/**读数据**/
uint32_t SPI_ReadData(uint32_t addr,int size)
{
uint8_t addr1,addr2,addr3,data;
addr1 = (addr&0xff0000) >> 16;
addr2 = (addr&0xff00) >> 8;
addr3 = (addr&0xff);
SPI_CS_LOW();
SPI_SendByte(0X03);
SPI_SendByte(addr1);
SPI_SendByte(addr2);
SPI_SendByte(addr3);
{
(data) = SPI_SendByte(0XFF);
}
SPI_CS_HIGH();
printf("data=%x",data);
return data;
}
/**4KB擦除**/
void SPI_4SectorErase(uint32_t addr)
{
uint8_t addr1,addr2,addr3;
addr1 = (addr&0xff0000) >> 16;
addr2 = (addr&0xff00) >> 8;
addr3 = (addr&0xff);
SPI_WriteEN();
SPI_WaitForWriteEnd();
SPI_CS_LOW();
SPI_SendByte(0X20);
SPI_SendByte(addr1);
SPI_SendByte(addr2);
SPI_SendByte(addr3);
SPI_CS_HIGH();
SPI_WaitForWriteEnd();
}
/**32KB擦除**/
void SPI_32BlockErase(uint32_t addr)
{
uint8_t addr1,addr2,addr3;
addr1 = (addr&0xff0000) >> 16;
addr2 = (addr&0xff00) >> 8;
addr3 = (addr&0xff);
SPI_WriteEN();
SPI_WaitForWriteEnd();
SPI_CS_LOW();
SPI_SendByte(0X52);
SPI_SendByte(addr1);
SPI_SendByte(addr2);
SPI_SendByte(addr3);
SPI_CS_HIGH();
SPI_WaitForWriteEnd();
}
/**整块擦除**/
void SPI_64BlockErase(uint8_t addr)
{
uint8_t addr1,addr2,addr3;
addr1 = (addr&0xff0000) >> 16;
addr2 = (addr&0xff00) >> 8;
addr3 = (addr&0xff);
SPI_WriteEN();
SPI_WaitForWriteEnd();
SPI_CS_LOW();
SPI_SendByte(0XD8);
SPI_SendByte(addr1);
SPI_SendByte(addr2);
SPI_SendByte(addr3);
SPI_CS_HIGH();
SPI_WaitForWriteEnd();;
}
/**整片擦除**/
void SPI_ChipErase(void)
{
SPI_WriteEN();
SPI_WaitForWriteEnd();
SPI_CS_LOW();
SPI_SendByte(0xC7);
SPI_CS_HIGH();
SPI_WaitForWriteEnd();
}
当执行SPI_test的时候,读到的数据是一直是0xff。不知道为什么,
但是执行下面读ID时读出的结果是正确的。[color=#FF9900][/color]
/**读ID**/
uint32_t SPI_ReadID(void)
{
uint32_t temp,temp0,temp1,temp2,temp3;
SPI_WriteEN();
SPI_CS_LOW();
SPI_SendByte(0X9F);
temp0 = SPI_SendByte(0Xff);
temp1 = SPI_SendByte(0Xff);
temp2 = SPI_SendByte(0Xff);
// temp3 = SPI_SendByte(0Xff);
SPI_CS_HIGH();
temp = (temp0 << 16) | (temp1<< 8) | temp2;
return temp;
}