SPI 通信
Frm: http://www.wzaobao.com/p/l5079K.html
http://blog.csdn.net/xqmoo8/article/details/8043474
http://www.cnblogs.com/sky-heaven/p/5736638.html
http://www.cnblogs.com/sankye/p/3955630.html
15.3 用户态SPI编程
Linux的SPI总线设备文件名通常为/dev/spidevN.P(N=0、1、2……,P=0、1、2……),其中N表示第几路SPI总线,而P表示在该路SPI总线中使用哪个CS信号线。
EasyARM-i.MX283A提供了1路SPI总线,在该总线中只有1个CS信号线,其设备文件名为/dev/spidev1.0。
15.3.1 SPI编程接口
1、打开设备
在使用SPI设备时,需要调用open()函数打开设备文件,获得文件描述符,如程序清单15.3所示。
程序清单15.3打开SPI设备文件
fd = open(“/dev/spidev1.0”, O_RDWR);
if (fd < 0) {
perror(“can not open SPI device\n”);
}
2、关闭设备
设备使用完成后,调用close()函数关闭设备,如下所示:
close(fd);
3、总线控制
通过调用ioctl()函数使用不同的命令,应用程序可以配置SPI总线的极性和相位、设置总线速率、数据字长度以及实现数据收/发。
设置总线极性和相位
设置SPI总线极性及相位是使用SPI_IOC_WR_MODE命令实现,该命令的用法参考表15.5。
表15.5SPI_IOC_WR_MODE命令
|
命令 |
SPI_IOC_WR_MODE |
|
调用方式 |
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); |
|
功能描述 |
设置SPI总线的极性和相位 |
|
输入参数说明 |
mode的可选值为:SPI_MODE_0、SPI_MODE_1、SPI_MODE_2、SPI_MODE_3,这些值的说明参考下面内容。 |
|
返回值说明 |
0:设置成功 1:设置不成功 |
SPI_MODE_0定义的模式为POLARITY(极性)=0、PHASE(相位)=0,时序如图15.4所示。
图15.4 POLARITY=0、PHASE=0的时序
SPI_MODE_1定义的模式为POLARITY=0、PHASE=1,时序如图15.5所示。
图15.5 POLARITY=0、PHASE=1的时序
SPI_MODE_2定义的模式为POLARITY=0、PHASE=1,时序如图15.6所示。
图15.6 POLARITY=0、PHASE=1的时序
SPI_MODE_3定义的模式为POLARITY=1、PHASE=1,时序如图15.7所示。
图15.7 POLARITY=1、PHASE=1的时序
设置SPI总线极性和相位为SPI_MODE_0模式的方法可以参考如程序清单15.4所示的代码。
程序清单15.4设置SPI总线极性和相位示例
int mode = SPI_MODE_0
ret = ioctl(fd_spi, SPI_IOC_WR_MODE, &mode);
if (ret == -1) {
printf("can't set wr spi mode\n");
return -1;
}
设置每字的数据位长度
设置SPI总线上每字的数据位长度是使用SPI_IOC_WR_BITS_PER_WORD命令实现,该命令的用法参考表15.6。
表15.6SPI_IOC_WR_BITS_PER_WORD命令
|
命令 |
SPI_IOC_WR_BITS_PER_WORD |
|
调用方式 |
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits); |
|
功能描述 |
设置SPI总线上每字的数据位长度 |
|
输入参数说明 |
bits为每字的二制位数,取值 |
|
返回值说明 |
0为成功,其它值为失败 |
设置SPI总线的每字数据位长为8位的方法可以参考如程序清单15.5所示的代码。
程序清单15.5设置SPI数据位的示例代码
ret = ioctl(fd_spi, SPI_IOC_WR_BITS_PER_WORD, &bits); /* 设置SPI的数据位 */
if (ret == -1) {
printf("can't set bits per word\n");
return -1;
}
设置最大总线速率
设置SPI总线的最大速率是通过使用SPI_IOC_WR_MAX_SPEED_HZ命令实现,该命令用法参考表15.7。
表15.7SPI_IOC_WR_MAX_SPEED_HZ
|
命令 |
SPI_IOC_WR_MAX_SPEED_HZ |
|
调用方式 |
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); |
|
功能描述 |
设置SPI总线的最大速率 |
|
输入参数说明 |
speed为需要设置的SPI总线的最大频率,单位为Hz |
|
返回值说明 |
恒为0:设置成功 |
SPI总线的最大速率设置后,在使用过程并不是只能使用该频率收/发数据,而仅仅约束收/发数据时的最大频率。
数据接收/发送命令
在SPI总线实现数据收/发是使用SPI_IOC_MESSAGE(n)命令实现,该命令用法参考表15.8。
表15.8SPI_IOC_MESSAGE(n)命令
|
命令 |
SPI_IOC_MESSAGE(n) |
|
调用方式 |
ret = ioctl(fd, SPI_IOC_MESSAGE(n), &tr); |
|
功能描述 |
实现在SPI总线接收/发送数据操作,其中n的值可变 |
|
输入/输出参数说明 |
struct spi_ioc_transfer结构体用于封装要收/发的数据。tr参数指定向struct spi_ioc_transfer结构体的数组,数组长度为n。 |
|
返回值说明 |
0:操作成功 1:操作失败 |
使用SPI_IOC_MESSAGE(n)命令收/发的数据都需要使用struct spi_ioc_transfer结构体封装,该结构体的定义如程序清单15.6所示。
程序清单15.6struct spi_ioc_transfer结构体的定义
struct spi_ioc_transfer {
__u64 tx_buf; /* 指向发送数据的缓冲区 */
__u64 rx_buf; /* 指向接收数据的缓冲区 */
__u32 len; /* 收/发缓冲区中数据的长度 */
__u32 speed_hz; /* 总线速率 */
__u16 delay_usecs;
__u8 bits_per_word; /* 收/发数据的二进制位数 */
__u8 cs_change;
__u32 pad;
}
speed_hz不能大于在SPI_IOC_WR_MAX_SPEED_HZ命令中设置的总线速率。
由于iMX28xx处理器的SPI控制器只支持半双工,因此struct spi_ioc_transfer 结构体中的tx_buf和rx_buf只能设置一个有效,另一个必须设置为0,否则调用ioctl时会返回非零值提示操作错误。
SPI 通信的更多相关文章
- 理解一下单片机的I2C和SPI通信
应某位网友要求,今天说一下单片机的I2C SPI通信,可能说不清楚,因为这毕竟要做实验才可完全理解. I2C和SPI是两种不同的通信协议. 听到协议,似乎高不可攀,其实协议就是人们定义的一个标准而已, ...
- SPI通信实验---verilog(FPGA作为从机,使用可读可写)
本实验讲究实用性,故设计思想为:主机先向从机发送地址,若是向从机写入数据,则向从机发送数据,若是读取从机数据,则向从机发送时钟,然后在时钟下降沿读取数据即可.cs信号上升沿作为SPI通信的结束信号.r ...
- SPI通信
SPI是由Motorola公司提出的一种同步串行外围接口:它在速度要求不高,低功耗,需要保存少量参数的智能化传感系统中得到了广泛应用: SPI是一个全双工的同步串行接口,在数据传输过程中,总线上只能是 ...
- 关于SPI通信原理与程序实现
第一次接触SPI是因为当时用到NRF24L01,需要用SPI进行通信.因为2401上面写着MOSI.MISO.SS.RST,当时以为只要用到SPI就肯定有这几个引脚,以至于限制了自己的思维.只认识MI ...
- [转]SPI通信原理简介
[转自]http://www.cnblogs.com/deng-tao/p/6004280.html 1.前言 SPI是串行外设接口(Serial Peripheral Interface)的缩写.是 ...
- linux 下SPI通信注意事项(待续)
一.2台Linux设备之间使用SPI通信 1.标准Linux只支持Master 模式.但是可以在驱动中修改为Slave模式: 2.硬件SPI可能支持Slave模式,也可能不支持.这个要提前确认好: 3 ...
- ESP8266开发之旅 基础篇⑤ ESP8266 SPI通信和I2C通信
设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信,所以本章的主要内容就是讲解ESP8266 SPI和I2C总线 ...
- ESP8266 SPI通信
设备与设备之间的通信往往都伴随着总线的使用,而用得比较多的就当属于SPI总线和I2C总线,而恰巧NodeMcu也支持这两种总线通信 1. SPI总线——SPI类库的使用 SPI是串行外设接口(Seri ...
- 工作笔记——CPLD与MCU通过SPI通信
一.需求描述 MCU需要接收来自CPLD的升级固件数据 CPLD对MCU只进行发送数据,不接收MCU的数据 CPLD无法告知数据传输的开始和结束,需要MCU自行判断(CPLD只是数据透传,不做数据判断 ...
- OLED的波形曲线、进度条、图片显示(STM32 HAL库 模拟SPI通信 5线OLED屏幕)详细篇
少废话,先上效果图 屏幕显示效果 全家福 一.基础认识及引脚介绍 屏幕参数: 尺寸:0.96英寸 分辨率:128*64 驱动芯片:SSD1306 驱动接口协议:SPI 引脚说明: 二. ...
随机推荐
- linux 下vi与vim区别以及vim的使用
vi与vim vi编辑器是所有Unix及Linux系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器.他是我们使用Linux系统不能缺少的工具.由于对 ...
- Delphi Base64编码_解码及ZLib压缩_解压(转)
最近在写的程序与SOAP相关,所以用到了一些Base64编码/解码及数据压缩/解压方面的知识. 在这里来作一些总结:一.Base64编码/解码 一般用到的是Delphi自带的单元EncdDecd,当然 ...
- JVM典型配置和调优举例
1. 堆设置-Xms: :初始堆大小.-Xmx: :最大堆大小.-XX:NewSize=n: :设置年轻代大小.-XX:NewRatio=n: : :设置年轻代和年老代的比值.如:为 3,表示年轻代与 ...
- webstorm使用说明
1.移动光标到的代码块的结尾处(开始处 [ ) ctrl+] 2.移动光标到的代码块的结尾处并选择 ctrl+shift+] 3.ctrl + b: 跳到变量申明处 4.多光标输入: ...
- 【系统安全性】二、Web攻击与防范
二.Web攻击与防范 1.XSS攻击 跨站脚本攻击(Cross Site Scripting),因为简写CSS,与层叠样式表(Cascading Style Sheets)有歧义,所以取名XSS 原理 ...
- 本地JAR包打入本地mvn仓库
新建目录my-lib,将jar包移动到目录中,添加pom文件(用alipay测试) <project xmlns="http://maven.apache.org/POM/4.0.0& ...
- Dubbo入门到精通学习笔记(十四):ActiveMQ集群的安装、配置、高可用测试,ActiveMQ高可用+负载均衡集群的安装、配置、高可用测试
文章目录 ActiveMQ 高可用集群安装.配置.高可用测试( ZooKeeper + LevelDB) ActiveMQ高可用+负载均衡集群的安装.配置.高可用测试 准备 正式开始 ActiveMQ ...
- HDU 4109 Instrction Arrangement
题目链接:https://vjudge.net/problem/HDU-4109 题目大意 有 N 个指令,标号从 0 ~ N - 1,和 M 个指令间的先后关系,每个关系都有一个权值 w,表示后一个 ...
- UVA - 143 Orchard Trees (点在三角形内)
题意: 给出三角形的三个点的坐标(浮点数), 问落在三角形内及三角形边上的整点有多少? 思路:所有点暴力判断(点的范围1-99,三角形可能是0-100,因为这个WA了一下orz) AC代码: ...
- 前端(八)—— 高级布局:文档流、浮动布局、流式布局、定位布局、flex布局、响应布局
高级布局:文档流.浮动布局.流式布局.定位布局.flex布局.响应布局 一.文档流 1.什么是文档流 将窗体自上而下分成一行一行,块级元素从上至下.行内元素在每行中从左至右的顺序依次排放元素 2.本质 ...