【NanoPi K1 Plus试用体验】SPI驱动探索(上)

  • bluebanboom
  • LV4工程师
  • |      2018-07-10 16:18:32
  • 浏览量 1497
  • 回复:0
本帖最后由 bluebanboom 于 2018-7-10 16:31 编辑 用了这么多的派,还没有好好的用一下原生的Linux驱动。在Linux下多数外设都是可以通过read和write的方式进行交互,比如可以通过读写/sys/class/gpio/gpioXXX来控制GPIO,同样的SPI也是可以直接通过读写/dev/spidevX.X来直接操作。Nano Pi K1 Plus的FriendlyCore已经默认启用了SPI0,也就是可以直接使用/dev/spidev0.0。 使用SPI协议的模块不少,我手上有一个Max7219点阵LED,之前已经把它的驱动原理完全搞明白了,用它来探索NanoPi K1 Plus的SPI最合适不过了。 关于Max7219的详细说明可以参考之前的这篇帖子。这里再简单的提一下,7219的一行对应一个寄存器地址,一个地址可以写入一个字节,也就是8位,其中每一位对应改行的一个led,所以我们想要在7219上显示图案逐行写入每个led的亮灭即可,非常的简单。 因为SPI默认是一次传输一个字节,而Max7219一次需要两个字节,第一个是寄存器地址,第二个是数据,所以我们需要告知Max7219数据的起始,这就需要通过CS引脚,当开始传输时,将CS置为低电平,先传输8位寄存器地址,再传输8位数据,然后讲CS置为高电平,表示寄存器操作完成。 所以,我们只需要写一个核心的writeMax7219函数即可,它有两个参数,一个是寄存器地址,一个是寄存器值。原理回顾完了,是不是很简单了,网上关于Max7219如何驱动的文章一堆,但是看下来都一头雾水。代码也是看的糊里糊涂的,因为多数代码用的是GPIO模拟SPI协议。其实,要想简单快速理解,我们需要分成两部分,一部分是SPI协议,另一部分就是在SPI协议之上,也就是刚才回顾的原理。而如果用系统的SPI的话,比如Arduino的SPI.transfer就更简单了。所以,我们在探索SPI的时候也是分两步走,首先用WiringNP库提供的SPI函数来驱动好Max7219,验证我们的核心writeMax7219函数,然后再直接使用读写文件的方式来直接驱动。 先来介绍一下WiringNP里关于SPI的两个主要函数: 关于模式的确认,需要看一下Max7219的时序图,而时序图我是不熟悉的,所以没法做详细说明了。但是模式非常重要,一旦设置错了,是没法正常驱动的。模式可以理解成方言,比如福建的一些方言,是完全听不懂的。很尴尬。 这里需要简单说一下同时读写,SPI是全双工的模式,我们可以在写入数据的同时又读取数据,因为Max7219不需要读数据,这个功能是用不上的。而在开头提到的write和read函数是做不到同时读写,但是驱动Max7219是需要读数据,所以直接用write问题不大。 这两个函数讲完了,那其实代码也就写完了,总共三步就可以了 第一,初始化SPI; 第二,编写核心writeMax7219函数; 第三,初始化Max7219,显示数据; 第一步,我们在讲解API的时候完成了。 第二步,第三步直接上代码,如下图所示: 其实,核心代码就十多行,因为不需要考虑SPI协议的具体细节。下一篇,我会直接用读写文件的方式来驱动Max7219。 附件是完整代码,需要按照Wiki里的说明先安装WiringNP http://wiki.friendlyarm.com/wiki ... ogramming_with_C/zh
  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:0
x
收藏成功!点击 我的收藏 查看收藏的全部帖子