fatfs和lwip单独使用都正常,同时使用fatfs不能写文件,只能创建文件夹(mkdir)。lwip版本换成1.4.1,fatfs能正常使用,lwip ping测试不通。
初步判断为rtthread bug,底层的spi驱动有问题,由于调试能力有限,还请高人指点,谢谢。
查看更多
检查过 spi 寄存器配置了吗?有没有意外变化了?
昨天追踪了一下代码,没看到在哪里检查spi寄存器的值
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
昨天追踪了一下代码,没看到在哪里检查spi寄存器的值
@悟_空 如果是 keil 可以直接打开外设寄存器,这个看很直观,如果用 studio 或者是 linux 下,可以尝试我文章里的写的那个方式,在finsh 里把内存值打印出来,然后去芯片手册或者头文件找到外设寄存器定义的内存地址。
你这个不需要知道每个寄存器每一位什么含义,只需要比对正常的时候和不正常的时候的差别。
比如 spi1 的地址
以及它对应的结构定义。
控制寄存器不会总变动的,状态和数据寄存器可能是常变的,下面几个没用到的 I2S 相关寄存器也应该是不变的。如果是它被意外修改了,你可以一眼看出异常的值来。
用fatfs底层的f_open()函数追踪了一下,SPI1和SPI2的CR1 CR2 DR等寄存都没发什么异常,跟踪到
这条语句的时候,调试就终止了,而正常的代码是能继续往下执行和返回的。这语句就是把4096个字节置0而已,不知道为啥,请指教。
@悟_空 到这一步,要么 fp 指针被意外修改了,要么 buf 这个指针被意外修改了。后面写的内存地址是无法访问的地址了吧。
把项目里除了 lwip W25Q64 之外的部分代码全去掉吧。你这个不知道是哪儿内存溢出把这里的内存值写坏了。
首先排查自己添加修改过的部分。
除了驱动和lwip fatfs,然后还有个fatfs的官方示例readwrite_sample,而我自己只写了一个简单的f_open测试函数,导出到命令行的。其他什么都不动,把lwip的包取消掉fatfs就能正常读写了
@悟_空 spi 驱动使用的 rtt 官方提供的吧?
走到上面的 f_open 函数里就崩溃了?
f_open 前边加个 printf 看看崩溃的位置是不是也会变?
如果是驱动有问题,那么读的数据就有问题,出错的位置可能会比较固定。
spi驱动用的官方的,在配置文件里配置的。
加printf后位置不会变,都是进f_open后的mem_set崩溃
@悟_空
mem_set(fp->buf, 0, _MAX_SS); /* Clear sector buffer */
我的里面这句代码跟你的不一样,mem_set(fp->buf, 0, sizeof fp->buf); /* Clear sector buffer */
1、是从rtt仓库来的
2、fp这个我跟踪一下,看一下区别
3、版本是R0.12a