4.5.7. SPI 压力测试
4.5.7.1. 测试原理
SPI 总线
测试内容
1. 测试
数据传输
测试:使用 transfer_buf和transfer_read_write函数分别 进行 纯 数据 发送、读取 和 验证。数据包 的 长度 由 transfer_size参数控制,并且 测试 会 多次 循环 进行(由 iterations 控制)。 吞吐量
和 速率 计算:通过 全局变量 _read_count和_write_count记录读取 和 写入 的 字节数,并 周期性 计算 和 输出 传输速率。 show_transfer_rate函数用于 计算 并 输出 吞吐量(单位: kbps)。 传输
模式 切换:通过 SPI 模式、位数 和 速度 等 参数 的 不同 组合,测试 SPI 设备 在 不同 条件 下 的 性能 表现。例如,可以 设置 数据 buffer 的 大小 或者 SPI 总线 速度( speed),测试 设备 在 不同 条件 下 的 稳定性 和 性能。
2. 命令
测试
命令: ${script_dir}/spidev_tc" -D "$Device" -s "$spi_speed" -I "$StressCount" -e 3 -S 32 > "$spi_test_log_file" 2>&1参数
解析: -D "$Device":该选项 指定 了 要 操作 的 SPI 设备 文件(如 /dev/spidev2.0 )。 -s "$spi_speed":该选项 指定 了 SPI 总线 的 通信 速度(单位 是 赫兹, Hz)。 -I "$StressCount":该选项 指定 了 测试 的 次数。 -e 3:该选项 指定 了 测试 模式 或 类型,-e 后面 的 数字 通常 表示 不同 的 测试 类型,例如,脚本 中 3 代表 回环 测试。 -S 32:该选项 指定 每次 测试 的 传输数据 大小,单位 是 字节。 > "$spi_test_log_file" 2>&1:这是命令行 的 输出 重定向 部分。 其中
> "$spi_test_log_file"表示将 标准 输出( stdout)重定向 到 指定 的 日志 文件($spi_test_log_file)。 而
2>&1表示将 标准 错误 输出 重定向 到 同一个 日志 文件,这样 所有 输出(包括 错误信息)都 会 被 记录 到 日志 文件 中。
4.5.7.2. 准备工作
压测脚本使用说明
/app/platform_samples/chip_base_test/05_spi_test 目录spistress.sh ,这个spidev_tc , 这个
spistress.sh
压测spistress.sh 支持
root@buildroot:/app/platform_samples/chip_base_test/05_spi_test# ./spistress.sh -h
Usage: ./spistress.sh [options]
Options:
-d <device> Set the SPI device to test (default: /dev/spidev2.0).
-c <count> Set the stress test count (default: 100).
-s <speed> Set the SPI speed in Hz (default: 12000000).
-o <directory> Set the output directory for logs (default: '../log').
-h Show this help message and exit.
各
-d <device>:指定要 测试 的 SPI 设备,默认 设备 路径 为 /dev/spidev2.0。-c <count>:设置压力 测试 的 次数。 -s <speed>:设置 SPI 的速度,单位 是 Hz,默认值 为 12000000 (即 12 MHz)。 -o <directory>:设置日志 输出 目录,默认值 为 ../log。
示例:
例如,使用./spistress.sh -d /dev/spidev2.0 -c 500 -s 24000000 -o /userdata/spi_test_logs 自定义/userdata/spi_test_logs。
spidev_tc
spidev_tc 源码
-D --device: 指定使用的 SPI 设备。
-s, --speed: 设置最大速度( Hz)。
-d, --delay: 设置延迟(微秒)。
-b, --bpw: 设置每字的位数。
-i, --input: 从文件中输入数据(例如:"test.bin")。
-o, --output: 将数据输出到文件(例如:"results.bin")。
-l, --loop: 启用回环测试。
-H, --cpha: 时钟相位。
-O, --cpol: 时钟极性。
-L, --lsb: 低位优先。
-C, --cs-high: 片选信号为高电平有效。
-3, --3wire: SI/SO 信号共享。
-v, --verbose: 详细模式(显示发送缓冲区)。
-p : 发送数据(例如:"1234\xde\xad")。
-N, --no-cs: 禁用片选信号。
-R, --ready: 从机拉低以暂停。
-2, --dual: 双线传输。
-4, --quad: 四线传输。
-S, --size: 指定测试的数据大小(字节)。
-I, --iter: 迭代次数,当设置 `-e` 扩展测试模式时,默认是无限循环。
-e, --mode: 指定测试模式, 1: 读取, 2: 写入, 3: 读和写。
-h, --help: 显示帮助信息。
如./spidev_tc 中 -e 改成
./spidev_tc -D /dev/spidev2.0 -s 12000000 -I 1 -e 2 -S 32 -v
可以
./spidev_tc -D /dev/spidev2.0 -s 12000000 -I 1 -e 2 -S 32 -v
bits per word: 8
max speed: 1000000 Hz (1000 KHz)
userspace spi write test, len=10 times=1
test, times=0
TX | 67 C6 69 73 51 FF 4A EC 29 CD __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
./spidev_tc -D /dev/spidev2.0 -s 12000000 -I 10 -e 1 -S 32 -v
spi mode: 0x0
bits per word: 8
max speed: 1000000 Hz (1000 KHz)
userspace spi read test, len=10 times=1
test, times=0
RX | 67 C6 69 73 51 FF 4A EC 29 CD __ __ __ __ __ __ __ __ __ __ __ __ __ __ __
注意:
在
进行 外部 回环 测试 时,需要 先 执行 SPI Slave 程序,再 执行 SPI Master 程序。假如 先 执行 SPI Master 程序,后 执行 SPI Slave 程序,可能 会 由于 Master 与 Slave 不 同步 导致 SPI 接收数据 出现 丢失。
注意事项
1. 查看 x5_evb 原理图

