jinglixixi 发表于 2020-10-3 00:13

【华大测评】+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

字库如何跟字的编码对上的啊?

jinglixixi 发表于 2020-10-4 19:16

598330983 发表于 2020-10-4 17:30
字库如何跟字的编码对上的啊?

小库按顺序号,大库用索引表,总之是建立一个一一对应的关系。

长啸震谷 发表于 2020-12-23 11:40

操作w25q64 flash的代码也分享一下可以吗

jinglixixi 发表于 2020-12-23 12:40

长啸震谷 发表于 2020-12-23 11:40
操作w25q64 flash的代码也分享一下可以吗

回头找找看,时间比较长了。

长啸震谷 发表于 2020-12-23 13:03

jinglixixi 发表于 2020-12-23 12:40
回头找找看,时间比较长了。

好的,多谢多谢

jinglixixi 发表于 2020-12-23 15:53

长啸震谷 发表于 2020-12-23 13:03
好的,多谢多谢

好像是这个,仅供参考。

长啸震谷 发表于 2020-12-23 17:31

jinglixixi 发表于 2020-12-23 15:53
好像是这个,仅供参考。

多谢多谢。我写的读取spi flash id 一直是oxffff。我对比下你写的接口{:tongue:}

lrzxc1 发表于 2021-5-14 14:38

谢谢分享,标记一下
页: [1]
查看完整版本: 【华大测评】+FLASH读写及字库构建测试