-
-
[原创] CrazyRadio固件故障分析与SPI编程器制作
-
发表于:
2021-8-30 05:38
16100
-
[原创] CrazyRadio固件故障分析与SPI编程器制作
手误将优联接收器的固件刷入CrazyRadio,出现设备失灵的情况,既无法将CrazyRadio作为接收器使用,也无法通过usb再对设备进行读写操作。为了找出原因,在修复之前我想先把整个flash提取出来简单分析一下,于是便有了这个项目。
1.查阅资料
进行多次尝试与查阅资料后在nRF24LU1+官方文档发现:
这款芯片都预置了一个USB bootloader: boot24lu1p-f32.hex ( 可在官方SDK中找到)
理论上来讲,只要能将该hex文件写入Flash中,一定可以让设备重新运行,但是为了弄清问题的原因,先避免对Flash进行任何写入操作。
2.读取Flash
在此为了分析问题的成因,决定先将整个Flash读出来进行分析。这里选择用一块Arduino对其进行SPI读写。
接线方式与引脚对应关系:
需要注意的是,在Arduino内置函数SPISettings()中,参数1为SPI通信速度,该值不能使用官方示例程序中的默认值(14000000),否则速度过快会导致数据丢失,出现大规模的0x00。
将读取到的数据通过串口以十六进制字符打印出来,得到Flash中的全部内容。可以发现,其中包含有优联接收器的完整固件。
3.Flash中内容分析
a.出厂Flash
出厂Flash的起始位置:
跳转到0x7800的位置,再看0x7800处:
b.刷入优联固件后的Flash:
优联Flash的起始位置:
跳转到bootloader的指令被优联固件覆盖
跳转到bootloader的指令被优联固件覆盖,导致设备加电后无法执行bootloader代码,而bootloader中可能包含有拷贝Flash中固件到RAM中的代码,以及初始化USB的代码。所以导致设备失灵且无法使用USB进行读写操作。
制作一个SPI编程器,通过写入出厂bootloader,将设备重新运行起来。
为Arduino编写程序,在加电后监听串口,有数据传来就将数据通过SPI写入外部Flash。同时用python编写上位机程序,将hex文件数据通过串口发送给Arduino。
1.Arduino部分 :
此部分主要涉及到Arduino与CrazyRadio的SPI通信
需要注意:
2.上位机部分:
此部分主要涉及到PC与Arduino的串口通信
需要注意:
3.写入
写入hex文件后,CrazyRadio又可以正常工作。
Arduino CrazyRadio
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
MOSI:
11
=
=
>
6
MISO:
12
=
=
>
8
SCK :
13
=
=
>
4
SS :
10
=
=
>
10
3V3
:
3V3
=
=
>
5
GND : GND
=
=
>
9
Arduino CrazyRadio
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
MOSI:
11
=
=
>
6
MISO:
12
=
=
>
8
SCK :
13
=
=
>
4
SS :
10
=
=
>
10
3V3
:
3V3
=
=
>
5
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课