查看: 132|回复: 0

[技术] 【赚周年币】技术帖Week2-Day3——LPC824 Lite之十、SPI FLASH测试

[复制链接]

23

主题

0

好友

3232

积分

状元

Rank: 6Rank: 6

  • TA的每日心情
    开心
    22 小时前
  • 签到天数: 1190 天

    [LV.10]以坛为家III

    爱板会员勋章 活跃会员勋章 发帖机器勋章 在线达人勋章

    发表于 2017-1-10 23:54:41 |显示全部楼层
    本帖最后由 toofree 于 2017-1-17 23:37 编辑

            【赚周年币】技术帖Week2-Day3——LPC824 Lite之十、SPI FLASH测试

            前几天,想把Nokia5110 LCD屏,从IO模拟方式,改到SPI。苦苦折腾了3、4个小时没能成功。正好LPC824 Lite上有SPI Flash W25Q32,那么先测试一下SPI Flash,或许能找到点殊死马迹。说测就测,开整。

            使用YL-LPC824光盘资料.rar中程序模板,打开工程“YL-LPC824光盘资料\SDK\peri_example\spi\spi_flash\project_spi_basic.uvoptx”。
             傲游截图20170110235741.jpg


            直接编译,生成“spi_basic.bin”文件。把这个文件,直接拖到LPC824 Lite板卡在本地自建的MBED 模拟盘中,直到“spi_basic.bin”文件自动消失,表示程序下载成功。
             傲游截图20170110235854.jpg


            仿真运行程序,在197行处设置断点,并且添加WrBuf、RdBuf到Memory1、Memory2查看窗口。
             傲游截图20170111000441.jpg


            全速运行程序,直到断点处停下。可以看到WrBuf、RdBuf数据为00到09的16进制数。这是因为程序中设置了BUFFER_SIZE 为10,因此只测试10个数据。
             傲游截图20170111000826.jpg


            程序过断点后,板上LED灯,由只亮LED1,变为LED1和LED3同时亮,绿色通信指示灯LED10,高频度闪烁。这个板上LED与原理图上是对不上的。板上的LED9到LED11,对应原理图中的D1到D3,从颜色和电阻可以区分出来,LED9到LED11分别又叫LED_RED、LED_GREEN、LED_BLUE;板上的LED1到LED8对应原理图中的D7到D14,又分别叫LED0到LED7。反正是乱七八遭的。
             傲游截图20170111001325.jpg

             傲游截图20170111001335.jpg

            借用网上的一张晒板图
             傲游截图20170111002343.jpg


            本着怀疑的态度,以为10字节测试不足以说明问题,试着改到512字节。第39行,宏定义改为512
             傲游截图20170111002639.jpg


            相同的方法测试,编译、仿真、打断点、设内存观察窗口、全速跑。当程序跑到断点时候,惊奇的事情又发生了。前256个字节,写、读缓存数据相同,后256字节出了问题,没有读回来,全是0xff。
             傲游截图20170111003501.jpg

            
            那么到底问题出在哪呢,经验告诉我们,很有可能问题出在了“”的过程中。定位到w25x32.c文件的191行,这个段写程序上,查看一下它的原始函数是怎么写的。
           傲游截图20170111003854.jpg

           查看原函数,参数类型是对的。但是函数里面,总感觉哪不对,有点太简单了。SPI Flash 块、扇区、页,最基本的应该是页呀,怎么也得找到个跨页的写吧,但是这里没有,当然我也不会加。
           傲游截图20170111004106.jpg


            于是乎,往下看程序,突然眼前一亮,在第215行,找到个函数。flash_write_data(),这个可以跨扇区写,那么当然跨页也不成问题吧。
           傲游截图20170111004758.jpg


            于是把主程序中用到的flash_write_sector()函数替换为flash_write_data()。
           傲游截图20170111005251.jpg

          
            再次编译、打断点仿真运行,直到断点处停下来,观察内存窗口。这次结果全部正确。
             傲游截图20170111005603.jpg


            这个flash_write_data()函数,底层实际也是跨页写的,而不是直接就扇区。尽管调用了扇区写,但是把数据长度限定在页长度256字节之内。那么要改flash_write_sector()扇区写的话,也不外乎是再套一层,把一次连续写入长度限定在256字节之内。那么也就没必要去改程序了,直接用flash_write_data()即可。

            真是不试不知道,一试一堆坑呀。
            把修改后的测试主程序,打包附上。
             main_spi_basic.rar (2.59 KB, 下载次数: 1)
    已有 1 人评分 收起 理由
    EEboard爱板网 + 18 3周发帖养成记 奖励

    总评分:  + 18   查看全部评分

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /3 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-2-24 22:56 , Processed in 0.109466 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部