【华大测评】+FLASH读写及字库构建测试
在HC32F460的开发板上,提供了一个SPI接口的W25Q64存储芯片,由于其存储容量较大,故适宜做字库或图库来使用。W25Q64的接口原理图见图1所示,其占用的MCU引脚如下:SCLK---PC6SL-- PC7IO0-- PD8IO1-- PD9IO2-- PD10IO3-- PD11 图1W25Q64接口在结合OLED 屏及独立按键的情况下,我们可以将其构建为一个中文字库。OLED 屏的接口原理图如图2所示,其占用的MCU引脚如下:SCL---PD0SDA--- PD1 图2OLED 屏接口
独立按键的接口原理图如图3所示,其占用的MCU引脚如下:KEY0---PD12KEY1---PD13KEY2---PD14KEY3---PA4
图3独立按键接口
实现FLASH读写及字库构建测试的关键程序如下:
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"HC32F460 TEST",16);
OLED_ShowString(0,2,"OLED & W25Q64",16);
Ddl_Delay1ms(1000u);
OLED_Clear();
OLED_ShowCHinese(0,0,3);
OLED_ShowCHinese(16,0,4);
OLED_ShowCHinese(32,0,5);
OLED_ShowCHinese(48,0,6);
OLED_ShowCHinese(64,0,7);
OLED_ShowCHinese(0,2,8);
OLED_ShowCHinese(16,2,9);
OLED_ShowCHinese(32,2,10);
OLED_ShowCHinese(48,2,11);
OLED_ShowCHinese(64,2,12);
PORT_Init(SPI_NSS_PORT, SPI_NSS_PIN, &stcPortInit);
SPI_NSS_HIGH();
Sw2_Init();
Spi_Config();
bufferLen = (uint16_t)sizeof(txBuffer);
while (1)
{
if (1u == u8ExIntFlag)
{
OLED_Clear();
u8ExIntFlag = 0u;
LED0_OFF();
LED1_OFF();
memset(rxBuffer, 0l, sizeof(rxBuffer));
SpiFlash_Erase4KbSector(flashAddr);
SpiFlash_WritePage(flashAddr, (uint8_t*)&txBuffer, bufferLen);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer, bufferLen);
if (memcmp(txBuffer, rxBuffer, (uint32_t)bufferLen) != 0)
{
LED0_ON();
OLED_ShowString(0,2,"W25Q64 NO ",16);
}
else
{
LED1_ON();
OLED_ShowString(0,2,"W25Q64 OK ",16);
Ddl_Delay1ms(1000u);
for(i=0;i<16;i++)
{
OLED_ShowChar(i*8,0,txBuffer,16);
}
for(i=0;i<16;i++)
{
OLED_ShowChar(i*8,2,txBuffer,16);
}
}
Ddl_Delay1ms(1000u);
OLED_Clear();
flashAddr += FLASH_SRCTOR_SIZE;
if (flashAddr >= FALSH_MAX_ADDR)
{
flashAddr = 0u;
}
memset(rxBuffer, 0l, sizeof(rxBuffer));
SpiFlash_Erase4KbSector(flashAddr);
for(i=0;i<160;i++)
{
rxBuffer=Hzk;
}
SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer, 160);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer, 160);
for(i=0;i<5;i++)
{
for(j=0;j<32;j++)
{
Hzm=rxBuffer;
}
OLED_ShowCHinesel(i*16,0);
}
for(i=0;i<160;i++)
{
rxBuffer=Hzk;
}
flashAddr=flashAddr+160;
SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer, 160);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer, 160);
for(i=0;i<5;i++)
{
for(j=0;j<32;j++)
{
Hzm=rxBuffer;
}
OLED_ShowCHinesel(i*16,2);
}
}
}
经编译下载,该程序的运行效果如图4~图7所示。图4 起始界面
图5 W25Q64基本测试
图6 信息读写测试
图7 字库读写测试
实现一维数组汉字显示的函数为:void OLED_ShowCHinesel(uint8_t x, uint8_t y)
{
uint8_t t;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzm,OLED_DATA);
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzm,OLED_DATA);
}
}
字库如何跟字的编码对上的啊? 598330983 发表于 2020-10-4 17:30
字库如何跟字的编码对上的啊?
小库按顺序号,大库用索引表,总之是建立一个一一对应的关系。 操作w25q64 flash的代码也分享一下可以吗 长啸震谷 发表于 2020-12-23 11:40
操作w25q64 flash的代码也分享一下可以吗
回头找找看,时间比较长了。 jinglixixi 发表于 2020-12-23 12:40
回头找找看,时间比较长了。
好的,多谢多谢 长啸震谷 发表于 2020-12-23 13:03
好的,多谢多谢
好像是这个,仅供参考。
jinglixixi 发表于 2020-12-23 15:53
好像是这个,仅供参考。
多谢多谢。我写的读取spi flash id 一直是oxffff。我对比下你写的接口{:tongue:} 谢谢分享,标记一下
页:
[1]