当前位置: 首页 > article >正文

手把手教你用RK3576开发板驱动RC522读卡器:一个SPI实战项目的完整配置流程

手把手教你用RK3576开发板驱动RC522读卡器一个SPI实战项目的完整配置流程在嵌入式开发领域能够独立完成一个从硬件连接到软件驱动的完整项目是每个开发者成长的必经之路。RK3576作为一款性能强劲的开发板搭配常见的RC522读卡器模块可以构建门禁系统、物联网设备等实用场景。本文将带你一步步实现这个SPI通信项目避开那些新手常踩的坑。1. 硬件准备与连接拿到RK3576开发板和RC522模块后第一步就是正确连接硬件。很多人以为接线简单就掉以轻心结果后面调试时才发现问题出在最基础的物理连接上。RC522模块通常有8个引脚关键的是这4个SPI接口SDA(SS) - 片选信号SCK - 时钟线MOSI - 主设备输出从设备输入MISO - 主设备输入从设备输出RK3576开发板SPI接口对应引脚RC522引脚RK3576引脚功能说明SDAGPIO1_C6片选(CS)SCKGPIO1_C1时钟(SCLK)MOSIGPIO1_C3主出从入MISOGPIO1_C4主入从出GNDGND地线RSTGPIO1_C5复位引脚(可选)IRQ不连接中断引脚(未使用)3.3V3.3V电源特别注意RC522是3.3V设备绝对不能接5V电源否则会烧毁模块。我曾因此损失过两个模块才记住这个教训。连接时建议使用杜邦线先进行测试确认功能正常后再考虑焊接。常见错误包括MOSI和MISO接反忘记连接GND片选信号接错GPIO2. 开发环境配置RK3576的开发环境搭建有几个关键步骤缺一不可。首先确保你的主机是Ubuntu 20.04或更高版本这是官方推荐的环境。工具链安装清单sudo apt update sudo apt install gcc-arm-linux-gnueabihf build-essential git接着配置交叉编译工具export ARCHarm export CROSS_COMPILEarm-linux-gnueabihf-验证工具链是否正常工作arm-linux-gnueabihf-gcc --version如果看到类似下面的输出说明工具链配置正确arm-linux-gnueabihf-gcc (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.03. Linux内核SPI驱动配置RK3576的Linux内核默认可能没有启用SPI驱动需要重新配置内核。这个过程比较关键很多开发者在这里遇到问题。首先获取内核配置文件make rk3576_defconfig然后进入内核配置菜单make menuconfig在菜单中找到并启用以下选项Device Drivers --- [*] SPI support --- * Rockchip SPI controller driver [*] User mode SPI device driver support保存配置后编译内核make -j$(nproc)编译完成后你会看到新的内核镜像文件。将其烧写到开发板后应该能在/dev目录下看到spidev设备节点ls /dev/spidev*正常情况会显示类似/dev/spidev0.0 /dev/spidev0.14. RC522驱动开发与测试现在进入最核心的部分——编写RC522的驱动代码。我们将从底层SPI通信开始逐步实现卡片识别功能。4.1 SPI通信基础函数首先创建spi_rfid.c文件实现基本的SPI初始化函数#include linux/spi/spidev.h #include fcntl.h #include unistd.h int spi_init(const char *device, uint32_t mode, uint8_t bits, uint32_t speed) { int fd open(device, O_RDWR); if (fd 0) { perror(无法打开SPI设备); return -1; } // 设置SPI模式 if (ioctl(fd, SPI_IOC_WR_MODE, mode) 0) { perror(无法设置SPI模式); close(fd); return -1; } // 设置数据位宽 if (ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, bits) 0) { perror(无法设置位宽); close(fd); return -1; } // 设置通信速率 if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, speed) 0) { perror(无法设置SPI速率); close(fd); return -1; } return fd; }4.2 RC522寄存器操作RC522通过寄存器进行控制我们需要实现读写寄存器的函数#define RC522_CMD_READ 0x80 #define RC522_CMD_WRITE 0x00 uint8_t rc522_read_reg(int fd, uint8_t addr) { uint8_t tx[2] {addr | RC522_CMD_READ, 0}; uint8_t rx[2] {0}; struct spi_ioc_transfer tr { .tx_buf (unsigned long)tx, .rx_buf (unsigned long)rx, .len 2, .delay_usecs 0, .speed_hz 1000000, .bits_per_word 8, }; if (ioctl(fd, SPI_IOC_MESSAGE(1), tr) 0) { perror(SPI传输失败); return 0xFF; } return rx[1]; } void rc522_write_reg(int fd, uint8_t addr, uint8_t val) { uint8_t tx[2] {addr | RC522_CMD_WRITE, val}; uint8_t rx[2] {0}; struct spi_ioc_transfer tr { .tx_buf (unsigned long)tx, .rx_buf (unsigned long)rx, .len 2, .delay_usecs 0, .speed_hz 1000000, .bits_per_word 8, }; if (ioctl(fd, SPI_IOC_MESSAGE(1), tr) 0) { perror(SPI传输失败); } }4.3 卡片检测与ID读取实现卡片检测的核心逻辑#define PCD_IDLE 0x00 #define PCD_AUTHENT 0x0E #define PCD_TRANSCEIVE 0x0C int rc522_request(int fd, uint8_t req_mode, uint8_t *tag_type) { uint8_t status; uint32_t back_bits; rc522_write_reg(fd, RC522_REG_COMM_IE_N, 0x07); rc522_write_reg(fd, RC522_REG_COMM_IRQ, 0x80); rc522_write_reg(fd, RC522_REG_BIT_FRAMING, 0x07); rc522_write_reg(fd, RC522_REG_COMMAND, PCD_IDLE); uint8_t command PCD_TRANSCEIVE; uint8_t wait_irq 0x30; rc522_write_reg(fd, RC522_REG_COMMAND, command); // 等待中断或超时 uint16_t i 2000; while (1) { uint8_t n rc522_read_reg(fd, RC522_REG_COMM_IRQ); if (n wait_irq) { break; } if (--i 0) { return -1; } } status rc522_read_reg(fd, RC522_REG_ERROR); if (status 0x1B) { return -1; } if (rc522_read_reg(fd, RC522_REG_CONTROL) 0x08) { back_bits 4; } else { back_bits rc522_read_reg(fd, RC522_REG_RX_BITS); } if (back_bits ! 0x10) { return -1; } *tag_type rc522_read_reg(fd, RC522_REG_FIFO_DATA); return 0; }4.4 主程序实现最后我们把这些功能整合到一个主程序中int main(int argc, char *argv[]) { int spi_fd spi_init(/dev/spidev0.0, SPI_MODE_0, 8, 1000000); if (spi_fd 0) { fprintf(stderr, SPI初始化失败\n); return 1; } // 初始化RC522 rc522_init(spi_fd); printf(等待卡片靠近...\n); while (1) { uint8_t card_type; if (rc522_request(spi_fd, PICC_REQIDL, card_type) 0) { uint8_t serial[5]; if (rc522_anticoll(spi_fd, serial) 0) { printf(检测到卡片ID: %02X%02X%02X%02X\n, serial[0], serial[1], serial[2], serial[3]); // 让卡片进入休眠状态 rc522_halt(spi_fd); sleep(1); } } usleep(100000); // 100ms延迟 } close(spi_fd); return 0; }5. 常见问题与调试技巧在实际项目中你可能会遇到各种奇怪的问题。以下是几个我踩过的坑和解决方案问题1SPI通信无响应检查硬件连接特别是MOSI/MISO是否接反用示波器或逻辑分析仪检查SCLK信号确认SPI模式设置正确RC522通常使用Mode0问题2能检测卡片但无法读取ID检查天线是否正常工作尝试调整RC522的天线增益寄存器确保卡片类型支持RC522主要支持MIFARE Classic问题3读取不稳定在电源引脚添加100nF电容缩短SPI线缆长度降低SPI通信速率尝试调试建议在关键函数中添加调试打印逐步缩小问题范围。比如先确认SPI寄存器读写正常再测试卡片检测功能。6. 项目扩展与优化基础功能实现后可以考虑以下扩展方向性能优化使用中断代替轮询检测卡片实现多卡片同时检测添加卡片数据读写功能功能扩展集成到门禁系统与云平台对接实现远程管理添加LCD显示当前状态代码结构优化将驱动拆分为内核模块添加sysfs接口方便用户空间配置实现设备树支持// 示例使用poll实现中断检测 struct pollfd fds { .fd gpio_fd, .events POLLPRI, }; while (1) { int ret poll(fds, 1, -1); if (ret 0) { if (fds.revents POLLPRI) { // 处理卡片中断 handle_card_detected(); } } }这个项目虽然看似简单但涵盖了嵌入式开发的完整流程从硬件连接到驱动开发再到应用层实现。掌握这些技能后你可以轻松应对各种SPI设备开发需求。

相关文章:

手把手教你用RK3576开发板驱动RC522读卡器:一个SPI实战项目的完整配置流程

手把手教你用RK3576开发板驱动RC522读卡器:一个SPI实战项目的完整配置流程 在嵌入式开发领域,能够独立完成一个从硬件连接到软件驱动的完整项目,是每个开发者成长的必经之路。RK3576作为一款性能强劲的开发板,搭配常见的RC522读卡…...

终极指南:Laravel DataTables 性能优化实战——不同场景下的表现对比

终极指南:Laravel DataTables 性能优化实战——不同场景下的表现对比 【免费下载链接】laravel-datatables jQuery DataTables API for Laravel 4|5|6|7|8|9|10 项目地址: https://gitcode.com/gh_mirrors/la/laravel-datatables Laravel DataTables 是一款强…...

如何编写全面的golang-lru单元测试:覆盖所有边界条件的完整指南

如何编写全面的golang-lru单元测试:覆盖所有边界条件的完整指南 【免费下载链接】golang-lru Golang LRU cache 项目地址: https://gitcode.com/gh_mirrors/go/golang-lru 在Go语言开发中,缓存是提升性能的关键组件,而golang-lru作为一…...

不止是缓存:深入Quartus FIFO IP核,玩转Show-ahead与Normal模式下的数据吞吐率优化

深入解析Quartus FIFO IP核:Show-ahead与Normal模式下的性能优化实战 在FPGA开发中,数据流处理系统的性能瓶颈往往出现在数据缓冲环节。作为Intel Quartus Prime工具链中的关键IP核,FIFO(First In First Out)缓冲器的…...

高光谱分类别只盯着精度?聊聊Salinas数据集实战中的那些‘隐形’优化点

高光谱分类实战:超越精度的Salinas数据集深度优化指南 当我们在Salinas数据集上实现98%的分类准确率时,是否意味着模型已经完美?作为深耕遥感领域多年的技术顾问,我必须指出:高光谱图像分类的工程实践远比表面指标复杂…...

Phi-4-mini-reasoning快速上手:3步完成vLLM服务部署+Chainlit前端验证

Phi-4-mini-reasoning快速上手:3步完成vLLM服务部署Chainlit前端验证 1. 模型简介 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员,它经过专门微调以提升数…...

Nunchaku-FLUX.1-dev开源大模型部署案例:电商素材批量生成零API成本

Nunchaku-FLUX.1-dev开源大模型部署案例:电商素材批量生成零API成本 1. 引言 如果你正在经营一家电商店铺,或者从事内容创作、设计工作,那么对图片素材的需求一定不小。从商品主图、详情页配图,到社交媒体海报、广告素材&#x…...

OpCore-Simplify:黑苹果配置的自动化革命——从复杂调试到一键配置的智能解决方案

OpCore-Simplify:黑苹果配置的自动化革命——从复杂调试到一键配置的智能解决方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 传统黑苹…...

Transformer位置编码避坑指南:手把手教你用RoPE解决长文本外推难题(附Torch复现)

Transformer长文本处理实战:RoPE位置编码的工程化解决方案 在构建现代NLP系统时,处理长文本序列一直是Transformer架构面临的重大挑战。当序列长度超过模型预训练时的最大位置编码范围时,传统方法的性能会显著下降。这种现象在构建聊天机器人…...

AO3镜像站使用指南:5分钟轻松访问全球同人创作宝库

AO3镜像站使用指南:5分钟轻松访问全球同人创作宝库 【免费下载链接】AO3-Mirror-Site 项目地址: https://gitcode.com/gh_mirrors/ao/AO3-Mirror-Site 还在为无法访问Archive of Our Own(AO3)而烦恼吗?AO3镜像站项目为你提…...

Android 11文件权限避坑指南:为什么你的APP无法修改原文件?

Android 11存储权限深度解析:从沙盒机制到实战解决方案 在去年的一次应用升级中,我们团队遇到了一个棘手的问题:用户反馈图片编辑后无法保存到原位置。经过排查,发现这是Android 11引入的存储权限机制变化导致的。作为开发者&…...

Neo.mjs性能优化:如何实现每秒40,000+增量更新的秘密

Neo.mjs性能优化:如何实现每秒40,000增量更新的秘密 【免费下载链接】neo The application worker driven frontend framework 项目地址: https://gitcode.com/gh_mirrors/neo/neo Neo.mjs作为一款由应用工作器驱动的前端框架,以其卓越的性能表现…...

B站视频字幕抓取实战:Tampermonkey搭配GreasyFork脚本,5分钟搞定CC字幕导出

B站视频字幕高效提取指南:Tampermonkey与GreasyFork脚本深度应用 每次观看B站优质内容时,那些精心制作的字幕是否让你想保存下来反复学习?传统录屏或手动抄写效率低下,而专业工具又过于复杂。本文将带你探索浏览器脚本的魔法世界&…...

错误处理与HTTP状态码:Zalando RESTful API Guidelines 的异常管理机制

错误处理与HTTP状态码:Zalando RESTful API Guidelines 的异常管理机制 【免费下载链接】restful-api-guidelines A model set of guidelines for RESTful APIs and Events, created by Zalando 项目地址: https://gitcode.com/gh_mirrors/re/restful-api-guideli…...

资源获取的技术突围:res-downloader的跨平台解决方案

资源获取的技术突围:res-downloader的跨平台解决方案 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数字内容爆…...

数据库优化:高效查询GUID的技巧

在日常的数据库操作中,如何高效地查询数据是一个永恒的话题。特别是当我们处理大型数据集和需要在文本字段中查找特定模式(如GUID)时,查询效率显得尤为关键。今天,我将分享一种优化查询GUID的方法,帮助你从长达数小时的查询时间中解脱出来。 背景 假设我们有一个数据库…...

RMBG-1.4开源模型解析:AI净界如何实现SOTA级Alpha通道生成

RMBG-1.4开源模型解析:AI净界如何实现SOTA级Alpha通道生成 你有没有遇到过这样的烦恼?想给产品换个背景,结果抠出来的图边缘全是锯齿;想给自己做一张透明背景的证件照,头发丝却和背景糊在一起;或者想用AI生…...

解放你的创造力:用TEdit打造泰拉瑞亚专属世界地图

解放你的创造力:用TEdit打造泰拉瑞亚专属世界地图 【免费下载链接】Terraria-Map-Editor TEdit - Terraria Map Editor - TEdit is a stand alone, open source map editor for Terraria. It lets you edit maps just like (almost) paint! It also lets you change…...

3D Face HRN效果验证:使用MeshLab量化评估3D重建PSNR与SSIM指标

3D Face HRN效果验证:使用MeshLab量化评估3D重建PSNR与SSIM指标 1. 项目背景与验证意义 3D人脸重建技术近年来取得了显著进展,但如何客观评估重建质量一直是个关键问题。传统的主观视觉评估方法存在明显局限性——不同观察者可能有不同的判断标准&…...

GEE快速入门:哨兵2号影像批量下载与去云处理指南

1. 为什么选择GEE处理哨兵2号影像? 如果你正在寻找一个免费、高效且无需本地高性能计算机的遥感数据处理方案,Google Earth Engine(GEE)绝对是你的首选。作为一个云端地理空间分析平台,GEE存储了海量的卫星影像数据&am…...

Nunchaku FLUX.1-dev实战:手把手教你用ComfyUI生成惊艳AI图片

Nunchaku FLUX.1-dev实战:手把手教你用ComfyUI生成惊艳AI图片 1. 环境准备与快速部署 1.1 硬件与软件要求 在开始之前,请确保你的系统满足以下基本要求: 显卡:NVIDIA显卡(推荐RTX 30/40系列,显存8GB&am…...

【无人机控制】基于matlab人工势场法的四旋翼无人机轨迹规划几何控制器【含Matlab源码 15252期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

如何在单台电脑上实现4人同屏游戏?Nucleus Co-Op开源项目详解

如何在单台电脑上实现4人同屏游戏?Nucleus Co-Op开源项目详解 【免费下载链接】nucleuscoop Starts multiple instances of a game for split-screen multiplayer gaming! 项目地址: https://gitcode.com/gh_mirrors/nu/nucleuscoop 你是否曾想过&#xff0c…...

pyenv多版本Python管理实战:从安装到日常开发常用命令大全

pyenv多版本Python管理实战:从安装到日常开发常用命令大全 作为Python开发者,你是否经常遇到这样的困扰:项目A需要Python 3.6,项目B需要Python 3.9,而本地环境只能安装一个版本?或者团队协作时,…...

当AI走进柴米油盐:我们的生活正在发生怎样的改变?

当清晨的AI闹钟根据你的睡眠周期轻声唤醒,通勤导航提前规避了突发拥堵的路段,办公软件里的AI一键生成了会议纪要与数据报表,回家路上智能家电已提前调好室温与灯光,睡前AI陪练帮孩子巩固了当天的知识点,也为独居的父母…...

Qwen3.5-4B模型Matlab数据分析加速:模型调用与结果可视化

Qwen3.5-4B模型Matlab数据分析加速:模型调用与结果可视化 1. 引言:当科研遇上大模型 科研工作中最耗时的环节往往不是实验本身,而是数据处理和报告撰写。想象一下这样的场景:你刚完成一组复杂的实验,面对几十页的仪器…...

如何突破B站视频获取限制?这款开源工具让你轻松搞定

如何突破B站视频获取限制?这款开源工具让你轻松搞定 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 你是否遇到过想要保存B站精彩视频却无从下手的困境?是否因复杂的技术门槛而…...

蓝桥杯备赛:Floyd、Bellman-Ford、Dijkstra,三大最短路算法到底怎么选?(附场景对比与代码模板)

蓝桥杯竞赛:Floyd、Bellman-Ford、Dijkstra三大最短路算法实战指南 在算法竞赛的战场上,最短路问题就像是一道必考题,而Floyd、Bellman-Ford和Dijkstra这三大算法则是解题的利器。但很多选手在面对具体问题时常常陷入选择困难:该用…...

React Native Chart Kit 性能优化技巧:大数据量下的流畅图表渲染

React Native Chart Kit 性能优化技巧:大数据量下的流畅图表渲染 【免费下载链接】react-native-chart-kit 📊React Native Chart Kit: Line Chart, Bezier Line Chart, Progress Ring, Bar chart, Pie chart, Contribution graph (heatmap) 项目地址:…...

「码动四季·开源同行」go实战案例:如何在 Go 微服务中实现负载均衡?

在上文章中,我们已经介绍了负载均衡的相关概念以及在服务高可用架构中的重要性,也了解了几种主流负载均衡算法的实现。在本文中,我们将在Go微服务实例中具体使用负载均衡技术,并详细说明如何基于服务发现来实现负载均衡的微服务间…...