yulri 发表于 2011-7-7 16:02:38

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

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

wowbanui 发表于 2011-7-7 16:38:20

后面的空间写入前有没有 擦除?

yulri 发表于 2011-7-7 16:49:03

回复【1楼】wowbanui
后面的空间写入前有没有 擦除?
-----------------------------------------------------------------------

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

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

wowbanui 发表于 2011-7-7 16:54:54

1.可能中间丢失位了,导致后面整个错位
2.有坏块了

yulri 发表于 2011-7-7 17:01:35

我估计第一种可能行大一点!
但是SST25VF016B的写速度应该还是很快的啊
我的串口波特率都设置成9600了,这么慢了呢!

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

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

racede 发表于 2011-7-7 17:10:08

回复【4楼】yulri
-----------------------------------------------------------------------

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

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

yulri 发表于 2011-7-7 17:23:30

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

aozima 发表于 2011-7-7 17:37:53

可以考虑使用RT_thread,在FLASH上面跑个文件系统,再用zmodem去传文件.
方便得很呀.

physis 发表于 2011-7-7 18:05:51

如果写整个汉字库,不如买专用的SPI接口字库芯片

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

yulri 发表于 2011-7-7 18:10:54

回复【8楼】physis
如果写整个汉字库,不如买专用的spi接口字库芯片
价格应该相差不多,而且专用的字库芯片往往有多个分辨率的字体

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

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

xy-mcu 发表于 2011-7-7 18:23:11

注意Flash写入速度问题,

wowbanui 发表于 2011-7-7 18:23:50

根据楼主说的在串口中断里直接写入F的话, 是否每次写入一个字节? 又猜了几种可能:

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

yulri 发表于 2011-7-7 18:33:14

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

yulri 发表于 2011-7-7 18:35:36

回复【10楼】xy-mcu竹竿
注意flash写入速度问题,
-----------------------------------------------------------------------

请详细介绍下看看!?

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

wowbanui 发表于 2011-7-7 18:43:26

没办法了... 最后如果是我会(类似电脑维修的最小系统法),虽然麻烦, 能排除是程序中其他部分的干扰,还是Flash读写驱动的BUG,还是什么其他原因:

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

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

wowbanui 发表于 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);
    //----------------------------
    //bit7   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();
}

yulri 发表于 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里面去的呢?

wowbanui 发表于 2011-7-7 20:08:34

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

用的是这个软件(好像在Windows 7 SP1 x64 下有点问题, 会停止响应, 我是在虚拟机里完成的):
http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_655644AY6AKM.png
(原文件名:2011-07-07 20 04 32.png)

http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_655645XWLB55.png
(原文件名:2011-07-07 20 06 10.png)

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

yulri 发表于 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)
在载入字库文件的时候超级满, 等......
-----------------------------------------------------------------------
如果还不行,我就准备用文件系统了!

wowbanui 发表于 2011-7-7 20:18:56

我觉得你还是把Flash的内容读出来和原版字库比较一下, 看是少了还是多了, 是无规律的出错还是有规律的出错? 以便分析原因

十六进制比较工具必备: Beyond Compare
http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_655646A4OOAL.png
(原文件名:2011-07-07 20 17 24.png)

yulri 发表于 2011-7-7 20:37:44

回复【19楼】wowbanui
我觉得你还是把flash的内容读出来和原版字库比较一下, 看是少了还是多了, 是无规律的出错还是有规律的出错? 以便分析原因
十六进制比较工具必备: beyond compare

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

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

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

racede 发表于 2011-7-7 20:42:15

回复【20楼】yulri
-----------------------------------------------------------------------

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

yulri 发表于 2011-7-7 20:50:54

回复【21楼】racede
回复【20楼】yulri
-----------------------------------------------------------------------
我找了一下,找不到...sry...你可以自己写一个,不难。
-----------------------------------------------------------------------

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

wpnx 发表于 2011-7-7 20:56:01

wowbanui
你的菜单功能是怎么实现的?

SNOOKER 发表于 2011-7-7 21:12:38

有驱动哦,马克

wowbanui 发表于 2011-7-7 21:17:45

回复【23楼】wpnx
-----------------------------------------------------------------------

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

scofiled 发表于 2011-7-8 00:32:40

要研究一下菜单

huangstone 发表于 2011-7-8 04:35:38

回复【25楼】wowbanui
-----------------------------------------------------------------------

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

hetao7241 发表于 2011-7-8 06:49:44

回复【8楼】physis
-----------------------------------------------------------------------

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

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

yulri 发表于 2011-7-8 10:42:59

回复【28楼】hetao7241
回复【8楼】physis
-----------------------------------------------------------------------
你说的带spi字库芯片哪里可以买到?
好像现在都是自己搞字库,或用现成资料里的,然后写入芯片里。
-----------------------------------------------------------------------

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

yulri 发表于 2011-7-12 08:22:27

搞定!

raja21 发表于 2011-11-11 15:06:54

各位有更好的写FLASH的方法没有?如果要写几百片的话,那不是很惨?

wdluo 发表于 2014-1-4 00:47:41

最近正在做一个工具,这个工具一端接电脑usb,另外一端接spi flash存储器,电脑将这个存储芯片识别成u盘,电脑可以对它格式化,可以对它读写数据,比如建立文件,拷贝文件等,非常方便

mmcyn 发表于 2014-2-25 15:36:28

能否用WinHex这样的工具直接把字库写进USB做成的U盘里面去呢?

756842723 发表于 2014-5-16 09:50:16

不错的记录/mark

枫101 发表于 2014-6-4 00:31:18



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

zhcj66 发表于 2017-5-22 16:23:08

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

感觉从sd卡里面读出数据到flash中,要比串口简单,串口如果按照115200的速度写入数据会出错
页: [1]
查看完整版本: 关于将汉字库写入SPI flash的问题!