衡山派Luban-Lite QSPI设备驱动测试指南:从配置到读写实战

衡山派Luban-Lite QSPI设备驱动测试指南:从配置到读写实战 衡山派Luban-Lite QSPI设备驱动测试指南从配置到读写实战大家好最近在衡山派开发板上调试SPI NAND Flash发现Luban-Lite系统里内置了一个非常方便的QSPI测试工具qspidev。很多刚开始接触这块的朋友可能会对如何配置和使用这个工具感到困惑。今天我就结合自己的调试经验手把手带大家走一遍从环境配置到实际读写测试的全过程帮你快速验证QSPI设备的驱动是否工作正常。1. 准备工作开启测试工具在开始测试之前我们需要先确保qspidev这个测试工具已经被编译到系统里。它默认可能没有开启需要我们自己配置一下。1.1 进入配置菜单首先打开你的终端进入到Luban-Lite SDK的根目录下。然后输入以下命令scons --menuconfig这个命令会启动一个图形化的配置界面就像我们以前配置Linux内核一样用方向键和回车键进行操作。1.2 找到并启用驱动测试在配置界面里我们需要按顺序找到并开启选项。操作路径如下使用方向键选择Drivers options ---然后按回车进入。接着选择Drivers examples ---按回车进入。最后你会看到[*] Enable QSPI driver test command这个选项。按空格键选中它前面会出现一个*号表示启用。完成后按ESC键几次退出配置界面系统会提示你保存选择“Yes”保存配置即可。注意配置完成后必须重新编译整个系统固件并烧录到开发板新的配置才会生效。直接运行scons命令进行编译。2. 上电运行与设备发现将编译好的新固件烧录到衡山派开发板上电启动。通过串口工具如MobaXterm、SecureCRT或Putty连接到板子的调试串口你会看到系统启动日志最后进入Luban-Lite的命令行界面提示符通常是aic /。2.1 列出系统设备在测试QSPI设备前我们得先知道它在系统里叫什么名字。在串口命令行里输入list_device这个命令会列出当前系统里所有的设备。你会看到一个类似下面的列表aic / list_device device type ref count -------- -------------------- ---------- gt911 Touch Device 1 wdt WDT Device 0 temp_aic Sensor Device 0 rootfs MTD Device 0 os MTD Device 0 spl MTD Device 0 spinand0 SPI Device 0 mtop Character Device 0 aicfb Graphic Device 0 hwcryto Security Device 0 record Pipe 0 dmic0 Sound Device 0 sound0 Sound Device 0 uart1 Character Device 0 uart0 Character Device 2 rtc RTC 0 qspi0 SPI Bus 0 i2c3 I2C Bus 1 pin Pin Device 0 gpai ADC Device 0咱们重点关注type为SPI Device的行。从上面列表可以看到有一个设备叫spinand0它的类型正是SPI Device。这就是我们接下来要测试的QSPI Flash设备比如SPI NAND。请记下你的设备名后面会用到。2.2 获取工具帮助在动手操作前先看看qspidev工具怎么用。输入qspidev help这个命令会打印出所有可用的子命令和简要说明是咱们的“说明书”。3. 初始化QSPI设备和任何外设一样使用前需要先初始化告诉驱动以什么模式、多快的速度去通信。3.1 初始化命令格式初始化使用的命令格式是qspidev init 设备名 模式 频率设备名就是咱们刚才用list_device找到的名字比如spinand0。模式指SPI的时钟极性和相位模式通常用数字表示如0, 1, 2, 3。具体用哪个模式需要查你的Flash芯片手册。对于很多SPI NAND模式3是常用的。频率通信的时钟频率单位是Hz。比如50000000表示50MHz。不要超过芯片支持的最大频率。3.2 执行初始化根据上面的参数说明一个典型的初始化命令如下qspidev init spinand0 3 50000000这条命令的意思是初始化名为spinand0的设备使用SPI模式3通信频率为50MHz。执行后如果没有报错就说明初始化成功了。如果提示错误请检查设备名是否正确以及频率是否设置得过高。4. QSPI读写测试实战初始化完成后就可以进行实际的读写测试了。qspidev提供了两个核心命令sendhex发送和recvhex接收。4.1 理解线宽模式参数在介绍具体命令前必须先搞懂一个关键参数lines。这个参数决定了命令、地址、数据分别用几根数据线来传输。它由三位数字组成格式是CMD线宽ADDR线宽DATA线宽。每个位置可以是1、2或4。111标准SPI模式。命令、地址、数据都只用1根数据线MOSI/MISO传输。144QIO模式。命令用1线地址和数据都用4线传输速度更快。114命令和地址用1线数据用4线。具体使用哪种模式必须严格参照你的Flash芯片数据手册。乱设会导致通信失败。4.2 发送命令测试使用sendhex命令可以向Flash发送指令有时还会附带地址和数据。这常用于写使能、擦除、页编程等操作。命令格式qspidev sendhex lines cmd addr dummy_cnt data hex string参数详解lines线宽模式如111。cmd要发送的命令字用16进制表示例如9f读ID命令。addr地址数据用16进制表示。例如000000表示24位地址0。如果命令不需要地址用-代替。dummy_cntDummy周期数。有些高速读命令需要在地址和数据之间插入几个时钟周期等待Flash准备数据这个数就是等待的周期数。如果没有用-代替。data hex string要发送的数据用16进制字符串表示字节之间可以用空格分隔。实战示例1发送复位命令很多Flash芯片有一个复位命令Reset命令字通常是ff这个命令一般不需要地址和数据。qspidev sendhex 111 ff这条命令以1线模式发送命令0xff让设备复位。实战示例2发送带数据的命令假设我们要向地址0x100写入几个字节的数据0x41, 0x42, 0x43使用的命令字是0x02Page Program且不需要dummy周期。qspidev sendhex 111 02 000100 - 41 42 43注意地址000100是24位格式6个16进制数。数据部分41 42 43就是要写入的内容。4.3 接收数据测试更多的时候我们需要从Flash读取数据比如读取芯片ID、读取存储的内容。这时就要用到recvhex命令。命令格式qspidev recvhex lines cmd addr dummy_cnt data_length参数详解前四个参数和sendhex一样。最后一个参数data_length是你想要读取的数据长度字节数可以用10进制也可以用0x开头的16进制表示。读到的数据会直接打印在串口终端上。实战示例3读取SPI NAND一页数据这是一个非常典型的操作。假设我们要读取从地址0开始的一页数据假设一页是2048字节即0x800字节。 通常分为两步发送读命令Command Phase例如命令字0x13。发送地址并开始读取数据Address Data Phase例如用读数据命令0x03。# 第一步发送读命令具体命令需查芯片手册 qspidev sendhex 111 13 000000 # 第二步从地址0开始读取0x800个字节的数据 qspidev recvhex 111 03 000000 0 0x800第一条命令以1线模式发送命令0x13和地址0x000000。第二条命令以1线模式发送命令0x03和地址0x000000dummy周期为0然后连续读取0x8002048个字节的数据。执行第二条命令后终端上会刷出一长串16进制数这就是你从Flash中读出的原始数据。调试小技巧如果读取失败或数据全为0xFF或0x00首先检查线宽模式lines参数是否与芯片要求一致这是最容易出错的地方。确认初始化频率是否在芯片支持范围内过高会导致通信不稳定。仔细核对命令字和dummy周期数这些信息必须从芯片数据手册中获取。可以先尝试读取芯片的ID通常命令是0x9f这是一个简单的验证通信是否正常的办法。通过以上步骤你应该已经能够使用qspidev工具在衡山派Luban-Lite系统上对QSPI Flash设备进行基础的初始化和读写测试了。在实际项目开发中这些底层测试是验证硬件连接和驱动是否正常的关键第一步。