并

2. 查看 x5_evb 设备树
&spi2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi2>;
spidev@2 {
compatible = "dr,x5-spidev";
spi-max-frequency = <32000000>;
reg = <0>;
};
};
如
&spi2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi2>;
spi-slave;
slave@0 {
compatible = "dr,x5-spidev";
spi-max-frequency = <32000000>;
reg = <0>;
};
}
3. 确认 SDK 中 app/samples/platform_samples/chip_base_test/05_spi_test 路径root@buildroot:/app/platform_samples/chip_base_test/05_spi_test# 路径spistress.sh、spidev_tc.c、spidev_tc 三个
(base) root@/app/samples/platform_samples/chip_base_test/05_spi_test# tree
.
├── spidev_tc
├── spidev_tc.c
└── spistress.sh
4. 如果
/opt/arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc -o spidev_tc spidev_tc.c
4.5.7.3. 测试方法
确保
./spistress.sh
运行
root@buildroot:/app/platform_samples/chip_base_test/05_spi_test# ./spistress.sh
SPI test starting...
Test configuration:
Device: /dev/spidev0.0
Stress Count: 100
SPI Speed: 12000000 Hz
Output Directory: /app/platform_samples/chip_base_test/log
Log file: /app/platform_samples/chip_base_test/log/spi_test_log3.txt
SPI test completed successfully! Log saved to: /app/platform_samples/chip_base_test/log/spi_test_log3.txt
此时
root@buildroot:/app/platform_samples/chip_base_test# cat log/spi_test_log1.txt
spi mode: 0x0
bits per word: 8
max speed: 12000000 Hz (12000 kHz)
Userspace spi read and write test, test_len=32 iterations=100
Test times: 0 Data verification Successful
Test times: 1 Data verification Successful
Test times: 2 Data verification Successful
Test times: 3 Data verification Successful
.....
Test times: 98 Data verification Successful
Test times: 99 Data verification Successful
4.5.7.4. 测试指标
测试程序/app/platform_samples/chip_base_test/log/ 目录
spi_test_log*.txt:记录
压 测时 的 打印信息 与 当前 状态。
测试fail、 error、 timeout 等
cd "/app/platform_samples/chip_base_test/log/" && grep -iE 'error|fail|timeout' spi_test_log*.txt
SPI 压测结果
运行
Test times: 97 Data verification Successful
Test times: 98 Data verification Successful
Test times: 99 Data verification Successful