Skip to content

# 8.2.4. SPI 验证及调试

## 8.2.4.1. J6X SPI功能验证

本小节主要介绍J6X SPI基本功能如何验证，包括环境如何配置，测试命令的执行及测试代码存放位置等。

### 8.2.4.1.1. 测试环境准备

首先确认spidev.c使用的是kernel/spi/spidev.c，还是hobot-drivers/spi/spi_drv/hobot_spidev.c。

kernel/spi/spidev.c：内核自带的spi字符设备驱动。

hobot-drivers/spi/spi_drv/hobot_spidev.c：针对hobot spi协议做了一些定制，改写了read、write接口，仅对原有的ioctl功能做了适配。目前代码默认是加载hobot_spidev.c。

spidev_tc.c是一个开源的测试case，基本包含了SPI相关所有测试项。

spidev_tc.c常见参数说明如下：

    root@hobot:~# /app/sample/S83_Sample/S83E02_Communication/spi_sample/bin/spidev_tc --help
    /app/bin/spi/spidev_tc: unrecognized option '--help'
    Usage: /app/bin/spi/spidev_tc [-DsbdlHOLC3vpNR24SImet]
      -D --device   device to use (default /dev/spidev1.1)            # 指定device，比如spi0 cs0对应节点名称为/dev/spidev0.0，cs1对应节点名称为/dev/spidev0.1
      -s --speed    max speed (Hz)                                    # spi频率，J6X SPI做Master最高支持50M，做Slave最高支持20M
      -d --delay    delay (usec)
      -b --bpw      bits per word                                     # bit数，J6X SPI支持8，16，32bit三种
      -i --input    input data from a file (e.g. "test.bin")
      -o --output   output data to a file (e.g. "results.bin")
      -l --loop     loopback                                          # SPI内部回环测试
      -H --cpha     clock phase                                       # cpha和cpol配合使用可以调整SPI mode，J6X SPI 4种mode都支持
      -O --cpol     clock polarity
      -L --lsb      least significant bit first
      -C --cs-high  chip select active high
      -3 --3wire    SI/SO signals shared
      -v --verbose  Verbose (show tx buffer)                          # 显示额外的信息，比如发送或接收数据
      -p            Send data (e.g. "1234\xde\xad")
      -N --no-cs    no chip select
      -R --ready    slave pulls low to pause
      -2 --dual     dual transfer
      -4 --quad     quad transfer
      -S --size     transfer size
      -I --iter     iterations
      -m --rw-mode  1 read, 2 write, 3 write and read                  # 测试模式选择
      -e --rw-len   read or write len                                  # 测试数据长度
      -t --rw-times read or write times                                # 测试次数
      -f --frame-id support frame id
      -c --crc support crc
      -h --heart pack for test
      -1 --heart pack interval(default: 5s)

    root@hobot:~#

### 8.2.4.1.2. SPI 内部回环测试

SPI内部回环测试仅SPI Master支持，其原理是SPI硬件IP的tx fifo将数据发给rx fifo从而形成回环。

测试命令及结果参考如下：

    root@hobot:~# /app/sample/S83_Sample/S83E02_Communication/spi_sample/bin/spidev_tc -D /dev/spidev0.0 -v -s 1000000 -m 3 -l -e 10 -t 1
    spi mode: 0x20
    bits per word: 8
    max speed: 1000000 Hz (1000 KHz)
    userspace spi read and write test, len=10 times=1
    test, times=0
    TX | 67 C6 69 73 51 FF 4A EC 29 CD __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __

    RX | 67 C6 69 73 51 FF 4A EC 29 CD __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __

    root@hobot:~#

### 8.2.4.1.3. SPI 外部回环测试

SPI外部回环测试指SPI Master接SPI Slave，连线图如下：

图4-1 SPI外部回环连线示意图

如图4-1所示，将SPI的4根线飞好。Master可以选择SPI1，SPI Slave选择外部SPI设备（客户自行选择）。

保证Master和Slave的SPI波特率、传输模式等设置正确，Slave设备侧先执行接收数据测试命令；

J6X侧的发送测试命令参考如下：

    root@hobot:~# /app/sample/S83_Sample/S83E02_Communication/spi_sample/bin/spidev_tc -D /dev/spidev1.0 -v -s 1000000 -m 2 -e 10 -t 1
    spi mode: 0x0
    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 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __

    root@hobot:~#

在Slave设备侧将收到如图4-1 J6X侧Master发送的数据。

注：在进行外部回环测试时，需要先执行SPI Slave程序，再执行SPI Master程序。假如先执行SPI Master程序，后执行SPI Slave程序，可能会由于Master与Slave不同步导致SPI接收数据出现丢失。同理，spidev_tc的-t参数最好只指定一次，如果想进行多次测试，可以写脚本多次执行测试程序，来保证Master与Slave之间的同步。