打印
[综合信息]

【华大测评】+FLASH读写及字库构建测试

[复制链接]
1578|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jinglixixi|  楼主 | 2020-10-3 00:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HC32F460的开发板上,提供了一个SPI接口的W25Q64存储芯片,由于其存储容量较大,故适宜做字库或图库来使用。
W25Q64的接口原理图见图1所示,其占用的MCU引脚如下:
SCLK---PC6
SL-- PC7
IO0-- PD8
IO1-- PD9
IO2-- PD10
IO3-- PD11
1  W25Q64接口

在结合OLED 屏及独立按键的情况下,我们可以将其构建为一个中文字库。
OLED 屏的接口原理图如图2所示,其占用的MCU引脚如下:
SCL---PD0
SDA--- PD1
                        
2  OLED 屏接口

独立按键的接口原理图如图3所示,其占用的MCU引脚如下:
KEY0---PD12
KEY1---PD13
KEY2---PD14
KEY3---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[0], bufferLen);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], 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[i],16);
}      
for(i=0;i<16;i++)
{
OLED_ShowChar(i*8,2,txBuffer[16+i],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[i]=Hzk[i/16+6][i%16];
}

SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer[0], 160);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], 160);
for(i=0;i<5;i++)
{
for(j=0;j<32;j++)
{
Hzm[j]=rxBuffer[i*32+j];
}
OLED_ShowCHinesel(i*16,0);
}
for(i=0;i<160;i++)
{
rxBuffer[i]=Hzk[i/16+16][i%16];
}
flashAddr=flashAddr+160;
SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer[0], 160);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], 160);
for(i=0;i<5;i++)
{
for(j=0;j<32;j++)
{
Hzm[j]=rxBuffer[i*32+j];
}
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[t],OLED_DATA);
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzm[16+t],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的代码也分享一下可以吗

使用特权

评论回复
5
jinglixixi|  楼主 | 2020-12-23 12:40 | 只看该作者
长啸震谷 发表于 2020-12-23 11:40
操作w25q64 flash的代码也分享一下可以吗

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

使用特权

评论回复
6
长啸震谷| | 2020-12-23 13:03 | 只看该作者
jinglixixi 发表于 2020-12-23 12:40
回头找找看,时间比较长了。

好的,多谢多谢

使用特权

评论回复
7
jinglixixi|  楼主 | 2020-12-23 15:53 | 只看该作者

好像是这个,仅供参考。

main.rar

5.92 KB

使用特权

评论回复
8
长啸震谷| | 2020-12-23 17:31 | 只看该作者
jinglixixi 发表于 2020-12-23 15:53
好像是这个,仅供参考。

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

使用特权

评论回复
9
lrzxc1| | 2021-5-14 14:38 | 只看该作者
谢谢分享,标记一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

464

主题

2780

帖子

38

粉丝