跳到主要内容

40 Pin GPIO 接口

瑞莎 Cubie A7A 板载 40-Pin GPIO(通用输入输出)接口,为硬件扩展提供了高度灵活的接口支持。

用户可以通过 40-Pin GPIO 接口连接各类传感器、执行器、通信模块、显示屏以及其他嵌入式外设,从而快速实现物联网(IoT)、机器人控制、工业自动化等领域的原型开发与功能验证。

危险

使用 40-Pin GPIO 接口时,请注意引脚和外设的接线,请确保引脚连接正确,不当操作可能导致设备硬件损坏。

GPIO 功能

Cubie A7A 支持给板载的 GPIO 引脚外接外部设备,支持 UART、SPI、I2C、ADC 等。

FUNC9FUNC8FUNC7FUNC6FUNC5FUNC4FUNC3FUNC2FUNC1Pin#Pin#FUNC1FUNC2FUNC3FUNC4FUNC5FUNC6FUNC7FUNC8FUNC9
+3.3V
1
2
+5.0V
PJ-EINT23TWI11-SDATWI3-SDATWI7-SDAUART2-CTSUART3-RXPWM1-5PJ23
3
4
+5.0V
PJ-EINT22TWI11-SCKTWI3-SCKTWI7-SCKUART2-RTSUART3-TXPWM1-4PJ22
5
6
GND
PB-EINT0JTAG-MSSPI2-CS0UART0-TXUART2-TXPB0
7
8
PB9UART0-TXI2S0-DIN2I2S0-DOUBT2PWM1-1WATCHDOG-SIGTWI8-SCKTWI0-SCKPB-EINT9
GND
9
10
PB10UART0-RXI2S0-DIN3I2S0-DOUBT3PWM1-2PLL-LOCK-DBGTWI8-SDATWI0-SDAPB-EINT10
PB-EINT1JTAG-CKSPI2-CLKUART0-RXUART2-RXPB1
11
12
PK0MCSIA-D0NUART6-DCDI2S4-BCLKHDMI-CECTWI1-SDANCSI1-HSYNCSGPIO-SLOADPK-EINT0
PL-EINT6S-PWM0-4S-IR-RXS-SPI0-MOSIS-UART0-TXS-JTAG-DOPL6
13
14
GND
PL-EINT7S-PWM0-5S-SPI0-MISOS-UART0-RXS-JTAG-DIPL7
15
16
PJ24PWM1-6UART4-TXTWI4-SCKSPI3-CLKPJ-EINT24
+3.3V
17
18
PJ25PWM1-7UART4-RXTWI4-SDASPI3-MOSIPJ-EINT25
PD-EINT12PWM1-2SPI1-MOSIEINK-D12DSI1-D1PLVDS1-D1PPD12
19
20
GND
PD-EINT13PWM1-3SPI1-MISOEINK-D13DSI1-D1NLVDS1-D1NPD13
21
22
PL10S-UART0-TXS-TWI2-SCKS-UART1-TXS-PWM0-8PL-EINT10
PD-EINT11PWM1-1SPI1-CLKEINK-D11DSI1-D0NLVDS1-D0NPD11
23
24
PD10LVDS1-D0PDSI1-D0PEINK-D10SPI1-CS0PWM1-0PD-EINT10
GND
25
26
PD14LVDS1-D2PDSI1-CKPEINK-D14SPI1-HOLDUART3-RTSPD-EINT14
PD-EINT1UART3-RXTWI2-SDAEINK-LEHDSI1-D2NLVDS1-CKNPD17
27
28
PD16LVDS1-CKPDSI1-D2PEINK-OEHTWI2-SCKUART3-TXPD-EINT16
PK-EINT5JTAG-MAS-CKNCSI1-D14SPI3-CLKPWM1-9PWM1-8PCIE-CLKREQNMCSIA-CKPPK5
29
30
GND
PK-EINT6JTAG-MAS-DONCSI1-D13SPI3-MOSIUART2-RTSUART4-TXTWI2-SCKMCSIA-D2NPK6
31
32
PD20TWI0-SCKEINK-CKVPCIE-CLKREQNUART4-TXTWI3-SCKPWM0-2
PK-EINT7JTAG-MAS-DINCSI1-D12SPI3-MISOUART2-CTSUART4-RXTWI2-SDAMCSIA-D2PPK7
33
34
GND
PK-EINT2SGPIO-SDATAINNCSI1-PCLKTWI5-SDAHDMI-SDAI2S4-LRCKUART6-DTRMCSIA-D1NPK2
35
36
PK1MCSIA-D0PUART6-DSRI2S4-MCLKHDMI-SCLTWI1-SCKNCSI1-VSYNCSGPIO-SCLKPK-EINT1
PK-EINT8JTAG-MAS-NTRSTNCSI1-D11SPI3-CS1UART2-TXUART4-RTSMCSI0-MCLKMCSIA-D3NPK8
37
38
PK3MCSIA-D1PUART6-RII2S4-DIN0I2S4-DOUBT1TWI5-SCKNCSI1-MCLKSGPIO-SDATAOUTPK-EINT3
GND
39
40
PK4MCSIA-CKNPCIE-WAKENI2S4-DOUBT0I2S4-DIN1SPI3-CS0NCSI1-D15JTAG-MAS-MSPK-EINT4

