# 04-拓展引脚

此文档用于用户快速使用或测试主板扩展引脚功能。

## 符号说明

* `SDK$`：指代源码路径
* `console$`：泛指主板的命令行控制台。[主板命令行控制台](https://tanzhs-private-organization.gitbook.io/kickpi-book/rk3576/zh/02-kuai-su-shi-yong#console_readme)
* `ADB$`：Android Debug Bridge 命令行工具，泛指可运行 ADB 的环境

## 扩展引脚 <a href="#expansionpin-k7" id="expansionpin-k7"></a>

开发板板载扩展引脚功能

* 可用于连接外部设备（温度传感器、湿度传感器等）
* 与其他电路板或模块通信（I2C、SPI、UART等）
* 自定义GPIO功能

具体功能拓展详情查看引脚列表。

引脚列表标注了每个引脚的默认配置（带\*号），同时给出该引脚所对应的可选择配置。

**K7引脚列表**

![K7\_PIN](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/K7_PIN.png)

**K7引脚电压**

![K7\_PIN\_DOMAIN](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/K7_PIN_DOMAIN.png)

**K7C引脚列表**

![image-20251014174351589](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/image-20251014174351589.png)

**K7C引脚电压**

![image-20251014174424133](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/image-20251014174424133.png)

## GPIO

K7主板扩展引脚可配置 GPIO 引脚，通过[扩展引脚章节](#ExpansionPin-K7)查看对应的 GPIO 引脚位置及编号。

扩展引脚默认GPIO引脚（带\*号）已配置为输出口，可以控制GPIO输出高电平或低电平。

**列举已经注册的GPIO控制节点**

```
console$ ls /sys/class/leds/
GPIO0_A5  GPIO3_B0  GPIO3_D4  GPIO3_D5  PCIE_PWREN  SDMMC0_PWREN  fan  mmc2::  work
```

> 下面控制GPIO的电平状态，$GPIO 需要对应列举出的GPIO名称

**控制GPIO输出电平状态**

控制 GPIO 输出高电平

```
console$ echo 1 >  /sys/class/leds/$GPIO/brightness
```

控制 GPIO 输出低电平

```
console$ echo 0 >  /sys/class/leds/$GPIO/brightness
```

示例：

控制 GPIO3\_D4 输出高电平

```
console$ echo 1 >  /sys/class/leds/GPIO3_D4/brightness
```

控制 GPIO3\_D4 输出低电平

```
console$ echo 0 >  /sys/class/leds/GPIO3_D4/brightness
```

## CAN

K7主板扩展引脚可配置 CAN 接口，通过[扩展引脚章节](#ExpansionPin-K7)查看对应的 CAN 接口位置及编号。

**查询当前CAN设备**

下面以 CAN0 进行示例说明。

```
console$ ifconfig -a
...
can0      Link encap:UNSPEC    Driver rk3576_canfd
          NOARP  MTU:16  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0 
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 
          collisions:0 txqueuelen:10 
          RX bytes:0 TX bytes:0 
          Interrupt:63 
...
```

> 可知设备名称为 can0

**配置CAN**

关闭CAN

```
console$ ip link set can0 down
```

设置仲裁段1M波特率，数据段3M波特率

```
console$ ip link set can0 type can bitrate 1000000 dbitrate 3000000 fd on
```

查看can0配置信息

```
console$ ip -details link show can0
```

启动CAN

```
console$ ip link set can0 up
```

**CAN发送**

发送（标准帧,数据帧,ID:123,date:DEADBEEF）

```
console$ cansend can0 123#DEADBEEF
```

发送（扩展帧,数据帧,ID:00000123,date:DEADBEEF）

```
console$ cansend can0 00000123##1DEADBEEF
```

**CAN接收**

开启打印，等待接收

```
console$ candump can0
```

**回环模式测试**

```
console$ ip link set can0 down
console$ ip link set can0 type can bitrate 500000 sample-point 0.8 dbitrate 2000000 sample-point 0.8 fd on loopback on
console$ ip -details -statistics link show can0
console$ ip link set can0 up
console$ echo 4096 > /sys/class/net/can0/tx_queue_len
console$ candump can0 &
console$ cansend can0 00000123##1DEADBEEF
  can0  00000123  [04]  DE AD BE EF
```

> 回环模式下，cansend 的数据可以通过 candump 接收。

## PWM

K7主板扩展引脚可配置 PWM 接口，通过[扩展引脚章节](#ExpansionPin-K7)查看对应的 PWM 位置及通道号。

**列举pwm节点**

```
console$ ls /sys/class/pwm/
pwmchip0  pwmchip1  pwmchip2
```

**列举对应pwm dts节点**

```
console$ cat /sys/class/pwm/pwmchip*/device/uevent | grep FULLNAME
OF_FULLNAME=/pwm@27331000
OF_FULLNAME=/pwm@2ade6000
OF_FULLNAME=/pwm@2ade7000
```

> 对应关系如下，从上往下，对应 pwmchip0 到 pwmchip2
>
> **PWM0\_CH1\_M0** - pwm0\_2ch\_1 - pwm\@27331000 - **pwmchip0**
>
> **PWM2\_CH6\_M2** - pwm2\_8ch\_6 - pwm\@2ade6000 - **pwmchip1**
>
> **PWM2\_CH7\_M2** - pwm2\_8ch\_7 - pwm\@2ade7000 - **pwmchip2**

**配置PWM**

示例：

软件默认已配置 PWM0\_CH1\_M0（带\*号），下面以 PWM0\_CH1\_M0 进行说明。

设置 PWM0\_CH1\_M0 通道，对应 pwmchip0，周期10000ns，占空比5000ns，极性为normal

```
console$ echo 0 > /sys/class/pwm/pwmchip0/export
console$ echo 10000 > /sys/class/pwm/pwmchip0/pwm0/period
console$ echo 5000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
console$ echo normal > /sys/class/pwm/pwmchip0/pwm0/polarity
console$ echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
```

> 配置成功后，可用万用表测量 PWM0\_CH1\_M0 引脚，电压应为1.6V左右

## UART

K7主板扩展引脚可配置 UART 接口，通过[扩展引脚章节](#ExpansionPin-K7)查看对应的 UART 位置及通道号。

**注意：** K7的UART默认配置的都是1.8V的电平，不能与3.3V电平的UART通讯，请确定好后使用。

[不同电平有什么区别，为什么不能通讯？](#uart_ttl)

**回环测试**

软件默认已配置 UART8，下面以 UART8 进行示例说明。

RX、TX 进行硬件短接。

microcom 指定 UART8 进行通讯

```
console$ microcom -s 115200 /dev/ttyS8
```

示例：

```
root@linaro-alip:/# microcom -s 115200  -p /dev/ttyS8
[ 4218.137343] of_dma_request_slave_channel: dma-names property of node '/serial@2adb0000' missing or empty
connected to /dev/ttyS8
[ 4218.137431] dw-apb-uart 2adb0000.serial: failed to request DMA, use interrupt mode
Escape character: Ctrl-\
Type the escape character to get to the prompt.
hello uart word!
```

> 回环测试下，microcom 能够同时接收输出的字符

## SPI

K7主板扩展引脚可配置SPI接口，通过[扩展引脚章节](#ExpansionPin-K7)查看对应的 SPI 位置及通道号。

**回环测试**

软件默认已配置 SPI4，下面以 SPI4 进行示例说明。

MISO、MOSI 进行硬件短接。

![image-20250421165900688](http://tanzhtanzh.oss-cn-shenzhen.aliyuncs.com/img/image-20250421165900688.png)

列出spi设备节点

```
console$ ls /dev/spi*
/dev/spidev4.0
```

指定设备进行测试

```
console$ spidev_test -D /dev/spidev4.0 -v -l -p "hello"
```

示例：

```
root@linaro-alip:/# ./spidev_test -D /dev/spidev4.0 -v -l -p "hello"
spi mode: 0x20
bits per word: 8
max speed: 500000 Hz (500 kHz)
TX | 68 65 6C 6C 6F __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  |hello|
RX | 68 65 6C 6C 6F __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  |hello|
```

> 工具网盘路径
>
> 3-SoftwareData\Linux\_Spi\_Tool\spidev\_test

## ADC

K7主板扩展引脚配备三路ADC，通过[扩展引脚章节](#ExpansionPin-K7)查看对应的 ADC 位置及通道号。

**读取ADC值**

```
console$ cat /sys/bus/iio/devices/iio\:device0/in_voltage*_raw
```

示例：

读取通道 4 的电压值

```
console$  cat /sys/bus/iio/devices/iio\:device0/in_voltage4_raw
3528
```

**实时读取ADC值**

```
console$ watch -n 1 'cat /sys/bus/iio/devices/iio\:device0/in_voltage*_raw'
```

## 常见问题

**不同电平有什么区别，为什么不能通讯？**

电平标准不匹配

* 1.8V UART的逻辑电平：
  * **高电平（逻辑1）**：通常需要输出≥1.35V（根据LVCMOS/LVTTL标准）。
  * **低电平（逻辑0）**：通常需要输出≤0.45V。
* 3.3V UART的逻辑电平：
  * **高电平（逻辑1）**：需要输入≥2.0V才能被识别为有效高电平。
  * **低电平（逻辑0）**：需要输入≤0.8V才能被识别为有效低电平。

要实现1.8V和3.3V UART的通信，必须通过**电平转换电路**进行适配。以下是常见方案：

使用双向电平转换器（推荐）

* **芯片示例**：TXB0108、TXS0108E、74LVC1T45等。
* 原理：
  * 1.8V侧与3.3V侧分别供电（如1.8V和3.3V）。
  * 芯片根据电源电压自动调整输出电平，确保信号兼容性。
