首页 > 其他 > 详细

RT-Thread QSPI bug解决

时间:2021-05-21 22:18:06      阅读:22      评论:0      收藏:0      [点我收藏+]

RT-Thread QSPI bug解决

调试基于ART-PI开发板的QBoot工程,使用到了SPI和QSPI。其中型号为W25Q64JV和W25Q128JV。8M QSPI Flash用于存储运行程序,16M SPI Flash用于存储数据和文件系统。

现象

QSPI Flash在0x8000后面的地址无法写,其中读取到的数据也全部使0XFF。

技术分享图片

解决

更改components\drivers\spi\qspi_core.c文件中第188行

char *ptr = (char *)send_buf;

改为

unsigned char *ptr = (unsigned char *)send_buf;

问题分析

高位符号扩展

当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1.对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0.

比如一个用一个8位二进制表示-1,则是10000001
如果把这个书用16位二进制表示时,则为11111111 10000001 高位全都是1。

在使用ptr指针时,有符号的char型扩展为int型时,高位全部扩展为1。造成地址超过0x1000000

    struct rt_qspi_message message;
    unsigned char *ptr = (unsigned char *)send_buf;
    rt_size_t  count = 0;
    rt_err_t result = 0;

    message.instruction.content = ptr[0];
    message.instruction.qspi_lines = 1;
    count++;

    /* get address */
    if (length > 1)
    {
        if (device->config.medium_size > 0x1000000 && length >= 5)
        {
            /* medium size greater than 16Mb, address size is 4 Byte */
            message.address.content = (ptr[1] << 24) | (ptr[2] << 16) | (ptr[3] << 8) | (ptr[4]);
            message.address.size = 32;
            message.address.qspi_lines = 1;
            count += 4;
        }
        else if (length >= 4)
        {
            /* address size is 3 Byte */
            message.address.content = (ptr[1] << 16) | (ptr[2] << 8) | (ptr[3]);
            message.address.size = 24;
            message.address.qspi_lines = 1;
            count += 3;
        }
        ......

RT-Thread QSPI bug解决

原文:https://www.cnblogs.com/lionxy/p/14797110.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!