GPIO 引脚号

控制指定引脚,你想需要根据以下公式来计算引脚号:

GPIO 芯片引脚号计算公式
GPIOCHIP0A ~ KNUM + 32 * (A ~ K)
GPIOCHIP1L ~NUM + 32 * (L ~ )

计算示例:

  • PB10

GPIOCHIP0 -> 10 + 32 * (A ~ K) -> 10 + 32 * 1 -> 42

  • PK4

GPIOCHIP1 -> 4 + 32 * (A ~ K) -> 4 + 32 * 10 -> 324

GPIO 使用

通过板载的 40-Pin GPIO 接口,演示常见的 GPIO 使用方法。

安装 python-periphery

使用 python-periphery 库来控制 GPIO 引脚。

radxa@cubie-a7a$
sudo pip3 install python-periphery

GPIO 读取

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来读取 PK4 引脚的高低电平。

gpio_input.py
from periphery import GPIO
import time

def read_gpio_input():
# Configure GPIO input (modify pin number according to actual hardware)
# Using pin 324 of /dev/gpiochip0 here (corresponds to PK4)
try:
# Initialize GPIO in input mode
gpio_in = GPIO("/dev/gpiochip0", 324, "in")

print("Starting GPIO input reading (press Ctrl+C to exit)")
while True:
# Read pin value
value = gpio_in.read()
print(f"GPIO input value: {value} (True=High, False=Low)")
time.sleep(1) # Read once per second

except KeyboardInterrupt:
print("\nProgram exited")
except Exception as e:
print(f"Error occurred: {e}")
finally:
# Ensure resources are released
try:
gpio_in.close()
except:
pass

if __name__ == "__main__":
read_gpio_input()

测试步骤

  1. 将 PK4 引脚接 GND 或 3.3V 引脚

  2. 将代码保存为 gpio_input.py

  3. 使用 python3 gpio_input.py 命令运行测试代码

实验现象

终端会输出 False 或 True 信息。

False 代表低电平,True 代表高电平。

GPIO 输出

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来控制 PK3 引脚输出高低电平,然后通过 PK4 引脚读取 PK3 引脚的高低电平。

gpio_output.py
from periphery import GPIO
import time

def gpio_output_with_feedback():
# GPIO Configuration (modify pin numbers based on your hardware)
# PK3 (output) → maps to pin 323 of /dev/gpiochip0
# PK4 (input) → maps to pin 324 of /dev/gpiochip0
OUTPUT_PIN_CHIP = "/dev/gpiochip0"
OUTPUT_PIN_NUMBER = 323 # PK3 (output pin, controlled by the script)
INPUT_PIN_NUMBER = 324 # PK4 (input pin, reads PK3's output state)

# Initialize GPIO objects as None first (for safe release later)
gpio_out = None
gpio_in = None

try:
# Initialize PK3 as OUTPUT mode
gpio_out = GPIO(OUTPUT_PIN_CHIP, OUTPUT_PIN_NUMBER, "out")
# Initialize PK4 as INPUT mode
gpio_in = GPIO(OUTPUT_PIN_CHIP, INPUT_PIN_NUMBER, "in")

# Print test initialization info
print("=== GPIO Output-Input Feedback Test Started ===")
print(f"Controlled Pin (PK3): {OUTPUT_PIN_CHIP} - Pin {OUTPUT_PIN_NUMBER} (OUTPUT)")
print(f"Monitoring Pin (PK4): {OUTPUT_PIN_CHIP} - Pin {INPUT_PIN_NUMBER} (INPUT)")
print("Test Behavior: PK3 toggles HIGH/LOW every 1s; PK4 verifies PK3's state")
print("Press Ctrl+C to stop the test\n")

# Main loop: Toggle PK3 and read PK4 feedback
while True:
# 1. Set PK3 to HIGH level
gpio_out.write(True)
time.sleep(0.1) # Short delay for signal stabilization (avoid read lag)
pk4_reading = gpio_in.read()
print(f"PK3 Output: HIGH (True) | PK4 Reading: {pk4_reading}")

# Keep PK3 HIGH for 1 second
time.sleep(1)

