本文主要讲述了基于SPI总线的RC522驱动程序的设计。描述了主控如何与从设备通过SPI总线进行数据的读写。

一 在SPI驱动中,有两个重要的结构:spi_device&spi_driver。

1  spi_device的构建与注册:

Spi_device板信息用spi_board_info结构体来描述,它描述了SPI外设(RC522模块)使用的主机控制器序号,片选信号,数据比特率,传输方式等。故要先填充struct spi_board_info这个结构体。--4412平台在mach-smdk4x12.c里,三星给的BSP包里面已经配置好了这些,我们要做的只是打开CONFIG_S3C64XX_DEV_SPI这个宏。

spi_register_board_info(spi2_board_info, ARRAY_SIZE(spi2_board_info));

具体实现见下面代码。

  1. static struct spi_board_info spi2_board_info[] __initdata = {
  2. {
  3. .modalias = "rfid_rc522",
  4. .platform_data = NULL,
  5. .max_speed_hz = 10*1000*1000,
  6. .bus_num = 2,
  7. .chip_select = 0,
  8. .mode = SPI_MODE_0,
  9. .controller_data = &spi2_csi[0],
  10. }
  11. };
  12. static struct s3c64xx_spi_csinfo spi2_csi[] = {
  13. [0] = {
  14. .line = EXYNOS4_GPC1(2),
  15. .set_level = gpio_set_value,
  16. .fb_delay = 0x2,
  17. },
  18. }

2  spi_driver的构建与注册:

  1. spi_register_driver(&rc522_driver);
  2. static struct spi_driver rc522_driver = {
  3. .probe = rc522_probe,
  4. .remove = rc522_remove,
  5. .driver = {
  6. .name = "rfid_rc522",
  7. },
  8. };
  9. static int rc522_probe(struct spi_device *spi)
  10. {
  11. //默认读第一块(可选0 ~ 63)
  12. KuaiN = 1;
  13. printk("%s\n", __func__);
  14. rc522_spi = spi;
  15. return 0;
  16. };

二 注册好了SPI设备与驱动,就可以通过SPI总线实现数据读写了。

这里注册了一个混合设备:misc_register(&rc522_misc_device);

  1. static struct miscdevice rc522_misc_device = {
  2. .minor = MISC_DYNAMIC_MINOR,
  3. .name = "rfid_rc522_dev",
  4. .fops = &rc522_fops,
  5. };
  6. static struct file_operations rc522_fops = {
  7. .owner = THIS_MODULE,
  8. .open = rc522_open,
  9. .release = rc522_release,
  10. .read = rc522_read,
  11. .write = rc522_write,
  12. .poll = rc522_poll,
  13. .unlocked_ioctl = rc522_ioctl,
  14. };
  15. //省略号这里省略了fops里各个操作的具体函数。
  16. ……

在read, write操作里都会调用到WriteRawRC(unsigned char Address, unsigned char value)函数,在这个函数里才真正实现了通过SPI来对RC522寄存器的读写操作:

  1. //////////////////////////////////////////////////////////////////
  2. //功 能:写RC522寄存器
  3. //参数说明:Address[IN]:寄存器地址
  4. // value[IN]:写入的值
  5. /////////////////////////////////////////////////////////////////////
  6. void WriteRawRC(unsigned char Address, unsigned char value)
  7. {
  8. unsigned char ucAddr;
  9. struct spi_transfer st[2];
  10. struct spi_message msg;
  11. CLR_SPI_CS;
  12. ucAddr = ((Address<<1)&0x7E);
  13. spi_message_init( &msg );
  14. memset( st, 0, sizeof(st) );
  15. st[ 0 ].tx_buf = &ucAddr;
  16. st[ 0 ].len = 1;
  17. spi_message_add_tail( &st[0], &msg );
  18. st[ 1 ].tx_buf = &value;
  19. st[ 1 ].len = 1;
  20. spi_message_add_tail( &st[1], &msg );
  21. spi_sync( rc522_spi, &msg );
  22. SET_SPI_CS;
  23. };

三 添加定时器

为了节省CPU资源,需要添加一个定时器,每隔一定的时间才读卡一次。代码略。

到此为止,驱动的关键部分已经完工,只需把spi_register_driver(&rc522_driver)和misc_register(&rc522_misc_device)放进rfid_rc522_init()函数即可进行编译调试。

