搜索
bottom↓
回复: 36

关于将汉字库写入SPI flash的问题!

[复制链接]

出0入0汤圆

发表于 2011-7-7 16:02:38 | 显示全部楼层 |阅读模式
我有一块路虎的LPC1768开发板,想将点阵汉字库写入板载的SPI Flash里面,用的是串口文件传输,在中断里面直接写入到Flash,可总是前面少部分还正常,后面的就不对了,总是牛头马面的不对应。
这是什么原因呢,波特率我都调到9600了,还是不行
有做过同样案例的大佬吗
给棒棒忙呗!
有完整案例最好!
谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-7-7 16:38:20 | 显示全部楼层
后面的空间写入前有没有 擦除?

出0入0汤圆

 楼主| 发表于 2011-7-7 16:49:03 | 显示全部楼层
回复【1楼】wowbanui
后面的空间写入前有没有 擦除?
-----------------------------------------------------------------------

擦除了,我先片擦再写的!
不是那个原因!

不是写不进去,而是写的值不对

出0入0汤圆

发表于 2011-7-7 16:54:54 | 显示全部楼层
1.可能中间丢失位了,导致后面整个错位
2.有坏块了

出0入0汤圆

 楼主| 发表于 2011-7-7 17:01:35 | 显示全部楼层
我估计第一种可能行大一点!
但是SST25VF016B的写速度应该还是很快的啊
我的串口波特率都设置成9600了,这么慢了呢!

不知道有没有那位做过这种东西!

第二种的可能性不太大
我擦除数据后每一字节每一字节的读出校验过的。

出0入0汤圆

发表于 2011-7-7 17:10:08 | 显示全部楼层
回复【4楼】yulri  
-----------------------------------------------------------------------

可能是串口传输中出错了,我用51做过类似的,最后加入校验就OK了。

我用的校验方法是MCU把收到的数据重新发回PC,PC比较一下,OK了再通知MCU写,错了重发。

出0入0汤圆

 楼主| 发表于 2011-7-7 17:23:30 | 显示全部楼层
回复【5楼】racede  
回复【4楼】yulri  
-----------------------------------------------------------------------
可能是串口传输中出错了,我用51做过类似的,最后加入校验就ok了。
我用的校验方法是mcu把收到的数据重新发回pc,pc比较一下,ok了再通知mcu写,错了重发。
-----------------------------------------------------------------------
你有现成的串口软件吗??
能给我一个吗?
就是你说的那种具有校验功能的串口软件!
994490656@qq.com
谢谢!

出0入0汤圆

发表于 2011-7-7 17:37:53 | 显示全部楼层
可以考虑使用RT_thread,在FLASH上面跑个文件系统,再用zmodem去传文件.
方便得很呀.

出0入4汤圆

发表于 2011-7-7 18:05:51 | 显示全部楼层
如果写整个汉字库,不如买专用的SPI接口字库芯片

价格应该相差不多,而且专用的字库芯片往往有多个分辨率的字体

出0入0汤圆

 楼主| 发表于 2011-7-7 18:10:54 | 显示全部楼层
回复【8楼】physis  
如果写整个汉字库,不如买专用的spi接口字库芯片
价格应该相差不多,而且专用的字库芯片往往有多个分辨率的字体

-----------------------------------------------------------------------

主要是我的开发板上不能再焊接专门的字库芯片了
而且,为了学习也没必要去买专门的字库芯片啊!

出50入255汤圆

发表于 2011-7-7 18:23:11 | 显示全部楼层
注意Flash写入速度问题,

出0入0汤圆

发表于 2011-7-7 18:23:50 | 显示全部楼层
根据楼主说的在串口中断里直接写入F的话, 是否每次写入一个字节? 又猜了几种可能:

1. 写入地址是自增的吗? 这个地址变量类型(即取值范围)够不? (本人不才,曾经犯过类似错误...溢出后回到0了..惭愧..)
2. 楼主用的什么软件发的字库文件? 记住要用二进制格式. 因为如果是字符格式有些特殊数值(0x00, 0x0D, 0x0A ...) 可能会被忽略...而导致错位...

出0入0汤圆

 楼主| 发表于 2011-7-7 18:33:14 | 显示全部楼层
