搜索
bottom↓
回复: 11

RTT外接SPI flash 遇见的问题?

[复制链接]

出0入0汤圆

发表于 2012-2-14 16:58:32 | 显示全部楼层 |阅读模式
问题一:W25Q32的驱动程序应该是没问题的,跨4K读写都是没问题的。可是接上FINSH后。

FINSH函数如下:
void spi_flash_test(uint32_t address, uint32_t size)
{
        uint32_t i;
        /**< 8bit test */
        uint8_t  write_buf[500];             //数值过大,FINSH出现错误  比如:2000
        uint8_t  read_buf [500];             //数值过大,FINSH出现错误

   rt_kprintf("step: 1\n");
    for(i=0; i<size/sizeof(uint8_t); i++)
    {
        write_buf = (uint8_t)i;
    }

        w25xx_write(address, write_buf, size);
        w25xx_read(address, read_buf, size);

    for(i=0; i<size/sizeof(uint8_t); i++)
    {
        if( write_buf != read_buf )
        {
            rt_kprintf("SPI Flash test fail @ 0x%08X\r\nsystem halt!!!!!",i);
            while(1);
        }
    }
    rt_kprintf("SPI Flash test pass!!\r\n");
}
FINSH_FUNCTION_EXPORT(spi_flash_test, spi_flash_test(0, 2000));

如果数组为500时,没问题
finsh>>spi_flash_test(4080, 400)
step: 1
SPI Flash test pass!!
        1, 0x00000001
finsh>>

如果数组为2000时,出现如下问题:

\ | /
- RT -     Thread Operating System
/ | \     1.0.0 build Feb 13 2012
2006 - 2011 Copyright by rt-thread team
finsh>>SPI File System initialized!
TCP/IP initialized!

finsh>>spi_flash_test(0, 400)
psr: 0x80000200
pc: 0x00000000
lr: 0x00000df5
r12: 0x00000000
r03: 0x20001bf4
r02: 0xffffffff
r01: 0x00000000
r00: 0x20000bf4
hard fault on thread: tshell
thread  pri  status      sp     stack size max used   left tick  error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
tcpip    0x0c suspend 0x000000a8 0x00000400 0x00000108 0x00000014 000
&#192;&#193;&#194;&#195;&#196;&#197;&#198;&#199;&#200;&#201;&#202;&#203;&#204;&#205;&#206;&#207;&#208;&#209;&#210;&#211;&#212;&#213;&#214;×&#216;&#217;&#218;&#219;&#220;&#221;&#222;&#223;àá&#226;&#227;&#228;&#229;&#230;&#231;èéê&#235;ìí&#238;&#239;&#240;&#241;òó&#244;&#245;&#246;÷&#248;ùú&#251;ü&#253;&#254;&#255; 0xf5

问题二:radio驱动程序里使用里面使用了一个semaphore,应该放在哪个Read函数里面,是如何调度的,应该放在哪里。(第一次接触操作系统,以前跑的都是51)
        我写的驱动

uint32_t w25xx_read(uint32_t pos, uint8_t* buffer, uint32_t size)
{
        uint32_t index;

//        spi_lock();

        CS_LOW();
        spi_write(W25XX_CMD_READ);
        spi_write(pos >> 16 & 0xFF);
        spi_write(pos >> 8  & 0xFF);
        spi_write(pos & 0xFF);
       
        for (index = 0; index < size; index++)
        {
                *buffer++ = spi_read();
        }       
        CS_HIGH();

//        spi_unlock();
       
        return size;
}

static void read(uint32_t pos, uint8_t* buffer, uint32_t size)
{
        spi_lock();
        w25xx_read(pos, buffer, size);
        spi_unlock();
}

static void write(uint32_t pos, const uint8_t* buffer, uint32_t size)
{
        spi_lock();
        w25xx_write(pos, buffer, size);
        spi_unlock();
}

