spi总线之通信原理及linux驱动读写实现

2023-11-18

一、SPI简介
1.SPI,全称SerialPerripheral Interface,也就是串行外围设备接口,是一种高速全双工穿的同步通信总线,SPI时钟频率相比I2C要高得多,最高可以达到上百MHz,SPI以主从方式工作,通常是一个主设备和一个或多个从设备,一般SPI需要4根线,也可以使用3根线(单向传输),下面介绍标准的4线通信:

  • CS/SS,Slave Select/Chip Select,这个是片选信号线,用于选择需要进行通信的从设备。
    I2C 主机是通过发送从机设备地址来选择需要进行通信的从机设备的,SPI 主机不需要发送从机
    设备,直接将相应的从机设备片选信号拉低即可。
  • SCK,串行时钟(Serial Clock),和I2C的SCL一样,为SPI通信提供时钟。
  • MOSI/SDO,主出从入信号线(Master Out Slave In/Serial Data Output),此数据线智能用于主机向从机发送数据,也就是主机输出,从机输入。
  • MISO/SDI,主入从出信号线(Master In Slave Out/Serial Data Input),此数据线智能用户从机向主机发送数据,也就是主机输入,从机输出。
    SPI通信都是由主机发起的,主机提供时钟信号,
    在这里插入图片描述

SPI四种工作模式,串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式,如图:
在这里插入图片描述

  • CPOL(极性)=0,串行时钟空闲状态为低电平。
  • CPOL(极性)=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具体的传输协议。
  • CPHA(相位)=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
  • CPHA(相位)=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。

SPI全双工通信时序图,CPOL=0,CPHA=0。
在这里插入图片描述
片选(CS)信号拉低,即选中进行通信的从设备,SCLK时钟CPOL=0(极性为0是低电平),CPHA=0(相位为0,第一个跳变沿),然后MOSI发送数据0xD2(1101 0010)给从设备,同时从设备也通过MISO数据线给主设备返回0x66(110 0110)。

二、linux驱动中SPI读写代码实现

#include <linux/spi/spi.h>

struct spi_test_data{
	struct spi_device *spi_dev;
	char *tx_buf;
	char *rx_buf;
	//int tx_len;
	//int rx_len;
};
static u32 bit_per_word = 8; //每个字长的比特数
int demo_spi_read(struct spi_test_data *st,size_t len)
{
	struct spi_message msg;
	struct spi_transfer xfer = {
		.rx_buf = st->rx_buf,
		.len 	= len,
	};
	spi_message_init(&msg);
	//将spi_transfer添加到spi_message队列
	spi_message_add_tail(&xfer,&msg);
	//同步传输
	return spi_sync(st->spi_dev, &m);
}
int demo_spi_write(struct spi_test_data *st,size_t  len)
{
	struct spi_message msg;
	struct spi_transfer xfer = {
		.tx_buf = st->tx_buf,
		.len 	= len,
	};	
	spi_message_init(&msg);
	//将spi_transfer添加到spi_message队列
	spi_message_add_tail(&xfer,&msg);
	return spi_sync(st->spi_dev, &m);
}
int spi_write_then_read_demo(struct spi_test_data *st,unsigned tx_len,unsigned rx_len)
{
	int ret = -1;
	ret = spi_write_then_read(st->spi,st->tx_buf,tx_len,st->rx_buf,rx_len);
	return ret;
}
int spi_write_and_read_demo(struct spi_test_data *st,size_t len)
{
	struct spi_message msg;
	struct spi_transfer xfer = {
		.tx_buf = st->tx_buf,
		.rx_buf = st->rx_buf,
		.len 	= len,
	};	
	spi_message_init(&msg);
	//将spi_transfer添加到spi_message队列
	spi_message_add_tail(&xfer,&msg);
	return spi_sync(st->spi_dev, &m);
}

以上代码只提供思路验证,如有错误请多多批评指正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spi总线之通信原理及linux驱动读写实现 的相关文章