回复【11楼】wowbanui  
根据楼主说的在串口中断里直接写入f的话, 是否每次写入一个字节? 又猜了几种可能:
1. 写入地址是自增的吗? 这个地址变量类型(即取值范围)够不? (本人不才,曾经犯过类似错误...溢出后回到0了..惭愧..)
2. 楼主用的什么软件发的字库文件? 记住要用二进制格式. 因为如果是字符格式有些特殊数值(0x00, 0x0d, 0x0a ...) 可能会被忽略...而导致错位...
-----------------------------------------------------------------------
呵呵
对于第一,这些相对来说简单的问题我还是注意到了的.
对于第二,就更不可能了,在正确的数据区域里面,所有类型的数据都出现了,且写入进去了

出0入0汤圆

 楼主| 发表于 2011-7-7 18:35:36 | 显示全部楼层
回复【10楼】xy-mcu  竹竿
注意flash写入速度问题,
-----------------------------------------------------------------------

请详细介绍下看看!?

我想,spi的传输速度,SST25vf016b 的写入速度,不可能比9600比特率下的串口传输率还低吧。

出0入0汤圆

发表于 2011-7-7 18:43:26 | 显示全部楼层
没办法了... 最后如果是我会(类似电脑维修的最小系统法),虽然麻烦, 能排除是程序中其他部分的干扰,还是Flash读写驱动的BUG,还是什么其他原因:

新建一个工程, 只包含如下几个函数:
串口中断
Flash擦除,写入(字节),读取.

然后main()里 上电先擦除->打开串口中断->while(1);
在串口中断里接收到一个字节就写入.
完毕后从头读取回发给上位机, ->对比

出0入0汤圆

发表于 2011-7-7 19:02:54 | 显示全部楼层
前几天刚好也用了这个办法将字库刷到SPI Flash 中了, 用的是Winbond的W25Q16:


(原文件名:001.JPG)

文字都是读取Flash之后显示的 12x12宋体

(原文件名:001.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();
}

出0入0汤圆

 楼主| 发表于 2011-7-7 19:40:30 | 显示全部楼层
回复【15楼】wowbanui  
前几天刚好也用了这个办法将字库刷到spi flash 中了, 用的是winbond的w25q16:

(原文件名:001.jpg)
文字都是读取flash之后显示的 12x12宋体

(原文件名:001.jpg)

