40-PIN 功能测试
CANBUS
CANBUS 简介
控制器区域网络(CAN总线)是一种车辆总线标准,旨在允许微控制器和设备相互通信。 它是一种基于消息的协议,最初设计用于汽车内部的多路电气布线,以节省铜,但它也可以用于许多其他环境。 对于每个设备,帧中的数据是串行传输的,但如果多个设备同时传输,则最高优先级设备可以继续传输,而其他设备则后退。 帧被所有设备接收,包括发送设备。
准备
- 两块带有 CANBUS 的 Radxa 开发板
- 两个 CANBUS 模块
开启 Overlay
请参照设备树配置 启用 CANBUS 相关 Overlay, eg: "Enable CAN1-M0"。
连接
主设备 CAN 模块 CAN 模块 主设备
3.3V <--> VCC VCC <--> VCC
GND <--> GND GND <--> GND
CAN_TX <--> CTX CTX <--> CAN_TX
CAN_RX <--> CRX CRX <--> CAN_RX
CANH <--> CANH
CANL <--> CANL
安装测试工具
sudo apt update
sudo apt-get install can-utils iproute2
检查 CAN 节点
$ ip a
can0: flags=193<UP,RUNNING,NOARP> mtu 72
unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueuelen 10 (UNSPEC)
RX packets 144 bytes 1152 (1.1 KiB)
RX errors 175 dropped 0 overruns 0 frame 35
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 62
回还测试
一块板子作为发送端,另一块则作为接收端
- 发送端
$ sudo ip link set can0 down
$ sudo ip link set can0 type can bitrate 1000000 dbitrate 1000000 loopback on fd on
$ sudo ip link set can0 up
$ sudo cansend can0 123#11223344
- 接收端
$ sudo ip link set can0 down
$ sudo ip link set can0 type can bitrate 1000000 dbitrate 1000000 loopback on fd on
$ sudo ip link set can0 up
$ sudo candump can0
can0 123 [4] 11 22 33 44
开发参考
GPIO
GPIO 简介
通用输入/输出(GPIO)是集成电路或电子电路(如 MCU/MPU)电路板上的非专用数字信号引脚,可用作输入或输出,或同时用作输入和输出,并可由软件控制。
准备
- 一块 Radxa ROCK 5B+
- 一个 LED 灯
连接
如图所示,连接 Radxa ROCK 5B+ 的 PIN_27
测试
输入测试
将 27 接地或者接 3.3V,
radxa@rock-5b-plus:~$ gpioget gpiochip4 22
如果接的是地,该命令输出 0,如果接的是 3.3V,该命令输出 1。
输出测试
radxa@rock-5b-plus:~$ sudo gpioset -m signal $(sudo gpiofind PIN_27)=0 # 输出低电平, Led 灭 radxa@rock-5b-plus:~$ sudo gpioset -m signal $(sudo gpiofind PIN_27)=1 # 输出高电平, Led 亮
I2C
I2C 简介
I2C(Inter-Integrated Circuit;发音为 "eye-squared-see "或 "eye-two-see"),又称 I2C 或 IIC,是飞利浦半导体公司于 1982 年发明的一种同步、多控制器/多目标(历史上称为主/从)、单端、串行通信总线。
准备
- 一块 Radxa ROCK 5B+
- 一个 OLED
开启 Overlay
请参照设备树配置启用 I2C 相关 Overlay, eg: "Enable I2C8-M2"。
连接
按照以下方式连接 Radxa ROCK 5B+ 和 OLED
Radxa ROCK 5B+ | <--> | OLED |
---|---|---|
PIN_5 | <--> | SCL |
PIN_3 | <--> | SDA |
PIN_1 | <--> | VCC |
PIN_9 | <--> | GND |
测试
-
打开终端,在终端中输入以下命令安装 python3-periphery 的 Python 库
-
新建一个名为 Oled.py Python 文件,并将以下代码粘贴到该文件中:
Oled.py
from periphery import I2C
import time
I2C_ADDR = 0x3c
I2C_BUS = "/dev/i2c-8"
i2c = I2C(I2C_BUS)
# SSD1306 init_cmds
init_cmds = [
0xAE, # Display off
0x00, # Set lower column address
0x10, # Set higher column address
0x40, # Set display start line
0xB0, # Set page address
0x81, # Set contrast control
0xCF,
0xA1, # Set segment remap
0xA6, # Normal display
0xA8, # Set multiplex ratio
0x3F,
0xC8, # Set COM output scan direction
0xD3, # Set display offset
0x00,
0xD5, # Set display clock divide ratio/oscillator frequency
0x80,
0xD9, # Set pre-charge period
0xF1,
0xDA, # Set COM pins hardware configuration
0x12,
0xDB, # Set VCOMH deselect level
0x40,
0x8D, # Enable charge pump regulator
0x14,
0xAF # Display on
]
for cmd in init_cmds:
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, cmd])])
def oled_clear():
for page in range(8):
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0xB0 + page])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x00])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x10])])
for _ in range(128):
i2c.transfer(I2C_ADDR, [I2C.Message([0x40, 0x00])])
char_map = {
"H": [0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,],
"R": [0x00, 0x7F, 0x09, 0x19, 0x29, 0x46],
"e": [0x00, 0x38, 0x54, 0x54, 0x54, 0x18],
"l": [0x00, 0x00, 0x41, 0x7F, 0x40, 0x00],
"o": [0x00, 0x38, 0x44, 0x44, 0x44, 0x38],
"r": [0x00, 0x7C, 0x08, 0x04, 0x04, 0x08],
"a": [0x00, 0x20, 0x54, 0x54, 0x54, 0x78],
"d": [0x00, 0x38, 0x44, 0x44, 0x48, 0x7F],
"x": [0x00, 0x44, 0x28, 0x10, 0x28, 0x44]
}
def string_to_bytes(string):
bytes_list = []
for char in string:
bytes_list.extend(char_map.get(char, [0x00] * 4))
bytes_list.append(0x00)
return bytes_list
oled_clear()
hello_world_bytes = string_to_bytes("Hello Radxa")
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0xB0])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x00])])
i2c.transfer(I2C_ADDR, [I2C.Message([0x00, 0x10])])
for byte in hello_world_bytes:
i2c.transfer(I2C_ADDR, [I2C.Message([0x40, byte])])
i2c.close()
该脚本仅为示例,需要根据实际修改变量 I2C_BUS
- 在终端中,执行以下命令进行测试
sudo python3 Oled.py
执行完以上命令后,Oled 会显示 "Hello, Radxa" 的字符
PWM
PWM 简介
脉宽调制(PWM)是一种调制技术,可产生可变宽度的脉冲来表示模拟输入信号的幅度。 对于高振幅信号,输出开关晶体管更多时间处于导通状态,而对于低振幅信号,输出开关晶体管更多时间处于关断状态。