开发板用的是f030c8t6,w25q16读出来的是EF14,为w25q16的flash,但是写数据之后读出来全是0,请问各位大神是什么原因,我的代码如下
//spi读写函数--模式0
//_data:待发送的数据,如果是接收模式,发送的数据则应该是0xff
//返回值:接收到的数据。如果是发送模式,返回值可以丢弃
u8 SPI1_ReadWriteByte(u8 _data)
{
u8 i;
for(i=0;i<8;i++)
{
if(_data 0x80) //高位在前
{
MOSI_1;
}
else
{
MOSI_0;
}
SCK_1;
_data=_data<<1;
delay_us(2);
if(GPIOA ->IDR 0x01<<6) //判断收到的数据
{
_data=_data | 0X01;
}
SCK_0;
delay_us(2);
}
return _data;
}
//返回值如下:
//0XEF13,表示芯片型号为W25Q80
//0XEF14,表示芯片型号为W25Q16
//0XEF15,表示芯片型号为W25Q32
//0XEF16,表示芯片型号为W25Q64
uint16_t SPI_Flash_ReadID(void)
{
uint32_t Temp = 0;
GPIOA ->ODR =~(0x01<<4);
SPI1_ReadWriteByte(W25X_ManufactDeviceID);//发送读取ID命令
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(0x00);
SPI1_ReadWriteByte(0x00);
Temp|=SPI1_ReadWriteByte(0xFF)<<8;
Temp|=SPI1_ReadWriteByte(0xFF);
GPIOA ->ODR |=0x01<<4;
return Temp;
}
//读取SPI FLASH
//在指定地址开始读取指定长度的数据
//pBuffer:数据存储区
//ReadAddr:开始读取的地址(24bit)
//NumByteToRead:要读取的字节数(最大65535)
void SPI_Flash_Read(uint8_t* pBuffer,uint32_t ReadAddr,uint16_t NumByteToRead)
{
uint16_t i;
GPIOA ->ODR =~(0x01<<4); //使能器件
SPI1_ReadWriteByte(W25X_ReadData); //发送读取命令
SPI1_ReadWriteByte((uint8_t)((ReadAddr)>>16)); //发送24bit地址
SPI1_ReadWriteByte((uint8_t)((ReadAddr)>>8));
SPI1_ReadWriteByte((uint8_t)ReadAddr);
for(i=0;iODR |=0x01<<4;
}
//SPI在一页内写入少于256个字节的数据
//在指定地址开始写入最大256字节的数据
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!
//函数使用的限定WriteAddr/256==(WriteAddr+NumByteToWrite-1)/256
//在用这个函数前已经确认了待写入区域全为0xff
void SPI_Flash_Write_Page(uint8_t* pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
{
uint16_t i;
SPI_FLASH_Write_Enable(); //SET WEL
GPIOA ->ODR =~(0x01<<4); //使能器件
SPI1_ReadWriteByte(W25X_PageProgram); //发送写页命令
SPI1_ReadWriteByte((uint8_t)((WriteAddr)>>16)); //发送24bit地址
SPI1_ReadWriteByte((uint8_t)((WriteAddr)>>8));
SPI1_ReadWriteByte((uint8_t)WriteAddr);
for(i=0;iODR |=0x01<<4; //取消片选
SPI_Flash_Wait_Busy(); //等待写入结束
}