# 2. Set PK3 to LOW level
gpio_out.write(False)
time.sleep(0.1) # Short delay for signal stabilization
pk4_reading = gpio_in.read()
print(f"PK3 Output: LOW (False) | PK4 Reading: {pk4_reading}")

# Keep PK3 LOW for 1 second
time.sleep(1)

# Handle user-initiated exit (Ctrl+C)
except KeyboardInterrupt:
print("\n\nTest stopped by user (Ctrl+C)")
# Handle other unexpected errors (e.g., GPIO access failure)
except Exception as e:
print(f"\nError during test: {str(e)}")
# Ensure GPIO resources are released even if an error occurs
finally:
print("\nReleasing GPIO resources...")
# Safely close PK3 (set to LOW first to avoid residual high level)
if gpio_out:
try:
gpio_out.write(False)
gpio_out.close()
print(f"Successfully closed PK3 (Pin {OUTPUT_PIN_NUMBER})")
except Exception as close_err:
print(f"Failed to close PK3 (Pin {OUTPUT_PIN_NUMBER}): {str(close_err)}")
# Safely close PK4
if gpio_in:
try:
gpio_in.close()
print(f"Successfully closed PK4 (Pin {INPUT_PIN_NUMBER})")
except Exception as close_err:
print(f"Failed to close PK4 (Pin {INPUT_PIN_NUMBER}): {str(close_err)}")
print("Resource release complete.")

# Run the test when the script is executed directly
if __name__ == "__main__":
gpio_output_with_feedback()

测试步骤

  1. 将 PK3 引脚和 PK4 引脚进行短接

  2. 将代码保存为 gpio_output.py

  3. 使用 sudo python3 gpio_output.py 命令运行测试代码

实验现象

终端会输出 False 或 True 信息。

False 代表低电平,True 代表高电平。

PWM 输出

硬件准备

  • 主板
  • LED
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 PWM 输出。

pwm_output.py
from periphery import PWM
import time

def pwm_test():
try:
# Configure PWM parameters - modify according to your hardware
# Common PWM paths: /sys/class/pwm/pwmchip0/pwm0, etc.
PWM_CHIP = 10 # PWM chip number
PWM_CHANNEL = 2 # PWM channel number

# Initialize PWM
pwm = PWM(PWM_CHIP, PWM_CHANNEL)

print(f"PWM Test: Using PWM{PWM_CHIP}.{PWM_CHANNEL} (Pin: PD12)")

# Set PWM frequency to 1kHz
frequency = 1000 # 1000 Hz
pwm.frequency = frequency
print(f" Set frequency: {frequency} Hz")

# Enable PWM output
pwm.enable()
print(" PWM enabled")

# Test different duty cycles (0% to 100%)
duty_cycles = [0.0, 0.25, 0.5, 0.75, 1.0]

for duty in duty_cycles:
pwm.duty_cycle = duty
print(f" Set duty cycle: {duty*100:.1f}%")
time.sleep(1) # Maintain current duty cycle for 1 second

# Cleanup
pwm.disable()
pwm.close()
print(" PWM disabled and closed")
print("PWM Test completed successfully")

except Exception as e:
print(f"PWM Test failed: {e}")

if __name__ == "__main__":
print("Starting PWM Signal Test...\n")
pwm_test()

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable PWM1-2 选项,勾选后重启系统

  2. 将 LED 的正极连接到 PD12 引脚

  3. 将 LED 的负极连接到 GND 引脚

  4. 将代码保存为 pwm_output.py

  5. 使用 sudo python3 pwm_output.py 命令运行测试代码

实验现象

外接的 LED 会以不同的亮度闪烁,从亮到暗变化。

UART 使用

UART(通用异步收发传输器) 是一种广泛使用的串行通信协议,用于在嵌入式系统、计算机和外设之间进行异步串行数据传输。

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 UART4 回环通信。

uart_example.py
from periphery import Serial
import time

def uart_test():
try:
# Modify the serial device path according to your hardware, common paths include /dev/ttyS0, /dev/ttyS1, /dev/ttyUSB0, etc.
# PJ24(TX) PJ25(RX)
UART_DEVICE = "/dev/ttyAS4"
BAUDRATE = 115200

# Initialize serial port
serial = Serial(UART_DEVICE, BAUDRATE)

print(f"UART Test: Opening serial port {UART_DEVICE}, baud rate {BAUDRATE}")

# Send test data
test_message = "Hello, UART Test!\n"
serial.write(test_message.encode())
print(f" Sent data: {test_message.strip()}")

# Wait for data transmission
time.sleep(0.1)

# Try to read data (if loopback or other device responds)
if serial.input_waiting() > 0:
received_data = serial.read(serial.input_waiting())
print(f" Received data: {received_data.decode().strip()}")
else:
print(" No data received (normal unless loopback is connected)")

