4.3.8. SPI 调试指南
4.3.8.1. SPI 概述
SPI(Serial Peripheral Interface) 通信
4.3.8.2. 特点
该
硬件说明
所有 SPI 控制器
SPI-Master:最高
频率 50MHz SPI-Slave:最高
频率 32MHz
中断
作为 SPI-Slave 端:
MOSI: CPU定频 在 1.5GHz 时,实测
可以 达到 32MHz MISO: CPU定频 在 1.5GHz 时,实测
可以 达到 16MHz
作为 SPI-Master 端:
均
可 正常 通讯,可以 达到 32MHz。
4.3.8.3. 功能描述
典型应用

SPI 一个
功能原理
通信模式
SPI 采用
信号线说明
SPI 通信
数据传输说明
在
通信流程简述
通信
时钟极性与相位说明
SPI 有

CPOL = 0 , CPHA = 0 : CLK 空闲
上
此

CPOL = 0 , CPHA = 1 : CLK 空闲
上
此

CPOL = 1 , CPHA = 1 : CLK 空闲
上
此

CPOL = 1 , CPHA = 0 : CLK 空闲
上
此
这里
| CPOL | CPHA | 描述 |
|---|---|---|
| 0 | 0 | 时钟 |
| 0 | 1 | 时钟 |
| 1 | 0 | 时钟 |
| 1 | 1 | 时钟 |
工作方式
主
选择
数据传输
通信
4.3.8.4. 驱动代码
Linux SPI 驱动框架介绍
spi driver 层:主要
实现 对 SPI 硬件 IP 的 操作,另外 还 实现 了 spi framework 定义 的 接口。 spi framework 层:可以
理解 为 spi driver 的 适配 层,对 下层 定义 了 一组 driver 层 需要 实现 的 接口,对 上 提供 了 通用 接口 屏蔽 了 硬件 细节。 spi char device 层:为
用户 空间 提供 节点,方便 用户 空间 与 内核 空间 进行 数据交换。
SPI 驱动代码位置
驱动
drivers/spi/spi-dw-core.c
drivers/spi/spi-dw-mmio.c
drivers/spi/spi-dw-dma.c
SPI DTS 配置说明
SPI 控制器kernel/arch/arm64/boot/dts/hobot/x5.dtsi 文件
备注:
x5.dtsi 中
SPI 控制器
以
&spi2 {
status = "okay"; /*启用 SPI2控制器*/
pinctrl-names = "default"; /*使用默认引脚配置*/
pinctrl-0 = <&pinctrl_spi2>; /*引用默认引脚配置节点*/
};
DTS 配置 SPI 使用 DMA
如果
&spi2 {
status = "okay"; /*启用 SPI2控制器*/
pinctrl-names = "default"; /*使用默认引脚配置*/
pinctrl-0 = <&pinctrl_spi2>; /*引用默认引脚配置节点*/
dma-names = "tx", "rx"; /*定义 DMA 传输和接收的名称*/
dmas = <&axi_dmac 25>, <&axi_dmac 24>; /*声明 DMA 握手通道*/
};
SPI6 绑定
&spi6 {
status = "okay"; /*启用 SPI2控制器*/
pinctrl-names = "default"; /*使用默认引脚配置*/
pinctrl-0 = <&pinctrl_dsp_spi>; /*引用默认引脚配置节点*/
dma-names = "tx", "rx"; /*定义 DMA 传输和接收的名称*/
dmas = <&dsp_axi_dma 22>, <&dsp_axi_dma 21>; /*声明 DMA 握手通道*/
};
SPI DMA 握手
| RX | TX | |
|---|---|---|
| SPI0 | 20 | 21 |
| SPI1 | 22 | 23 |
| SPI2 | 24 | 25 |
| SPI3 | 26 | 27 |
| SPI4 | 28 | 29 |
| SPI5 | 30 | 31 |
| SPI6(DSP_DMAC) | 21 | 22 |
4.3.8.5. 功能使用
上述
使用 SPI1 双片选的配置
首先num-cs 节点
spi1: spi@34010000 {
compatible = "horizon,dwc-ssi-1.01a"; /*指定 SPI 设备1控制器兼容的硬件型号*/
status = "disabled"; /*标记 SPI 设备1控制器为禁用状态*/
......
num-cs = <2>; /*指定 SPI 设备1控制器的片选信号数量,这里特别说明一下,该芯片只有 SPI1有两个片选,其他的 SPI 写2无效*/
......
};
其次
&spi1 {
status = "okay"; /*启用 SPI 设备1控制器*/
pinctrl-names = "default"; /*使用默认引脚配置*/
pinctrl-0 = <&pinctrl_spi1 &pinctrl_spi1_ssn1>; /*引用默认引脚控制配置节点,选定主设备和片选信号*/
dma-names = "tx", "rx"; /*定义 DMA 传输和接收的名称*/
dmas = <&axi_dmac 23>, <&axi_dmac 22>; /*声明 DMA 握手通道*/
spidev@0 {
compatible = "dr,x5-spidev"; /*指定 spidev0的兼容信息*/
spi-max-frequency = <32000000>; /*设置 spidev0的最大频率*/
reg = <0>; /*指定 spidev0的寄存器索引*/
};
spidev@1 {
compatible = "dr,x5-spidev"; /*指定 spidev1的兼容信息*/
spi-max-frequency = <32000000>; /*设置 spidev1的最大频率*/
reg = <1>; /*指定 spidev 的寄存器索引*/
};
};
两个/dev/spidev1.0 和 /dev/spidev1.1 两个
时钟极性和相位设置
我们spi-cpha;,spi-cpol; 两个
&spi1 {
status = "okay"; /*启用 SPI 设备1控制器*/
pinctrl-names = "default"; /*使用默认引脚配置*/
pinctrl-0 = <&pinctrl_spi1 &pinctrl_spi1_ssn1>; /*引用默认引脚控制配置节点,选定主设备和片选信号*/
dma-names = "tx", "rx"; /*定义 DMA 传输和接收的名称*/
dmas = <&axi_dmac 23>, <&axi_dmac 22>; /*声明 DMA 握手通道*/
spidev@0 {
compatible = "dr,x5-spidev"; /*指定 spidev0的兼容信息*/
spi-max-frequency = <32000000>; /*设置 spidev0的最大频率*/
reg = <0>; /*指定 spidev0的寄存器索引*/
spi-cpha; /*配置 spidev0时钟相位,声明即为1*/
spi-cpol; /*配置 spidev0时钟极性,声明即为1*/
};
spidev@1 {
compatible = "dr,x5-spidev";
spi-max-frequency = <32000000>;
reg = <1>;
};
};
增加spi-cpha;,spi-cpol; 两个kernel\drivers\spi\spi.c 中
SPI 多片选功能使用说明
X5 各 SPI 控制器
| SPI 控制器 | 硬件 |
|---|---|
| SPI1 | 2 |
| SPI0、SPI2~SPI6 | 1 |
当
num-cs: SPI 控制器
的 硬件 片选 信号 数量,仅 SPI1 使用 双 硬件 片选时 配置 为 2,其它 情况 下 使用 默认 配置 即可。 cs-gpios:按顺序 列出 每路片 选 配置,第 N 项 对应 reg = <N>的从 设备。 写
<0>表示该路 使用 硬件 片选 ,需在对应 pinctrl中配置 SSN 引脚。 写
<&gpio ... GPIO_ACTIVE_LOW>表示该路 使用 GPIO 片选。
reg:从设备 片选 编号,与 cs-gpios一一对应。用户
态 :每个节点 从 设备 对应 /dev/spidev{bus}.{reg},例如reg = <1>对应/dev/spidev2.1。
备注:下文ls_gpio0_porta 3)仅作
场景一:一路硬件片选 + 多路 GPIO 片选
以 SPI6 为例:一路spidev@0,两路 GPIO 片选spidev@1、spidev@2。
pinctrl_dsp_spi: dsp_spigrp {
horizon,pins = <
DSP_SPI6_MISO DSP_PINMUX_1 BIT_OFFSET2 MUX_ALT0 &pconf_drv_pu_ds2_1v8
DSP_SPI6_MOSI DSP_PINMUX_1 BIT_OFFSET4 MUX_ALT0 &pconf_drv_pu_ds2_1v8
DSP_SPI6_SCLK DSP_PINMUX_1 BIT_OFFSET6 MUX_ALT0 &pconf_drv_pu_ds2_1v8
DSP_SPI6_SSN DSP_PINMUX_1 BIT_OFFSET8 MUX_ALT0 &pconf_drv_pu_ds2_1v8 /* 硬件片选 SSN,reg=0 */
>;
};
&spi6 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_dsp_spi>;
/* GPIO chip selects */
cs-gpios = <0>, /* SPI6 使用多片选时必须配置该项,表示 SSN 用于硬件片选*/
<&dsp_gpio_porta 4 GPIO_ACTIVE_LOW>, /* reg=1:GPIO 片选 */
<&ls_gpio0_porta 3 GPIO_ACTIVE_LOW>; /* reg=2:GPIO 片选 */
dma-names = "tx", "rx";
dmas = <&dsp_axi_dma 22>, <&dsp_axi_dma 21>;
spidev@0 { /* 硬件片选从设备 */
compatible = "dr,x5-spidev";
reg = <0>;
spi-max-frequency = <5000000>;
status = "okay";
};
spidev@1 { /* GPIO 片选从设备 */
compatible = "dr,x5-spidev";
reg = <1>;
spi-max-frequency = <5000000>;
status = "okay";
};
spidev@2 { /* GPIO 片选从设备 */
compatible = "dr,x5-spidev";
reg = <2>;
spi-max-frequency = <5000000>;
status = "okay";
};
};
启动/dev/spidev2.0、/dev/spidev2.1、/dev/spidev2.2。
注意:SPI6 不
场景二:两路硬件片选 + 多路 GPIO 片选
以 SPI1 为例:两路SSN、SSN_1,另用spidev@2、spidev@3。
pinctrl_spi1: spi1grp {
horizon,pins = <
LSIO_SPI1_SCLK LSIO_PINMUX_0 BIT_OFFSET2 MUX_ALT0 &pconf_drv_pu_ds2_1v8
LSIO_SPI1_SSN LSIO_PINMUX_0 BIT_OFFSET4 MUX_ALT0 &pconf_drv_pu_ds2_1v8 /* 硬件片选 SSN,reg=0 */
LSIO_SPI1_MISO LSIO_PINMUX_0 BIT_OFFSET6 MUX_ALT0 &pconf_drv_pu_ds2_1v8
LSIO_SPI1_MOSI LSIO_PINMUX_0 BIT_OFFSET8 MUX_ALT0 &pconf_drv_pu_ds2_1v8
>;
};
pinctrl_spi1_ssn1: spi1_ssn1grp {
horizon,pins = <
LSIO_SPI1_SSN_1 LSIO_PINMUX_0 BIT_OFFSET0 MUX_ALT0 &pconf_drv_pu_ds2_1v8 /* 硬件片选 SSN_1,reg=1 */
>;
};
&spi1 {
status = "okay";
num-cs = <2>; /*指定 SPI1 控制器的片选信号数量,这里特别说明一下,该 soc 只有 SPI1 有两个片选,其他的 SPI 写 2 无效*/
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1 &pinctrl_spi1_ssn1>;
cs-gpios = <0>, /*表示这一路不用 GPIO,使用硬件片选(pinctrl_spi1 中配置片选信号) reg=0:SSN*/
<0>, /*表示这一路不用 GPIO,使用硬件片选(pinctrl_spi1_ssn1 中配置片选信号) reg=1:SSN_1*/
<&ls_gpio1_porta 13 GPIO_ACTIVE_LOW>, /*reg=2:GPIO 片选*/
<&ls_gpio1_porta 15 GPIO_ACTIVE_LOW>; /*reg=3:GPIO 片选*/
spidev@0 { /* 硬件片选从设备 */
compatible = "dr,x5-spidev";
reg = <0>;
spi-max-frequency = <5000000>;
status = "okay";
};
spidev@1 { /* 硬件片选从设备 */
compatible = "dr,x5-spidev";
reg = <1>;
spi-max-frequency = <5000000>;
status = "okay";
};
spidev@2 { /* GPIO 片选从设备 */
compatible = "dr,x5-spidev";
reg = <2>;
spi-max-frequency = <5000000>;
status = "okay";
};
spidev@3 { /* GPIO 片选从设备 */
compatible = "dr,x5-spidev";
reg = <3>;
spi-max-frequency = <5000000>;
status = "okay";
};
};
启动/dev/spidev1.0~/dev/spidev1.3。
场景三:纯 GPIO 片选
以 SPI2 为例:全部SSN 引脚,避免
pinctrl_spi2: spi2grp {
horizon,pins = <
LSIO_SPI2_SCLK LSIO_PINMUX_1 BIT_OFFSET16 MUX_ALT0 &pconf_drv_pu_ds2_3v3
/* LSIO_SPI2_SSN 必须注释,否则占用硬件片选引脚 */
LSIO_SPI2_MISO LSIO_PINMUX_1 BIT_OFFSET20 MUX_ALT0 &pconf_drv_pu_ds2_3v3
LSIO_SPI2_MOSI LSIO_PINMUX_1 BIT_OFFSET22 MUX_ALT0 &pconf_drv_pu_ds2_3v3
>;
};
&spi2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi2>;
/* GPIO chip selects */
cs-gpios = <&ls_gpio0_porta 21 GPIO_ACTIVE_LOW> /* reg=0: GPIO 片选 */
<&ls_gpio0_porta 12 GPIO_ACTIVE_LOW>, /* reg=1:GPIO 片选 */
<&ls_gpio0_porta 13 GPIO_ACTIVE_LOW>; /* reg=2:GPIO 片选 */
spidev@0 { /* GPIO 片选从设备 */
compatible = "dr,x5-spidev";
reg = <0>;
spi-max-frequency = <5000000>;
status = "okay";
};
spidev@1 { /* GPIO 片选从设备 */
compatible = "dr,x5-spidev";
reg = <1>;
spi-max-frequency = <5000000>;
status = "okay";
};
spidev@2 { /* GPIO 片选从设备 */
compatible = "dr,x5-spidev";
reg = <2>;
spi-max-frequency = <5000000>;
status = "okay";
};
};
启动/dev/spidev2.0、/dev/spidev2.1、/dev/spidev2.2。
用户态阶段使用
将
确认
/* arch/arm64/configs/hobot_x5_soc_defconfig */
...
CONFIG_SPI_SPIDEV=m
...
确认
&spi2 {
spidev@0 {
compatible = "dr,x5-spidev";
spi-max-frequency = <32000000>;
reg = <0>;
};
}
SPI 内部回环测试
SPI 内部
我们/app/platform_samples/chip_base_test/05_spi_test 目录
root@buildroot:/app/platform_samples/chip_base_test/05_spi_test# ./spidev_tc -D /dev/spidev2.0 -v -s 1000000 -e 3 -l -S 256 -I 1
spi mode: 0x20
bits per word: 8
max speed: 1000000 Hz (1000 kHz)
Userspace spi read and write test, test_len=256 iterations=1
TX | 67 C6 69 73 51 FF 4A EC 29 CD BA AB F2 FB E3 46 7C C2 54 F8 1B E8 E7 8D 76 5A 2E 63 33 9F C9 9A |g.isQ.J.)......F|.T.....vZ.c3...|
TX | 66 32 0D B7 31 58 A3 5A 25 5D 05 17 58 E9 5E D4 AB B2 CD C6 9B B4 54 11 0E 82 74 41 21 3D DC 87 |f2..1X.Z%]..X. ^ .......T...tA!=..|
TX | 70 E9 3E A1 41 E1 FC 67 3E 01 7E 97 EA DC 6B 96 8F 38 5C 2A EC B0 3B FB 32 AF 3C 54 EC 18 DB 5C |p.>.A..g>.~...k..8\*..;.2.<T...\|
TX | 02 1A FE 43 FB FA AA 3A FB 29 D1 E6 05 3C 7C 94 75 D8 BE 61 89 F9 5C BB A8 99 0F 95 B1 EB F1 B3 |...C...:.)...<|.u..a..\.........|
TX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1F 23 1E A8 1C 7B 64 C5 14 73 5A C5 5E 4B 79 63 |......:.....HGd..#...{d..sZ. ^ Kyc|
TX | 3B 70 64 24 11 9E 09 DC AA D4 AC F2 1B 10 AF 3B 33 CD E3 50 48 47 15 5C BB 6F 22 19 BA 9B 7D F5 |;pd$...........;3..PHG.\.o"...}.|
TX | 0B E1 1A 1C 7F 23 F8 29 F8 A4 1B 13 B5 CA 4E E8 98 32 38 E0 79 4D 3D 34 BC 5F 4E 77 FA CB 6C 05 |.....#.)......N..28.yM=4._Nw..l.|
TX | AC 86 21 2B AA 1A 55 A2 BE 70 B5 73 3B 04 5C D3 36 94 B3 AF E2 F0 E4 9E 4F 32 15 49 FD 82 4E A9 |..!+..U..p.s;.\.6.......O2.I..N.|
RX | 67 C6 69 73 51 FF 4A EC 29 CD BA AB F2 FB E3 46 7C C2 54 F8 1B E8 E7 8D 76 5A 2E 63 33 9F C9 9A |g.isQ.J.)......F|.T.....vZ.c3...|
RX | 66 32 0D B7 31 58 A3 5A 25 5D 05 17 58 E9 5E D4 AB B2 CD C6 9B B4 54 11 0E 82 74 41 21 3D DC 87 |f2..1X.Z%]..X. ^ .......T...tA!=..|
RX | 70 E9 3E A1 41 E1 FC 67 3E 01 7E 97 EA DC 6B 96 8F 38 5C 2A EC B0 3B FB 32 AF 3C 54 EC 18 DB 5C |p.>.A..g>.~...k..8\*..;.2.<T...\|
RX | 02 1A FE 43 FB FA AA 3A FB 29 D1 E6 05 3C 7C 94 75 D8 BE 61 89 F9 5C BB A8 99 0F 95 B1 EB F1 B3 |...C...:.)...<|.u..a..\.........|
RX | 05 EF F7 00 E9 A1 3A E5 CA 0B CB D0 48 47 64 BD 1F 23 1E A8 1C 7B 64 C5 14 73 5A C5 5E 4B 79 63 |......:.....HGd..#...{d..sZ. ^ Kyc|
RX | 3B 70 64 24 11 9E 09 DC AA D4 AC F2 1B 10 AF 3B 33 CD E3 50 48 47 15 5C BB 6F 22 19 BA 9B 7D F5 |;pd$...........;3..PHG.\.o"...}.|
RX | 0B E1 1A 1C 7F 23 F8 29 F8 A4 1B 13 B5 CA 4E E8 98 32 38 E0 79 4D 3D 34 BC 5F 4E 77 FA CB 6C 05 |.....#.)......N..28.yM=4._Nw..l.|
RX | AC 86 21 2B AA 1A 55 A2 BE 70 B5 73 3B 04 5C D3 36 94 B3 AF E2 F0 E4 9E 4F 32 15 49 FD 82 4E A9 |..!+..U..p.s;.\.6.......O2.I..N.|
Test times: 0 Data verification Successful
root@buildroot:/app/platform_samples/chip_base_test/05_spi_test#
SPI 外部回环测试
SPI 外部
我们
将 JTAG 口
下图