RC522 模块驱动程序的更多相关文章

  1. LINUX设备驱动程序的注意事项(两)建设和执行模块

             <一>:设置測试系统 首先准备好一个内核源代码树,构造一个新内核,然后安装到自己的系统中.           <二>:HelloWorld模块 #inclu ...

  2. RC522射频卡读写模块驱动(仅读取)

    目录 说明 测试结果 main RC522.h RC522.c 说明 更改了网上的源代码,仅保留了读取序列号并通过串口回传的功能.版本号:V1 感谢 https://blog.csdn.net/qq_ ...

  3. RC 522模块在LINUX平台调试笔记

    硬件平台: 1 主控:SMDK Exynos4412 POP S5M8767A 2 RFID模块:君盾集团提供的RC522模块 3 通信接口:SPI 软件平台:Android ICS & ke ...

  4. 【模块应用】MFRC522开发笔记

    一.了解基本概念 ①ISO-14443A协议:( 国际标准化组织:International Organization for Standardization)RFID协议的一种;   PICC:临近 ...

  5. Arduino+RFID RC522 +继电器

    博客园的第一篇博文就献给Arduino了.不知道能不能坚持自己喜欢的并且记录下来. 起码是个好的开始. 想实现一卡通代替钥匙开启电动车. 简单的原理,通过RC522模块读取一卡通的序列号,在程序中进行 ...

  6. linux模块驱动之led(ioremap)

    一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...

  7. MSP430WARE++的使用3:modbus模块的调用方法

    MSP430WARE++的使用3:modbus模块的调用方法     MSP430WARE是一套基于C++语言的开源的MSP430层次化软件架构,支持多种外设. 本文将介绍modbus模块驱动程序的调 ...

  8. MicroPython:基于TPYBoard集合MAX7219点阵模块制作表白女神神器

    转载请注明文章来源,更多教程可自助参考docs.tpyboard.com,QQ技术交流群:157816561,公众号:MicroPython玩家汇 前言 又是一年毕业季,只有到了毕业季才会意识到自己又 ...

  9. 基于 Arduino 的 RFID 识别实验

    http://www.it165.net/embed/html/201512/3287.html 2015年12月04日(周五) 上午  博士的智能卡实验--RFID识别实验,基于51单片机: 我们的 ...

随机推荐

  1. 【BZOJ4423】[AMPPZ2013]Bytehattan 对偶图+并查集

    [BZOJ4423][AMPPZ2013]Bytehattan Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v), ...

  2. angularJS指令系统---Directive

    指令:Directive angularJS 有一套完整的,可拓展的,用来帮助web应用开发的指令集: 在建立DOM期间,和HTML关联着的指令会被检测到,并被执行: 在angularJS中将前缀为 ...

  3. 关于Properties的用法的详细解释

    如果不熟悉 java.util.Properties类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的.(如清单 1 所示).最近更新的java.util.Properti ...

  4. 170726、常用 Git 命令清单

    ,下面是我整理的常用 Git 命令清单.几个专用名词的译名如下: Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 一 ...

  5. centos7yum下载安装报:软件包与预期下载的不符。建议:运行 yum --enablerepo=updates clean metadata尝试其他镜像

    centos7yum下载安装报:软件包与预期下载的不符.建议:运行 yum --enablerepo=updates clean metadata尝试其他镜像. rm -f /var/lib/rpm/ ...

  6. 使用Python创建.sd服务定义文件,实现脚本自动发布ArcGIS服务

    借助ArcGIS桌面发布ArcGIS服务是一个很熟悉的过程了,发布服务的前提是需要拥有一个已连接的ArcGIS Server服务站点,经过对mxd进行制图配置,定义服务参数,才能实现服务的发布,那么这 ...

  7. 解决ORA-29857:表空间中存在域索引和/或次级对象 & ORA-01940:无法删除当前连接的用户问题 分类: oracle sde 2015-07-30 20:13 8人阅读 评论(0) 收藏

    今天ArcGIS的SDE发生了一点小故障,导致系统表丢失,所以需要重建一下SDE数据库,在删除SDE用户和所在的表空间过程中遇到下面两个ORA错误,解决方法如下: 1)删除表空间时报错:ORA-298 ...

  8. ArcGIS for Server的安装及站点中的集群配置 分类: ArcGIS for server 2015-07-18 14:14 16人阅读 评论(0) 收藏

       坚信并为之坚持是一切希望的原因. (不足之处,欢迎批评指正!) --------------------环境:Windows server2008R2虚拟机两台----------------- ...

  9. Crossed ladders---poj2507(二分+简单几何)

    题目链接:http://poj.org/problem?id=2507   题意就是给你x y c求出?的距离: h1 = sqrt(x*x-d*d); h2 = sqrt(y*y-d*d); (h1 ...

  10. python之动态参数 *args,**kwargs(聚合,打散--转载

    转自https://www.cnblogs.com/ellisonzhang/p/10243122.html 一.函数的动态参数 *args,**kwargs, 形参的顺序 1.你的函数,为了拓展,对 ...