serial.close()
print("UART test completed")

except Exception as e:
print(f"UART test failed: {e}")

if __name__ == "__main__":
uart_test()

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable UART4 选项,勾选后重启系统

  2. 将 PJ24 引脚和 PJ25 引脚短接

  3. 将代码保存为 uart_example.py

  4. 使用 sudo python3 uart_example.py 命令运行测试代码

实验现象

终端会输出发送和接收的信息,可以根据终端输出的信息判断 UART 回环测试是否成功。

I2C 使用

I2C 是一种广泛使用的同步串行通信协议,由飞利浦(现恩智浦)开发,主要用于短距离芯片间通信。

硬件准备

  • 主板
  • I2C 设备(如 OLED 显示屏,其对应的 I2C 地址为 0x3C)
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 I2C 通信。

i2c_example.py
from periphery import I2C

def i2c_device_detection():
"""I2C Test - Check if device exists
Pin reference: PJ23 (SDA), PJ22 (SCL)
"""
# Modify according to your hardware connection
# Common I2C bus devices: /dev/i2c-0, etc.
I2C_BUS = "/dev/i2c-7"
TARGET_ADDR = 0x3C # Target address to check

i2c = None # Initialize I2C object reference
try:
# Initialize I2C object
i2c = I2C(I2C_BUS)

# Attempt a simple read/write operation to detect device
# Sending a single 0x00 byte as test communication
msgs = [I2C.Message([0x00])]
i2c.transfer(TARGET_ADDR, msgs)

print(f"I2C Test: Device found at address 0x{TARGET_ADDR:02X}")
return True

except Exception as e:
# Exception (e.g., IOError) usually indicates no device or no response
print(f"I2C Test: No device or no response at address 0x{TARGET_ADDR:02X}: {e}")
return False
finally:
# Ensure I2C resources are released
if i2c is not None:
try:
i2c.close()
except:
pass

if __name__ == "__main__":
print("Starting I2C Device Detection...")
i2c_device_detection()
print("I2C Test completed")

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable TWI7 选项,勾选后重启系统

  2. 将 OLED 显示屏的 SCL 引脚连接到 PJ22 引脚,SDA 引脚连接到 PJ23 引脚,VCC 连接到 5V,GND 连接到 GND

  3. 将代码保存为 i2c_example.py

  4. 使用 sudo python3 i2c_example.py 命令运行测试代码

实验现象

脚本功能是检查指定 I2C 总线上的特定地址是否存在可响应的 I2C 设备,可以判断 I2C 设备是否正常工作。

SPI 使用

SPI(串行外设接口)是一种高速、全双工、同步串行通信协议,由 Motorola(现为 NXP )开发,主要用于短距离芯片间通信,常见于传感器、存储器(如 Flash )、显示屏等设备与微控制器之间的数据传输。

硬件准备

  • 主板
  • 杜邦线

软件准备

测试代码

以下代码是使用 python-periphery 库来测试 SPI 回环通信。

spi_example.py
from periphery import SPI

def spi_communication_test():
# Data to be transmitted (4 bytes)
transmit_data = [0xAA, 0xBB, 0xCC, 0xDD]

try:
# Initialize SPI resource
# Parameters: SPI device path, mode 0, 1MHz clock frequency
spi = SPI("/dev/spidev3.0", 0, 1000000)

# Transmit data and receive response simultaneously
# SPI is full-duplex, so data is sent and received at the same time
received_data = spi.transfer(transmit_data)

# Print test results
print("SPI Test:")
print(" Transmitted data: [0x{:02x}, 0x{:02x}, 0x{:02x}, 0x{:02x}]".format(*transmit_data))
print(" Received data: [0x{:02x}, 0x{:02x}, 0x{:02x}, 0x{:02x}]".format(*received_data))

except Exception as e:
print(f"SPI Test failed: {e}")
finally:
# Ensure SPI resource is released
try:
spi.close()
except:
pass

if __name__ == "__main__":
print("Starting SPI Communication Test...\n")
spi_communication_test()
print("\nSPI Test completed")

测试步骤

  1. 进入 rsetupOverlay -> Manage overlays 勾选 Enable spidev on SPI3 选项,勾选后重启系统

  2. 将 PK6 引脚和 PK7 引脚连接

  3. 将代码保存为 spi_example.py

  4. 使用 sudo python3 spi_example.py 命令运行测试代码

实验现象

终端会输出发送和接收的信息,可以根据发送和接收的数据是否一致判断 SPI 回环测试是否成功。

    您需要登录 GitHub 才能发表评论。如果您已登录,请忽略此消息。

    Radxa-docs © 2026 by Radxa Computer (Shenzhen) Co.,Ltd. is licensed under CC BY 4.0