下图
当
这里
&spi2 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi2>;
spi-slave;
slave@0 {
compatible = "dr,x5-spidev";
spi-max-frequency = <32000000>;
reg = <0>;
};
};
修改 SPI1 DTS 以num-cs = <2>; 这个
&spi1 {
num-cs = <2>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1 &pinctrl_spi1_ssn1>;
spidev@0 {
compatible = "dr,x5-spidev";
spi-max-frequency = <32000000>;
reg = <0>;
};
spidev@1 {
compatible = "dr,x5-spidev";
spi-max-frequency = <32000000>;
reg = <1>;
};
};
测试
1 、打开一个终端,操作 SPI 从设备:
root@buildroot:~# /app/platform_samples/chip_base_test/05_spi_test/spidev_tc -D /dev/spidev2.0 -e 1 -v -S 64 -I 1
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 kHz)
Userspace spi read test, test_len=64 iterations=1
( 说明:上述命令执行之后,程序会一直等待,直到接收到从 SPI Master 发送的数据。)
2 、打开另一个终端,操作 SPI 主设备:
root@buildroot:~# /app/platform_samples/chip_base_test/05_spi_test/spidev_tc -D /dev/spidev1.1 -e 2 -v -S 64 -I 1
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 kHz)
Userspace spi write test, test_len=64 iterations=1
TX | 67 C6 69 73 51 FF 4A EC 29 CD BA AB F2 FB E3 46 7C C2 54 F8 1B E8 E7 8D 76 5A 2E 63 33 9F C9 9A |g.isQ.J.)......F|.T.....vZ.c3...|
TX | 66 32 0D B7 31 58 A3 5A 25 5D 05 17 58 E9 5E D4 AB B2 CD C6 9B B4 54 11 0E 82 74 41 21 3D DC 87 |f2..1X.Z%]..X. ^ .......T...tA!=..|
Test times: 0
root@buildroot:~#
( 说明:上述命令执行之后, SPI 主设备就直接发送数据出去了 )
3 、这个时候可以观察到 SPI 从设备的终端会显示接收到的数据,整体状态形如下述结果:
root@buildroot:~# /app/platform_samples/chip_base_test/05_spi_test/spidev_tc -D /dev/spidev2.0 -e 1 -v -S 64 -I 1
spi mode: 0x0
bits per word: 8
max speed: 500000 Hz (500 kHz)
Userspace spi read test, test_len=64 iterations=1
RX | 67 C6 69 73 51 FF 4A EC 29 CD BA AB F2 FB E3 46 7C C2 54 F8 1B E8 E7 8D 76 5A 2E 63 33 9F C9 9A |g.isQ.J.)......F|.T.....vZ.c3...|
RX | 66 32 0D B7 31 58 A3 5A 25 5D 05 17 58 E9 5E D4 AB B2 CD C6 9B B4 54 11 0E 82 74 41 21 3D DC 87 |f2..1X.Z%]..X. ^ .......T...tA!=..|
rate: tx 0.1kbps, rx 0.1kbps
Test times: 0
root@buildroot:~#
注:在
SPI 通信案例
这边
在
然后
root@buildroot:/app# /app/platform_samples/chip_base_test/05_spi_test/spidev_tc -D /dev/spidev1.0 -s 5000000 -e 2 -S 2 -v -p "\x15\x00"
spi mode: 0x0
bits per word: 8
max speed: 5000000 Hz (5000 kHz)
TX | 15 00 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |..|
root@buildroot:/app# /app/platform_samples/chip_base_test/05_spi_test/spidev_tc -D /dev/spidev1.0 -s 5000000 -e 1 -S 2 -v -p "\x80\x00"
spi mode: 0x0
bits per word: 8
max speed: 5000000 Hz (5000 kHz)
RX | FF 0F __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ |..|
root@buildroot:/app#
我们
如果
设备树
&spi1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_spi1 &pinctrl_spi1_ssn1>;
dma-names = "tx", "rx";
dmas = <&axi_dmac 23>, <&axi_dmac 22>;
bmi08g@0 {
compatible = "bmi088_gyro"; /*指定该 IMU 的兼容性标识*/
reg = <0>; /*指定设备的寄存器索引*/
spi-max-frequency = <5000000>;
interrupt-parent = <&ls_gpio1_porta>; /*指定中断的父设备*/
interrupts = <6 IRQ_TYPE_EDGE_RISING>; /*定义中断号和触发类型*/
};
bmi08a@1 {
compatible = "bmi08a"; /*指定该 IMU 的兼容性标识*/
reg = <1>; /*指定设备的寄存器索引*/
spi-max-frequency = <5000000>;
interrupt-parent = <&ls_gpio1_porta>; /*指定中断的父设备*/
interrupts = <4 IRQ_TYPE_EDGE_RISING>; /*定义中断号和触发类型*/
};
};
驱动kernel\drivers\iio\imu 中,相应kernel\drivers\iio 中Kconfig 和 Makefie,以及
测试用例源码: spidev_tc.c
SDK 中该
{platform_source_code}/app/samples/platform_samples/chip_base_test/05_spi_test/spidev_tc.c
这里
/app/platform_samples/chip_base_test/05_spi_test/spidev_tc
详细
测试用例源码编译方法:
将/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 -lpthread 编译,得到 spidev_tc 可执行文件。将
4.3.8.6. 常见的 SPI 通信错误及排查方法
在
时钟极性或相位设置错误导致的问题
当 SPI 设备
数据传输不稳定的常见原因
数据传输
如何通过调试工具解决 SPI 通信问题
在