【黑金云课堂】FPGA技术教程Linux开发:串行通信接口与实时时钟模块

Linux 应用第 16-19 节 串行通信接口与实时时钟模块 ,选自ALINX 黑金云课堂 FPGA 免费直播课。该课程由 ALINX 资深工程师团队倾力打造,从 0 到 1 系统化教学,帮助每位工程师跨过 FPGA 开发门槛。

🔍 ALINX :关注 ALINX,进入视频号即可查看完整黑金云课堂 FPGA 视频教程。配合笔记学习效果更佳。

Uart 通信

  1. UART 基础:UART 是异步串行通信协议,常用 8N1 格式(8 位数据位、无校验、1 位停止位)。Zynq UltraScale+ 提供 2 个 UART 控制器,对应设备节点 /dev/ttyPS0和/dev/ttyPS1。ttyPS0 通常作为调试串口使用。

  2. 命令行控制 :使用stty命令配置串口参数(波特率、数据位等)。数据收发可直接通过echocat操作设备节点。minicom 提供交互式串口调试界面。

  3. C 语言编程 :通过termios结构体和tcsetattr()配置串口。主要步骤:打开设备→配置波特率和数据格式→使用 read/write 收发数据。Demo 程序提供发送、接收、回环测试三种模式。

  4. 实践要点:硬件连接时 TX 和 RX 需交叉连接,必须共地。最常见问题是波特率不匹配导致的乱码。回环测试需要短接 MOSI 和 MISO 引脚,用于验证硬件是否正常。

SPI 通信

  1. SPI 基础:SPI 是同步全双工串行通信协议,使用 4 根信号线(MOSI、MISO、SCLK、CS)。定义 4 种时钟模式(Mode 0-3),由 CPOL 和 CPHA 组合决定。Mode 0 最常用。

  2. QSPI Flash :Zynq 使用 QSPI Flash 作为启动存储器,存储 FSBL、U-Boot 和内核。Linux 中作为 MTD 设备访问,使用flash_erase擦除、dd命令读写。

  3. C 语言编程 :Linux 提供spidev用户空间驱动,通过/dev/spidevX.Y访问。使用ioctl(fd, SPI_IOC_MESSAGE, &xfer)进行数据传输。Demo 程序实现 Flash ID 读取、传输测试、回环测试功能。

  4. 实践要点:SPI 模式必须匹配从设备要求。回环测试将 MOSI 和MISO 短接验证硬件。Zynq 内置 SPI 控制器最高支持 50MHz 时钟频率。

I2C 通信

  1. I2C基础:I2C 是两线制串行总线(SDA、SCL),支持多主多从架构。使用7位地址识别设备。开漏输出需要外接上拉电阻(通常4.7KΩ)。

  2. i2c-tools 工具集i2cdetect扫描总线设备,i2cget/i2cset读写寄存器,i2cdump批量dump寄存器。是 I2C 调试的必备工具。

  3. C 语言编程 :通过/dev/i2c-X设备节点访问。使用ioctl(fd, I2C_SLAVE, addr)设置从机地址。读写 EEPROM 需要先写内存地址再读写数据,写入后需等待 5ms。

  4. 实践要点:缺少上拉电阻是最常见问题。EEPROM 写入后必须延时等待。地址冲突时可通过设备引脚修改地址。

RTC 实时时钟

  1. RTC 基础:RTC 是掉电保持运行的独立时钟电路,由纽扣电池供电。提供年/月/日/时/分/秒时间信息和闹钟功能。Zynq 内置 RTC 控制器,也可外接 I2C RTC 芯片。

  2. 命令行控制hwclock是主要操作工具(-r 读取、-w 写入系统时间、-s 同步到系统)。timedatectl提供更友好的状态查看。通过 sysfs 设置闹钟唤醒系统。

  3. C 语言编程 :使用rtc_time结构体表示时间(注意 tm_mon 范围0-11,tm_year 从1900起算)。常用 ioctl 命令:RTC_RD_TIME、RTC_SET_TIME、RTC_ALM_SET、RTC_AIE_ON。

  4. 实践要点:电池没电会导致时间丢失,需定期更换 CR2032 电池。有网络时推荐使用 NTP 校时,无网络时依赖 RTC 保持时间。

💡 完整视频讲解可前往 ALINX 视频号进行直播回看

更多细节欢迎关注我们黑金云课堂全年免费直播课
黑金云课堂五月直播日历 我们将在每周二、三、四,同步推进 Verilog开发、Vitis开发、Linux开发三大系列,带你从零开始,稳扎稳打掌握 FPGA 开发全流程!

系列 内容定位
Verilog开发 硬件描述语言基础、逻辑设计、仿真调试
Vitis开发 Zynq软硬件协同、外设驱动、网络协议栈
Linux开发 嵌入式Linux系统移植、驱动编写、应用开发
相关推荐
戴为沐1 天前
Linux内存扩容指南
linux
zylyehuo1 天前
Linux 彻底且安全地删除文件
linux
用户805533698032 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
用户034095297912 天前
linux fcitx 5 雾凇拼音 设置在中文输入法下仍然输入英文标点
linux
Web3探索者4 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo4 天前
Linux系统中网线与USB网络共享冲突
linux
Sokach10155 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao6 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3107 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode7 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