static rt_size_t w25xx_flash_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
{
        read(pos, (uint8_t *)buffer, size);
    return size;
}

问题三:RTT 1.0.0里面的文件系统,还需要设置哪些地方吗?
        Device能挂上,可是FINSH里面测试,文件系统相关的操作都运行错误。应该是文件系统没跑起来。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-2-14 17:08:50 | 显示全部楼层
“uint8_t  write_buf[500];             //数值过大,FINSH出现错误  比如:2000
uint8_t  read_buf [500];             //数值过大,FINSH出现错误 "

请问这1K空间会被分配在哪里?

出0入0汤圆

 楼主| 发表于 2012-2-14 17:23:38 | 显示全部楼层
回复【1楼】aozima  
“uint8_t  write_buf[500];             //数值过大,finsh出现错误  比如:2000
uint8_t  read_buf [500];             //数值过大,finsh出现错误 "
请问这1k空间会被分配在哪里?
-----------------------------------------------------------------------

外扩的SDRAM

裸奔的时候,1K空间不是MCU自己分配的吗?在这里需要使用rt_memset初始数组吗?

还有内存池的函数刚这个有关系吗?

出0入0汤圆

发表于 2012-2-14 18:07:49 | 显示全部楼层
回复【2楼】sunchao151  
-----------------------------------------------------------------------
外扩的sdram
裸奔的时候,1k空间不是mcu自己分配的吗?在这里需要使用rt_memset初始数组吗?
还有内存池的函数刚这个有关系吗?
-----------------------------------------------------------------------
继续好好看书。

问题二: RT-Thread有新的SPI驱动框架了。建议使用新驱动框架写SPI驱动。然后再在其基础上写SPI FLASH的驱动程序。

问题三: 参数STM32 RADIO项目。

出0入0汤圆

 楼主| 发表于 2012-2-14 22:33:58 | 显示全部楼层
回复【3楼】aozima  
-----------------------------------------------------------------------

谢谢aozima,现在以经可以在FINSH里面随意读写了,加了rt_malloc 和 rt_free,这样就分配给了外部RAM

对于问题一:write_buf[2000];
            read_buf[2000];
          这4K应该MCU自动分配给内部RAM吧?????


对于问题二和问题三,还是不太明白,

对于SPI新的驱动框架,不太明白,除了
enum rt_device_class_type
{
        RT_Device_Class_Char = 0,                       /**< character device                           */
        RT_Device_Class_Block,                          /**< block device                               */
        RT_Device_Class_NetIf,                          /**< net interface                              */
        RT_Device_Class_MTD,                            /**< memory device                              */
        RT_Device_Class_CAN,                            /**< CAN device                                 */
        RT_Device_Class_RTC,                            /**< RTC device                                 */
        RT_Device_Class_Sound,                          /**< Sound device                               */
        RT_Device_Class_Graphic,                        /**< Graphic device                             */
        RT_Device_Class_I2C,                            /**< I2C device                                 */
        RT_Device_Class_USBDevice,                      /**< USB slave device                           */
        RT_Device_Class_USBHost,                        /**< USB host bus                               */
        RT_Device_Class_SPIBUS,                                                 /**< SPI bus device                             */
        RT_Device_Class_SPIDevice,                      /**< SPI device                                 */
        RT_Device_Class_SDIO,                                                         /**< SDIO bus device                            */
        RT_Device_Class_Unknown                         /**< unknown device                             */
};
这里面提及过SPI,内核的其他地方都没有提及过SPI的驱动啊?有没有例子程序?

问题三: 能否给点小提示啊,raido使用的RTT版本不是1.0.0的,头文件里面关于DFS不太一样。

出0入0汤圆

发表于 2012-2-15 11:54:45 | 显示全部楼层
问题一继续看书深入理解:-D

出0入0汤圆

 楼主| 发表于 2012-2-15 12:49:59 | 显示全部楼层
回复【5楼】ffxz  
-----------------------------------------------------------------------

