单片机想显示中文一般都不是很容易。
一方面是很多屏幕驱动都不带中文字库,一方面是中文的取模数据大,单片机的flash空间宝贵。
对于不带字库的屏幕,显示中文主要分两种情况处理。
一种是显示少量的有限个数的中文,可以将取模数据放在单片机的flash内,然后建立索引表,通过查表来定位字模数据位置并显示。
另一种是显示多个中文或者显示的文字不定,这就需要全套的中文字模数据,由于数据量大,一般都会放置到外部的储存器中,最常用的就是25系列的SPI Flash,其中又以华邦的w25Qxx最为常见。
今天主要分三部分讲:
一、SPI Flash的读写
二、字库的制作
三、字库的写入与读取
涉及的内容比较多,时间可能比较长,我尽量讲的详细些。
一、SPI Flash的读写
这里以w25Q128FV为例讲解,w25q128fv是16M字节的spi flash,除了容量比较大以外,它的配置状态寄存器也普通的要多。总共三个配置状态寄存器。多出的功能主要是区块的保护更加的灵活,还有一些单次编程的寄存器。这些我们不做过多的了解,简单的看一下就好。
这里主要要讲解的是flash的擦除、编程、读取。
1、flash擦除
flash为什么要擦除,擦除之后的数据是什么?是不是0x00?
flash的编程操作只能将1改成0,不能将0变成1。因此在对flash进行编程写入数据前需要将flash进行擦除,使flash的储存位都变成1,也就是每个字节都是0xff。至于为何flash编程不能将0改成1,想了解的请自己查资料。
flash的擦除如何操作?
flash的擦除方式主要有:扇区擦除、块擦除、芯片擦除
扇区的大小为4k,块的大小可以是32k,也可以是64k,芯片的大小就是整个芯片。
具体操作是先将芯片写使能,然后发送擦除命令,然后发送地址,芯片擦除不需要地址。
关于地址,因为不管是扇区和块,都包含有不止一个字节,所以,发送的地址所属于的那个扇区或者块就会被全部擦除!
比如地址发送0x000000和0x000001的擦除效果是一样的,因为这两个地址属于同一个扇区,同一个区块。
flash不擦除能否写入数据?
flash不擦除可以写入数据,但是只能写入0,不能写入1,如果你想写入0x00则不用擦除,其它情况都会导致数据错误。
2、flash编程
flash写入数据需要以页编程的方式进行写入
每个页包含有256字节,页编程可以从页的任意位置开始写入,也不必将页写满。
需要注意的是,在进行页编程时,在同一个页内,地址指针会自增,到达页尾后地址指针会跳转到页首的位置,继续写入则可能发生数据覆盖,所以在页编程时需要在一页写完后将地址指向下一页的首地址。
具体操作是:
芯片写使能,发送编程指令,发送地址,发送数据
3、flash读取
这个是最简单的操作,只需要发送读取指令,然后发送读取地址,然后就一直读就行,只要时钟还在发送,数据就会传出。读取没有扇区、页这些限制,可以连续读出整片flash的内容。
上图说话
flash的内部框图。flash一般是8个引脚,除掉两个电源脚和spi通讯的引脚还有两个引脚。WP,写保护,拉低时不能写入,保护数据,hold,数据传输暂停。
状态寄存器1,常用的是busy位,芯片在忙时,比如在编程、在擦除,其它指令将忽略,除了读状态指令。(还有暂停指令)
保护引脚的配置
状态寄存器2不常用,除非是要进行数据保护、快速读取
状态寄存器3
数据保护相关,可以了解一下,比如写入字库后将字库保护起来,避免被擦除或者覆盖
指令表
常用的是写使能,读寄存器1,擦除、页编程
其它的不是很常用,像一些双输出、四输出的指令需要单片机支持,输出速率能达到上百兆,我们这里是用不到的。
讲这么多不如来个源码实在
w25qxx.c
待续。。。