30 Star 264 Fork 72

xiaowuzxc / 小麻雀处理器

 / 详情

大佬可以出个通过串口烧写程序的教程不?

已完成
创建于  
2023-05-23 10:29

感谢大佬!

评论 (30)

李轻水 创建了任务

串口烧写从设计层面就不支持,只有两种装填程序的方案:

  1. 编译后把你的程序和RTL一起烧进FPGA
  2. 把IAP程序和RTL一起烧进FPGA,然后从SD卡启动

感谢大佬的解答,今天我测试了IAP程序,将SD卡插上板子,然后程序卡在 IAP Wait SD Init。 请问这可能是什么原因呢?

要点大概有以下几条
1.sd卡有且只有一个分区,并格式化为fat32
2.如果本来就是fat32,也最好格式化一次
3.最好使用mbr分区表格式
4.sd卡只存一个sparrowrv_app.bin

如果还是不能解决,可以把bsp_iap的main.c中被注释的代码全部启用,然后重新编译,可以看到卡在哪一步

辛苦大佬了,我将printf注释取消掉编译会报错,
d:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/bin/ld.exe: SparrowRV_IAP.elf section .data' will not fit in region iram'
d:/mounriver/mounriver_studio/toolchain/risc-v embedded gcc/bin/../lib/gcc/riscv-none-embed/8.2.0/../../../../riscv-none-embed/bin/ld.exe: region `iram' overflowed by 20 bytes
collect2.exe: error: ld returned 1 exit status
make: *** [makefile:54: SparrowRV_IAP.elf] Error 1
大佬有空的时候再搞吧

这是因为我给IAP只分配了1024字节,尽可能减少程序体积。可以去link.lds里面把_iram_iap_size改到和iram一样大

感谢大佬,我测了下发现卡在 while(SYS_RWMEM_B(SDRD_BASE+3) == (uint8_t)0x01); 这句话上 后面printf("SDRD state:0x%x \n", tmp);//SD卡版本 这个printf没有弹出来。

最近比较忙,文档会晚点写

这说明没有检测到sd卡,不会进行下一步操作。看看io引脚分配对不对,sd卡有没有插好。还有,sd卡不能热插拔,需要上电前就插进去。

好嘞好嘞,麻烦大佬解答了,我再多测试测试。

大佬我又来请教您了,我发现之前检测不到SD卡是因为开发板上的SD卡插入口好像坏了,我买了个模块又能printf出后面的值了,但是这次是卡在 set_sdrd_sector(fat_base_sector);//访问扇区,FAT起始 这句话上。
已经printf出的结果是
输入图片说明
Wait SD init
IAP Wait SD Init...
SDRD state:0x38
fat_base_sector:4294967295
fat_byte_length:2097151 MiB
输入图片说明
set_sdrd_sector(fat_base_sector);后面的printf没有打印出来,说明卡在这里了。
这会是因为sd卡不支持的原因吗?
大佬百忙之中能抽空看一下就好,万分感谢!

根据printf第3-4行可以判断,SD卡第一扇区读到的数据出了问题,一般sd卡没有这么大

fat_base_sector:4294967295
fat_byte_length:2097151 MiB

导致set_sdrd_sector(fat_base_sector);读了一个不存在的扇区,卡在这里了。
我今天准备做一个视频,整理一下SD卡启动流程和注意事项。视频上传后把会地址发给你。

xiaowuzxc 任务状态待办的 修改为进行中
xiaowuzxc 负责人设置为xiaowuzxc

大佬辛苦了!

大佬,我按视频的步骤弄了SD卡还是跟前面一样的问题,感觉真的是我的SD卡不行? 打算再找几张SD卡试一试
输入图片说明
我可以根据图里的FAT扇区号计算出正确的fat_base_sector吗?
set_sdrd_sector(fat_base_sector);//访问扇区,FAT起始

能读出第一个扇区说明SD卡应该是好的。确认一下分区表是MBR,再“重建主引导记录”看看。
我感觉可能你失手把iap程序弄坏了,建议git pull一下,我在iap中更新了一些东西,开DEBUG模式更方便
我用我的SD卡开了DEBUG模式,你可以参考一下:

IAP Wait SD Init...  SDRD state:0x38 
fat_base_sector:2048
fat_byte_length:60006 MiB
fat_data_sector:32080
file_base_clus:5
sec_per_clus:64
file_base_sector:32272
file_length_byte:7656

输入图片说明
折腾这么长时间,真的辛苦你了

感谢大佬指点,我把set_sdrd_sector(2048);//访问扇区,FAT起始 改成2048后出现的是下图的结果
输入图片说明
我的代码和程序都已经换成最新的了,还是同样的结果。
我用的是TF卡,应该不是因为TF卡的原因吧? 因为用的是TF卡接口,我打算再买几张TF卡测试用,过两天到了再测试下。
不知道会不会是开发板的原因,我测试了其他程序就可以跑得动。 有没有可能是 我没有将sd_cmd和sd_dat[3:0]设置内部上拉的原因呢?
一直麻烦大佬也很不好意思,感谢大佬的热心解答,有空的时候看一看就可以了!

不麻烦,我也对各种疑难杂症很感兴趣。
tf卡是没问题的,实测sd tf都能兼容,连杂牌的128MB tf卡都支持。
你看看硬件原理图,sd_cmd dat那几条线有没有上拉,没有上拉那么很有可能问题在这儿。此外,你最好检查一下tf模块和fpga的连接情况,如果用杜邦线可能会接触不良或走不了高频信号。
实在不行,使用终极大法,用winhex软件检查tf卡的底层二进制数据,彻底排除软件层面问题。

如果方便的话,能否拍一个硬件板卡的图片?
可以让我更好的分析问题

刚刚转了一下16进制,发现问题了
4294967295是0xffffffff
4034953991是0xf0808307
如果重建了mbr,不会是这样的,很可能硬件有问题

大佬,不好意思现在才回复您。
这边是我用的开发板,NEXYS4 用Vivado进行开发, 我感觉确实可能是我的开发板有问题
输入图片说明
开发板右边的IO接的是UART,右下的IO接的是SD卡模块,SD卡模块如下图:
输入图片说明
用到的IO口如下: 用到了JA和JB
输入图片说明

这边说说我的测试和修改流程:
创建vivado工程,选择本开发板。
修改config.v中的 `define CPU_CLOCK_HZ 100_000_000 因为开发板频率是100M,所以改成100M
进行相关约束(主要看SD卡):
set_property PACKAGE_PIN E16 [get_ports sd_clk]
set_property PACKAGE_PIN G16 [get_ports sd_cmd]
set_property PACKAGE_PIN F13 [get_ports {sd_dat[0]}]
set_property PACKAGE_PIN G13 [get_ports {sd_dat[1]}]
set_property PACKAGE_PIN D14 [get_ports {sd_dat[2]}]
set_property PACKAGE_PIN F16 [get_ports {sd_dat[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sd_dat[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sd_dat[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sd_dat[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sd_dat[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports sd_cmd]
set_property IOSTANDARD LVCMOS33 [get_ports sd_clk]
第一次测试,未使用SD卡模块,使用开发板上自带的SD卡接口如下图(可看到图中有接上拉电阻):
输入图片说明
使用串口反馈结果为“ IAP Wait SD Init”
第二次测试,使用SD卡模块(接到JB IO口),出现结果
#######################
Wait SD init
IAP Wait SD Init...
SDRD state:0x38
fat_base_sector:4294967295
fat_byte_length:2097151 MiB
#######################
第三次测试,使用另一块SD卡,出现结果:
输入图片说明
不断循环下面语句,不停止
#######################
IAP Wait SD Init... SDRD state:0x38
fat_base_sector:2048
fat_byte_length:14991 MiB
fat_data_sector:9576
file_base_clus:5
sec_per_clus:64
file_base_sector:9768
file_length_byte:7656
#######################
第四次测试,使用同上SD卡,修改软件程序
对下面语句中的fat_base_sector改为2048
//读取FAT分区的起始扇区
set_sdrd_sector(fat_base_sector);//访问扇区,FAT起始
出现结果(不循环,但是卡在此处):
#######################
IAP Wait SD Init... SDRD state:0x38
fat_base_sector:2048
fat_byte_length:14991 MiB
fat_data_sector:9576
file_base_clus:5
sec_per_clus:64
file_base_sector:9768
file_length_byte:7656
#######################
第五次测试,使用同上SD卡,修改软件程序如下,结果同第三次测试,无限循环。(这是最不能理解的地方)
输入图片说明
第六次测试,使用第三块SD卡,使用同第五次测试的软件程序,出现结果如下:
#######################
IAP Wait SD Init... SDRD state:0x28
fat_base_sector:2048
fat_byte_length:479 MiB
fat_data_sector:2119305480
Can't Find File in SD
#######################
使用的三种SD卡如下图:
输入图片说明
存储在SD卡中的软件程序都是bsp_app/link.lds修改过_use_sd_iap = 1;后编译bsp_app/app/main.c生成的bin文件,并SD卡都按照视频进行mbr重建了。
软件程序_use_sd_iap = 0;时可以正常烧录开发板并从串口读出正常的程序,因此软件也无问题。
新买的SD卡也会出现问题,推断并不是SD卡的问题,但有可能是SD卡模块的问题。
测试过加上上拉电阻(在面包板上实现)再接到SD卡模块的情况,会卡在IAP Wait SD Init... SDRD state:0x38 这句话然后不动了。
目前看来是我板子和SD卡模块的问题可能性较大,后续可能考虑换块板子进行测试。
很不能理解的是上面提到的第三四五次测试结果,
已经读到了正确的扇区,为何还会卡在文件区,
为何变量file_base_sector被我改成常量2048串口返回的就不会无限循环,而不改就会无限循环(SD卡内换成其他程序也无限循环,不是bin文件程序的原因)
为何我在文件区的代码里加了一点printf代码就会再出现无限循环的情况。
//文件区
i = file_length_byte / 512;
i++;//i为APP占据的扇区数
while(i)
{
set_sdrd_sector(file_base_sector);//访问扇区
file_base_sector++;//扇区+1
i--;
** printf("i:%lu\n", i);//**
for(j=0; j<512; ++j)//读出数据
{
SYS_RWMEM_B(app_base_addr) = SDRD_DATA(j);
k = SDRD_DATA(j);
** printf("k:%lu\n", k);//
printf("app_base_addr:%lu\n", app_base_addr);//**
app_base_addr++;
}
}
经常会忘记打开这个网站,所以回复会比较慢,不好意思!
大佬有空时候再看看,我再思考思考硬件是否有问题,没问题就会考虑换开发板了。

刚把IAP_DBG_MODE注释掉//#define IAP_DBG_MODE 1 /结果如下,看起来是有i=14,但是里面没有进行循环就跳出来了?
输入图片说明

我觉得第3次已经离成功很近了,你烧一下自带的IAP程序试试。
注意,IAP开了debug模式,是大概率无法正常启动的,因为程序大小超出了1024,app会覆盖iap,导致iap被破坏,出现无限循环。
你的sd模块用杜邦线连的,问题很有可能出在这里。因为杜邦线的信号完整性很差,而sd卡的时钟频率为MHz级别,很有可能出问题。为了验证,你可以把SparrowRV / rtl / soc / sdrd / sdrd.v

.CLK_DIV(`CPU_CLOCK_HZ / 25_000_000),

CPU_CLOCK_HZ /25_000_000改成7,也就是括号里是7,降低时钟频率。如果恢复正常,则表明是杜邦线的原因。
建议使用更短的杜邦线,并确保连接可靠。

感谢大佬,测试了用自带的IAP程序和第二块SD卡现在可以了(没改时钟频率就可以),那看样子还真有可能是SD卡不行?

@李轻水 把上面那个改成7,如果其他sd卡都能用了,说明是杜邦线的信号衰减问题

不行,改成7之后三张SD卡都没结果

或许发现问题了

.CLK_DIV(`CPU_CLOCK_HZ / 25_000_000),

计算分频系数的方式有问题,导致低频(<50M)可以正常运行,高频翻车。换SD卡就能成功的原因,可能是新卡的时钟兼容性更好。
这真的是我的锅,导致你折磨这么长时间了,非常抱歉。
现在我修复了这个问题,但是手上没有那么好的FPGA用来测试,麻烦你git pull一下,看看是不是所有SD卡都能用

大佬,我用新的代码测试了SD卡都可以了,感谢大佬,问题解决了就好

我应该感谢你,愿意和我一起折腾这么久。要不是你帮忙,我都没发现这个问题。

xiaowuzxc 任务状态进行中 修改为已完成
xiaowuzxc 任务状态已完成 修改为进行中

再提一句,串口烧写程序已经完成方案设计了,敬请期待 :+1:

xiaowuzxc 任务状态进行中 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
8241888 xiaowuzxc 1640229265
Verilog
1
https://gitee.com/xiaowuzxc/SparrowRV.git
git@gitee.com:xiaowuzxc/SparrowRV.git
xiaowuzxc
SparrowRV
小麻雀处理器

搜索帮助