有新书出来了吗?

我现在看的是  《RT-Thread实时操作系统编程指南》0.3.0.pdf  

感觉有点老了啊

出0入0汤圆

 楼主| 发表于 2012-2-15 21:30:22 | 显示全部楼层
回复【3楼】aozima  
回复【2楼】sunchao151  
-----------------------------------------------------------------------
外扩的sdram
裸奔的时候,1k空间不是mcu自己分配的吗?在这里需要使用rt_memset初始数组吗?
还有内存池的函数刚这个有关系吗?
-----------------------------------------------------------------------
继续好好看书。
问题二: rt-thread有新的spi驱动框架了。建议使用新驱动框架写spi驱动。然后再在其基础上写spi flash的驱动程序。
问题三: 参数stm32 radio项目。
-----------------------------------------------------------------------

问题一解决:使用动态内存管理

问题二解决:参考Radio,发现驱动的寻址是按4K扇区。并不是原来想的是字节寻址,然后读写
finsh>>device_test("spi0")
block device!

device info:
sector  size : 4096 byte
sector count : 512
block   size : 4096 byte

device I/O R/W test pass!

device I/O speed test.
RT_TICK_PER_SECOND:100
read 200 sector from 873 to 1613, 108.10Kbyte/s
write 200 sector from 1613 to 3534, 41.64Kbyte/s
        0, 0x00000000

            但aozima所提及的新的SPI框架,还是不明白,难道只是
            spi_flash_device.type         = RT_Device_Class_SPIDevice;这一句的修改吗?

问题三:使用测试程序fs_test(1);还是有问题。应该是生成文件不成功的,请aozima和明白的人给于帮助。
finsh>>fs_test(1)
arg is : 0x01   1073741824, 0x40000000
finsh>>fsrw1 open file for write failed

出0入0汤圆

发表于 2012-2-15 21:42:22 | 显示全部楼层
测试前需要先格式化。 具体看 mkfs .

出0入0汤圆

 楼主| 发表于 2012-2-15 21:48:01 | 显示全部楼层
回复【8楼】aozima  
测试前需要先格式化。 具体看 mkfs .
-----------------------------------------------------------------------
finsh>>mkfs("eml", "spi")
        -1, 0xffffffff

mkfs运行错误。

程序上电后,不是以经挂载了吗?下面这条语句?
if (dfs_mount("spi0", "/", "elm", 0, 0) == 0)

出0入0汤圆

发表于 2012-2-15 21:52:52 | 显示全部楼层
mkfs有跟进去调过吗? 虽然一眼就看到错误了。

如果 挂载 == 格式化  会如何?

出0入0汤圆

 楼主| 发表于 2012-2-15 22:31:56 | 显示全部楼层
回复【10楼】aozima  
-----------------------------------------------------------------------

应该是mkfs("elm", "spi0")吧

finsh>>mkfs("elm", "spi0")
psr: 0x21000200
pc: 0x0000bc9a
lr: 0x0000bb31
r12: 0x00000000
r03: 0x4e204f4e
r02: 0x0000000f
r01: 0x0000bd18
r00: 0x60000847
hard fault on thread: tshell
thread  pri  status      sp     stack size max used   left tick  error
-------- ---- ------- ---------- ---------- ---------- ---------- ---
tcpip    0x0c suspend 0x000000ac 0x00000400 0x00000108 0x00000014 000
tidle    0x1f ready   0x00000054 0x00000100 0x00000054 0x0000001d 000
tshell   0x14 ready   0x00000074 0x00000800 0x00000178 0x0000000a 000
etx      0x0f suspend 0x0000007c 0x00000200 0x0000007c 0x00000010 000
erx      0x0f suspend 0x0000007c 0x00000200 0x0000007c 0x00000010 000


跟踪进去,发现进入ff.c 的 f_mkfs函数时,出错了,但不明白出错在哪里
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 19:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表