初级会员

- 积分
- 94
- 金钱
- 94
- 注册时间
- 2014-3-24
- 在线时间
- 21 小时
|

楼主 |
发表于 2016-4-2 11:17:07
|
显示全部楼层
本帖最后由 liushuai199005 于 2016-4-2 21:35 编辑
谢谢原子哥。麻烦原子哥继续跟踪指导!!我继续调试
第一:关于SPI FLASH的底层操作问题(在进行汉字显示实验之前,我已经将单独的SD卡实验--SPI方式,FATFS实验,外部SPI FLASH 实验--移植原子哥毕设的AT45DB161--然后按照战舰开发指南上的“SPI实验”移植成功,单独的外设都在战舰例程上移植成功)。我曾经也考虑过SPI FLASH的底层操作(即单独的将 SPI实验--AT45DB161--在战舰上移植成功 并不等同于 在汉字显示实验中 能够成功显示汉字,但是检查底层可操作性不强---对于底层我没有一句一句的分析底层代码,想法是某个芯片/外设的底层是一样的,我只用在底层基础上进行应用层的开发即可,这实际上是这样一个问题----即学习战舰开发板的方法,是将整个程序中每一句代码都分析一遍 都搞明白,还是有所取舍。比如学习LCD显示时的 LCD底层驱动有没有必要详细的分析代码)。【补充:下面通过LED灯调试发现,(是地址错误问题)原因可能就是 FLASH底层操作问题。具体测试如下:(1)我将 字库起始地址(见下面第二条分析)改变后程序会重新更新字库,此时我在updata_fontx函数中调用的SPI_Flash_Write函数中使用LED3进行测试 程序出错---地址超出SPI芯片范围,具体 相关部分程序如下面附件所示:从倒数第三行代码开始。此处出错,为何超范围??
(2)在Get_HzMat 函数中调用的SPI_Flash_Read函数中我通过LED灯调试发现“地址超出了AT45DB161的范围 错误的返回了”,而单独移植的SPI实验中(SPI flash底层程序两个例程相同 没改)地址不超 测试LED灯不亮。具体 相关部分程序如下面附件所示:从倒数第三行代码开始。此处出错,为何超范围?? 是需要修改SPI flash的底层操作函数(若是,为何单独移植的SPI 实验就能成功? 两者有何不同??) 还是 下面第二条分析中的地址?? 怎样修改?】
通过上面两段代码的LED灯测试发现: 更新字库时的 向SPI FLASH中写汉字点阵 地址超出SPI芯片范围;读汉字时 调用的 读SPI FLASH中的数据时 地址也超范围。两者问题一样。怎样修改??
第二:我分析了可能的原因,战舰SPI FLASH是W25Q64 8M(前6M用于文件系统管理部分 + 第6M后的500K作为用户使用部分 + 最后的1.5M 是字库部分),我的红牛SPI FLASH是AT45DB161-- 2MB-- 汉字显示实验移植时在 font_init()函数中我将 FONTINFOADDR=(1024*1+500)*1024; 即从第1.5M开始存储字库(我查到本例程中字库占用 560KB,于是怀疑分0.5M给字库不够用,又改为FONTINFOADDR=(1024*1+100)*1024;),还是不行。但是表现有所不同(将起始地址前移 后):Show_Font(204,190,fontx,16,0); 和 Show_Font(168,212,fontx,12,0);后面显示的汉字由原来的 始终是蓝色的实方框 变为 开始显示出几个变化的乱码汉字 后面又变成了 蓝色的实方框。 结论:移植时除了修改上面 字库起始地址外 还要修改哪些内容??
第三,对于汉字显示失败,我尝试过 使用JLINK进行仿真跟踪代码,仿真界面结果如下(说明:单步仿真 Show_Str(60,50,200,16,"战舰 STM32开发板",16,0); 现单独仿真到“战”字,但是仿真显示并不是“战”字,显示就出错----结合上面第一条中的测试,估计因为 更新字库时地址出错导致的现在 读数据时 出错 )
第四,我将 W25Q64 和 AT45DB161的底层操作函数进行了对比,因为 flash只能写1 不能写0,在对W25Q64 写操作时 先进行了擦除,但是移植原子哥的 毕设(使用AT45DB161)进行写操作时 没有擦除(擦除指令仅仅使用条件编译,程序中并没有使用),这样会不会影响??(当然,在单独SPI实验移植时 并没有出错。)
|
|