(原文件名:001.jpg)
虽然和sst的驱动不一样,还是上传个spi flash 的驱动 (mcu:stm32, 使用硬件spi接口)
u8 w25q_sendbyte(u8 byte)
{
  while(spi_i2s_getflagstatus(spi2, spi_i2s_flag_txe) =......
-----------------------------------------------------------------------

我的Flash操作库没问题啊
你是用什么方式烧到Flash里面去的呢?

出0入0汤圆

发表于 2011-7-7 20:08:34 | 显示全部楼层
回复【16楼】yulri
-----------------------------------------------------------------------
和你的思路是一样的, 不过是另外建了个新工程,
事先整篇擦除, 然后在串口中断里, 接收到一个字符就写入一个字符,
也没有校验,一次成功, 因为后来显示的时候正确的.

用的是这个软件(好像在Windows 7 SP1 x64 下有点问题, 会停止响应, 我是在虚拟机里完成的):

(原文件名:2011-07-07 20 04 32.png)


(原文件名:2011-07-07 20 06 10.png)

在载入字库文件的时候超级满, 等了几分钟, 传输的时候也是超级慢 差不多有四五分钟, 后来算算速率 也差不多要那么久

出0入0汤圆

 楼主| 发表于 2011-7-7 20:16:21 | 显示全部楼层
回复【17楼】wowbanui  
回复【16楼】yulri
-----------------------------------------------------------------------
和你的思路是一样的, 不过是另外建了个新工程,
事先整篇擦除, 然后在串口中断里, 接收到一个字符就写入一个字符,
也没有校验,一次成功, 因为后来显示的时候正确的.
用的是这个软件(好像在windows 7 sp1 x64 下有点问题, 会停止响应, 我是在虚拟机里完成的):

(原文件名:2011-07-07 20 04 32.png)

(原文件名:2011-07-07 20 06 10.png)
在载入字库文件的时候超级满, 等......
-----------------------------------------------------------------------
如果还不行,我就准备用文件系统了!

出0入0汤圆

发表于 2011-7-7 20:18:56 | 显示全部楼层
我觉得你还是把Flash的内容读出来和原版字库比较一下, 看是少了还是多了, 是无规律的出错还是有规律的出错? 以便分析原因

十六进制比较工具必备: Beyond Compare

(原文件名:2011-07-07 20 17 24.png)

出0入0汤圆

 楼主| 发表于 2011-7-7 20:37:44 | 显示全部楼层
回复【19楼】wowbanui  
我觉得你还是把flash的内容读出来和原版字库比较一下, 看是少了还是多了, 是无规律的出错还是有规律的出错? 以便分析原因
十六进制比较工具必备: beyond compare

(原文件名:2011-07-07 20 17 24.png)

-----------------------------------------------------------------------

呵呵,800K呢,一个GBK 16点阵的字库
那样太费劲了

出0入0汤圆

发表于 2011-7-7 20:42:15 | 显示全部楼层
回复【20楼】yulri  
-----------------------------------------------------------------------

我找了一下,找不到...sry...你可以自己写一个,不难。

出0入0汤圆

 楼主| 发表于 2011-7-7 20:50:54 | 显示全部楼层
回复【21楼】racede  
回复【20楼】yulri  
-----------------------------------------------------------------------
我找了一下,找不到...sry...你可以自己写一个,不难。
-----------------------------------------------------------------------

呵呵,没事,谢谢了
我准备转向文件系统了。

出0入0汤圆

发表于 2011-7-7 20:56:01 | 显示全部楼层
wowbanui
你的菜单功能是怎么实现的?

出0入0汤圆

发表于 2011-7-7 21:12:38 | 显示全部楼层
有驱动哦,马克

出0入0汤圆

发表于 2011-7-7 21:17:45 | 显示全部楼层
回复【23楼】wpnx
-----------------------------------------------------------------------

是参考的傻孩子的结构体菜单结构, 你可以在坛子里搜一下.

出0入0汤圆

发表于 2011-7-8 00:32:40 | 显示全部楼层
要研究一下菜单

出0入0汤圆

发表于 2011-7-8 04:35:38 | 显示全部楼层
回复【25楼】wowbanui  
-----------------------------------------------------------------------

能不能把画菜单的代码共享下,对这种立体的菜单的实现很感兴趣。谢谢

出0入0汤圆

发表于 2011-7-8 06:49:44 | 显示全部楼层
回复【8楼】physis
-----------------------------------------------------------------------

你说的带SPI字库芯片哪里可以买到?

好像现在都是自己搞字库,或用现成资料里的,然后写入芯片里。

出0入0汤圆

 楼主| 发表于 2011-7-8 10:42:59 | 显示全部楼层
回复【28楼】hetao7241  
回复【8楼】physis
-----------------------------------------------------------------------
你说的带spi字库芯片哪里可以买到?
好像现在都是自己搞字库,或用现成资料里的,然后写入芯片里。
-----------------------------------------------------------------------

有的,几块钱,spi接口的,淘宝上就有!

出0入0汤圆

 楼主| 发表于 2011-7-12 08:22:27 | 显示全部楼层
搞定!

出0入0汤圆

发表于 2011-11-11 15:06:54 | 显示全部楼层
各位有更好的写FLASH的方法没有?如果要写几百片的话,那不是很惨?

出0入0汤圆

发表于 2014-1-4 00:47:41 来自手机 | 显示全部楼层
最近正在做一个工具,这个工具一端接电脑usb,另外一端接spi flash存储器,电脑将这个存储芯片识别成u盘,电脑可以对它格式化,可以对它读写数据,比如建立文件,拷贝文件等,非常方便

出0入0汤圆

发表于 2014-2-25 15:36:28 | 显示全部楼层
能否用WinHex这样的工具直接把字库写进USB做成的U盘里面去呢?

出0入0汤圆

发表于 2014-5-16 09:50:16 | 显示全部楼层
不错的记录/mark

出0入0汤圆

发表于 2014-6-4 00:31:18 | 显示全部楼层


给你个例程参考一下,亮点的,写SPI FLASH的底层驱动函数必须对
还有你可以先用简单的程序写,读SPI FALSH试试,然后再来复杂的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入53汤圆

发表于 2017-5-22 16:23:08 | 显示全部楼层
枫101 发表于 2014-6-4 00:31
给你个例程参考一下,亮点的,写SPI FLASH的底层驱动函数必须对
还有你可以先用简单的程序写,读SPI FALS ...

感觉从sd卡里面读出数据到flash中,要比串口简单,串口如果按照115200的速度写入数据会出错
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 11:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表