随机推荐

  • programming massively parrellel processors(1)

    I have to say this is a very good book to learn more about cuda especially for a novice like me who take interest in par
  • 入职字节两个月,实在卷不动,还是离职了

    对自己收入不满意 就看下自己每天做了什么 把每天记录下来 看下自己的时间都用在哪里了 对自己的时间分配搞清楚了 就可以着手去改进 如果一直糊涂的过 时间到了报复就来了 时间管理很简单 不过大多数人是不会重视的 别总抱怨自己赚钱少 关键你做了
  • Asgard King(埃氏筛法)

    Description Thor had great power but his arrogant and reckless behavior set off an ancient war and he was demoted into t
  • Mock介绍

    mock的定义 what mock是在测试过程中 对于一些不容易构造 获取的对象 创建一个mock对象来模拟对象的行为 为什么要使用mock why 在做单元测试过程中 经常会有以下的场景 class A 依赖 class B class
  • 14.C++之对象的初始化和清理

    学习目标 学习内容 1 对象的初始化和清理 在C 中 每个对象也都会有初始设置以及 对象销毁前的清理数据的设置 今天介绍两种函数 构造函数和析构函数 来完成对象的初始化和清理 构造函数 主要用于为对象的成员属性赋值 又编译器自动完成 无须手
  • 报错:SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position xx: truncated

    我给出的错误代码 错误原因 文件路径输入问题 解决方法 1 在前面加r 2 将 变为 3 将 变为
  • C++学习日志

    小白C 从入门到放弃 1 黑马通讯录管理系统 点运算符 和箭头运算符 gt 的区别 2 Essential C 中练习2 1 3 Essential C 中练习2 2 4 Essential C 中练习2 3 5 Essential C 中
  • C++中变量声明和定义

    1 声明和定义都规定了变量的名字和类型 但是定义会申请内存空间 也可能为变量赋一个初始值 2 同一个变量声明可以有多处 但定义只能有一处 extern int i 声明i而非定义i int j 声明并定义j extern关键字就是告诉编译器
  • 机器智能学科

    机器智能学科简介 机器智能 Machine Intelligence MI 是指由机器 计算机以及其它计算设备 实现的人的智能 也被称为人工智能 Artificial Intelligence AI 专指计算机科学中与智能行为自动化有关的一
  • RAC重建OCR/Voting disk总结

    author skatetime 2010 05 10 我的测试环境 母系统 win2003虚拟软件 vmware3 2 1guest系统 centos4 7oracle db oracle10 2 1 前两天由于意外原因 同事从新插拔下电
  • Auto-GPT横空出世!

    转自公众号 放码过来a 千万别关注 为怕你看了会上瘾 Auto GPT 顾名思义 其独到之处就在于 Auto 可 自主 实现你设定的任何目标 即 Auto GPT 会自己上网查资料 自己思考解决方案 自己运用相关工具 而你要做的 就是在屏幕
  • 报错Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    方法一 support依赖版本改为27 1 1并添加一下配置 implementation com android support appcompat v7 27 1 1 configurations all exclude group c
  • 工具技能学习(一):前置技能-makfile、make、.mk

    工具技能学习 一 前置技能 makfile make mk 在构建镜像的时候你肯定看到了很多的makefile文件 昨天我们也解读一些一些构建编译的makefile文件 但是有些兄弟没有这方面的经验 对于makefile文件的格式还是不是很
  • 树莓派4B之Windows XP系统安装游戏(二)

    上一篇博文 树莓派4B之Windows XP系统安装游戏 一 上上篇博文 树莓派4B安装windows xp windows 95 windows xp windows 95 for raspberry pi 4B 目录 一 获取游戏下载途
  • re模块----你也可以玩得很溜正则表达式

    目录 re模块 compile pattern flags 0 flag匹配模式 match pattern string flags 0 search pattern string flags 0 findall pattern stri
  • java file类总结

    直入正题 代码 自己可以复制去看 里面主要 介绍了文件的File类的新建 删除 重命等操作 以及File文件的属性方法 package com gx iodemo import java awt BufferCapabilities Fli
  • APP漏洞挖掘(二)同开发商的多款APP存在通用漏洞

    0x01 前言 测某一APP时 根据信息收集 测试 发现APP的后台系统存在SQL注入 XSS 弱口令 信息泄漏等漏洞 此APP本身存在逻辑漏洞与SQL注入漏洞 再通过观察酷传搜索的结果发现此APP开发商开发了三十几个APP 猜测可能存在相
  • video-09-video音频视频 进度条无法正常使用问题

    开发过程中遇到了 进度条无法使用 吓我一跳 还以为是开发有问题呢 目录 一 现象 二 原因 三 解决 一 现象 网页播放器能够正常播放文件 但是播放器的进度条只能显示进度 没办法拖动 二 原因 视频url链接缺少响应头 三 解决 https
  • Allegro整体旋转

    1 激活MOVE命令 然后在Options栏Point选择User Pick 在Find栏勾上所有ALL ON 2 空白处 右击选中Temp Group 3 选中要旋转的部分 右击选中Complete 4 点击一点作为User Pick旋转
  • spi总线之通信原理及linux驱动读写实现

    一 SPI简介 1 SPI 全称SerialPerripheral Interface 也就是串行外围设备接口 是一种高速全双工穿的同步通信总线 SPI时钟频率相比I2C要高得多 最高可以达到上百MHz SPI以主从方式工作 通常是一个主设