|
发表于 2011-7-7 19:02:54
|
显示全部楼层
前几天刚好也用了这个办法将字库刷到SPI Flash 中了, 用的是Winbond的W25Q16:
![](http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_655637VIWNME.JPG)
(原文件名:001.JPG)
文字都是读取Flash之后显示的 12x12宋体
![](http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_655638FDCE7I.JPG)
(原文件名:001.JPG)
![](http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_655639KD2ASA.JPG)
(原文件名:001.JPG)
虽然和SST的驱动不一样,还是上传个SPI Flash 的驱动 (MCU:STM32, 使用硬件SPI接口)
u8 W25Q_SendByte(u8 byte)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI2, byte);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
return SPI_I2S_ReceiveData(SPI2);
}
u8 W25Q_ReadID(void)
{
u8 Temp = 0;
SPI2_CS_L(); //片选
W25Q_SendByte(CODE_ReleacePowerDown_DeviceID);
W25Q_SendByte(CODE_DummyByte);
W25Q_SendByte(CODE_DummyByte);
W25Q_SendByte(CODE_DummyByte);
Temp=W25Q_SendByte(CODE_DummyByte); //W25Q16: 0x14
SPI2_CS_H();
return Temp;
}
void W25Q_ReadUniID(u8 *W25Q_uID)
{
SPI2_CS_L(); //片选
W25Q_SendByte(CODE_ReadUniID);
W25Q_SendByte(CODE_DummyByte);
W25Q_SendByte(CODE_DummyByte);
W25Q_SendByte(CODE_DummyByte);
W25Q_SendByte(CODE_DummyByte);
*W25Q_uID=W25Q_SendByte(CODE_DummyByte);
W25Q_uID++;
*W25Q_uID=W25Q_SendByte(CODE_DummyByte);
W25Q_uID++;
*W25Q_uID=W25Q_SendByte(CODE_DummyByte);
W25Q_uID++;
*W25Q_uID=W25Q_SendByte(CODE_DummyByte);
SPI2_CS_H();
}
void W25Q_ReadMultiBytes(u8* pBuffer, u32 ReadAddr, u16 ByteNum)
{
SPI2_CS_L();
W25Q_SendByte(CODE_FastReadData);
W25Q_SendByte((ReadAddr & 0xFF0000) >> 16);
W25Q_SendByte((ReadAddr& 0xFF00) >> 8);
W25Q_SendByte(ReadAddr & 0xFF);
W25Q_SendByte(CODE_DummyByte);
while(ByteNum--)
{
*pBuffer= W25Q_SendByte(CODE_DummyByte);
pBuffer++;
}
SPI2_CS_H();
}
void W25Q_Busy(void)
{
u8 SReg = 0;
SPI2_CS_L();
W25Q_SendByte(CODE_ReadStatusRegister);
do{
SReg = W25Q_SendByte(CODE_DummyByte);
//----------------------------
//bit 7 6 5 4 3 2 1 0
// Busy
} while((SReg & 0x01) == 0x01);
SPI2_CS_H();
}
void W25Q_ChipErase(void)
{
SPI2_CS_L();
W25Q_SendByte(CODE_WriteEnable);
SPI2_CS_H();
SPI2_CS_L();
W25Q_SendByte(CODE_ChipErase);
SPI2_CS_H();
W25Q_Busy();
}
void W25Q_WriteBytes(u8 pBuffer, u32 WriteAddr)
{
SPI2_CS_L();
W25Q_SendByte(CODE_WriteEnable);
SPI2_CS_H();
SPI2_CS_L();
W25Q_SendByte(CODE_PageProgram);
W25Q_SendByte((WriteAddr & 0xFF0000) >> 16);
W25Q_SendByte((WriteAddr & 0xFF00) >> 8);
W25Q_SendByte(WriteAddr & 0xFF);
W25Q_SendByte(pBuffer);
SPI2_CS_H();
}
void W25Q_WritePageBytes(u8* pBuffer, u32 WriteAddr, u16 ByteNum)
{
SPI2_CS_L();
W25Q_SendByte(CODE_WriteEnable);
SPI2_CS_H();
SPI2_CS_L();
W25Q_SendByte(CODE_PageProgram);
W25Q_SendByte((WriteAddr & 0xFF0000) >> 16);
W25Q_SendByte((WriteAddr & 0xFF00) >> 8);
W25Q_SendByte(WriteAddr & 0xFF);
while(ByteNum--)
{
W25Q_SendByte(*pBuffer);
pBuffer++;
}
SPI2_CS_H();
W25Q_Busy();
} |
|