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

Linux下的SPI通信

SPI通信


一. 1.SPI简介:

  1. SPI 是一种高速,全双工,同步串行总线。

  2. SPI 有主从俩种模式通常由一个主设备和一个或者多个从设备组从。SPI不支持多主机。

  3. SPI通信至少需要四根线,分别是 MISO(主设备数据输入,从设备输出),MOSI (主设数据输出从设备输入),SCLK(时钟信号),CS/SS (片选信号)。

连接方式:

2.工作模式:

极性和相位
SPI 的极性(polarity)和相位 (phase)一般写为 CPOLCPHA,即

CPOL(时钟极性):clock Polarity,CPHA(时钟相位) :Clock Phase

CPOL:表示时钟信号的初始电平状态。为 0表示时钟信号初始电平状态为低电平。为 1表示时钟信号初始电平状态为高电平。

CPHA:表示在第几个时钟跳变沿采样数据。为0表示在第一个时钟时钟跳变沿采样数据为1表示在第二个时钟跳变沿采样数据。

CPOL高/低--------CPHA高/低组成SPI的四种工作模式

二.SPI驱动框架图:

三.SPI的Device和Driver部分:

1.Devices部分使用设备树创建节点:

driver部分与设备树的匹配方式,需要先遍历设备树中是否有描述SPI设备的子节点,当发现节点信息是,会向内核中注册Device信息。

在注册Device时,会处理SPI的设备节点信息,判断必要的设备信息是否存在:

在遍历节点信息时,会判断设备树的节点信息中是否有Device speedDevice speed信息是否存在:否则spi_dev_put(spi);会释放刚添加的Device

        /* Device address */prop = of_get_property(nc, "reg", &len);if (!prop || len < sizeof(*prop)) {dev_err(&master->dev, "%s has no 'reg' property\n",nc->full_name);spi_dev_put(spi);continue;}spi->chip_select = be32_to_cpup(prop);/* Mode (clock phase/polarity/etc.) */if (of_find_property(nc, "spi-cpha", NULL))spi->mode |= SPI_CPHA;if (of_find_property(nc, "spi-cpol", NULL))spi->mode |= SPI_CPOL;if (of_find_property(nc, "spi-cs-high", NULL))spi->mode |= SPI_CS_HIGH;/* Device speed */prop = of_get_property(nc, "spi-max-frequency", &len);if (!prop || len < sizeof(*prop)) {dev_err(&master->dev, "%s has no 'spi-max-frequency' property\n",nc->full_name);spi_dev_put(spi);continue;}

所以在添加设备树节点时,需要添加必要的两个信息即为:片选地址和通信速度

&spi0 {status = "okay";mcp2515:mcp2515@0{compatible = "my-mcp2515";
/*片选*/reg = <0>;
/*速度,不能超过50M*/spi-max-frequency = <24000000>;}
}

2.Driver部分:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/spi/spi.h>static int spi_driver_probe(struct spi_device *spi)
{printk("This is SPI driver probe\n");return 0;
}
static int spi_driver_remove(struct spi_device *spi){return 0;
}static const struct of_device_id spi_driver_of_match_table[] = {{.compatible = "my-mcp2515"},{},
}const struct spi_device_id spi_driver_id_table[] = {{"spi_driver"}, {}}struct spi_driver spi_driver = {.driver = {.name = "spi_driver",.owner = THIS_MODULE,.of_match_table = spi_driver_of_match_table,},.probe = spi_driver_probe,.remove = spi_driver_remove,.id_table = spi_driver_id_table,
}static int __init
spi_driver_init(void)
{int ret = 0;ret = spi_register_driver(&spi_driver);if (ret != 0){printk(KERN_ERR "Failed to unregister spi driver\n");}return 0;
}static void __exit spi_driver_exit(void)
{spi_unregister_driver(&spi_driver);
}module_init(spi_driver_init);
module_exit(spi_driver_exit);
MODULE_LICENSE("GPL");

3.完善Driver部分,在probe中使用字符设备框架添加设备控制节点(如果不需要与应用层交换数据,也可以不添加设备控制节点):

dev_t dev_num;
struct cdev mcp2515_cdev;
struct class

相关文章:

Linux下的SPI通信

SPI通信 一. 1.SPI简介: SPI 是一种高速,全双工,同步串行总线。 SPI 有主从俩种模式通常由一个主设备和一个或者多个从设备组从。SPI不支持多主机。 SPI通信至少需要四根线,分别是 MISO(主设备数据输入,从设备输出),MOSI (主设数据输出从设备输入),SCLK(时钟信号),CS/SS…...

【转载】数字化工厂规划蓝图报告

制造业进入到全新的数字化时代&#xff0c;需要构建新型智能工厂、数字化工厂与智能车间以助力传统产业智能制造升级&#xff0c;将新一代信息技术贯穿到设计、工艺、生产、物流等各个环节。目的是完善创新体系、提升产品质量、推行绿色制造、增强核心竞争力、发展现代化客户体…...

《基于GNU-Radio和USRP的雷达通信系统的实现》文献阅读

文章目录 前言一、摘要二、引言三、联合系统实施1、基本原理2、实验方案 四、软件设置1、发射机2、接收机 五、实验结果1、实验设置2、波形3、室内外对比4、不同参数的结果 六、结论七、参考文献八、论文自取九、阅读收获 前言 本文记录《基于GNU-Radio和USRP的雷达通信系统的实…...

Sealos急速部署生产用k8s集群

最近一段时间部署k8s全部使用sealos了&#xff0c;整体使用感觉良好&#xff0c;基本没有什么坑。推荐给大家。 使用 Sealos&#xff0c;可以安装一个不包含任何组件的裸 Kubernetes 集群。 最大的好处是提供 99 年证书&#xff0c;用到我跑路是足够了。不用像之前kubeadm安装…...

VTK数据的读写--Vtk学习记录1--《VTK图形图像开发进阶》

读和写操作是VTK可视化管线两端相关的类--Reader和Writer类 Reader:将外部数据读入可视化管线&#xff0c;主要步骤如下 s1:实例化Reader对象 s2:指定所要读取的文件名 s3:调用Update()促使管线执行 对应的Writer: s1:实例化Writer对象 s2输入要写的数据以及指定写入的文…...

Vue3专栏项目 -- 一、第一个页面(下)

一、Dropdown 组件&#xff08;下拉菜单组件&#xff09;编码 1、基本功能&#xff1a;展示出下拉按钮和下拉菜单栏的样式 我们可以通过bootstrap来实现这个下拉框&#xff0c;需要注意它这个只是有样式&#xff0c;是没有行为的 然后这个下拉按钮的文字展示是根据用户名称展…...

一栈走天下:使用HBuilderX高效搭建Uni-App微信小程序开发环境

一栈走天下&#xff1a;使用HBuilderX高效搭建Uni-App微信小程序开发环境 Uni-App与HBuilderX简介Uni-App基础HBuilderX介绍 环境搭建步骤步骤1&#xff1a;安装HBuilderX步骤2&#xff1a;创建Uni-App项目步骤3&#xff1a;配置微信小程序平台步骤4&#xff1a;预览与发布 代码…...

docker安装Debian:11 freeswitch1.10.5

文章目录 一、生成一个镜像二、切换一个镜像源为阿里源三、安装一些相关依赖和freeswitch3.1第一步&#xff1a;安装freeswitch-mod和下载所需的依赖项3.2 设置密钥3.3 安装freeswitch所需的依赖项3.4 报错3.4.1 报错13.4.2 报错23.4.3 报错3 四、运行4.1 通话三十秒自动挂断 一…...

c3 笔记6 认识css样式表

<link>与import应该如何选择?事实上&#xff0c;使用link与import链接外部样式文件的效果看起来是一样的&#xff0c;区别在于<link>是HTML标记而import属于CSS语法。<link>标记有rel、type与href属性&#xff0c;可以指定CSS样式表的名称&#xff0c;这样就…...

基于springboot+mybatis+vue的项目实战之增删改查CRUD

目录结构 PeotController.java package com.example.controller;import com.example.pojo.Peot; import com.example.pojo.Result; import com.example.service.PeotService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web…...

字节跳动(社招)四面算法原题

TikTok 进展 又是一期定时汇报 TikTok 进展的推文。 上周&#xff0c;美国总统拜登签署了价值 950 亿美元的一揽子对外援助法案。 该法案涉及强制字节跳动剥离旗下应用 TikTok 美国业务&#xff0c;即 针对 TikTok 非卖即禁的"强抢行为"开始进入九个月&#xff08;27…...

车道线检测交通信号识别车辆实时检测

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言车道线检测机器学习前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对车道线检测&交通信号识别&…...

用正则表达式打造免费代理IP池

爬虫的过程中&#xff0c;当对方服务器发现你屡次爬取它&#xff0c;可能会遇到被封IP的苦痛&#xff0c;这时IP就应该换啦&#xff0c;打造IP池的意义十分重要&#xff0c;提供免费IP网站有很多&#xff0c;本次用的是西刺代理IP # -*- coding: utf-8 -*- """…...

【每日刷题】Day35

【每日刷题】Day35 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 844. 比较含退格的字符串 - 力扣&#xff08;LeetCode&#xff09; 2. 2487. 从链表中移除节点 - 力…...

Python数据清洗与可视化实践:国际旅游收入数据分析

文章目录 概要整体流程名词解释NumPyPandasMatplotlibre 技术细节数据清洗可视化 小结 概要 在本篇博客中&#xff0c;我们将通过一个实际的案例&#xff0c;演示如何使用Python进行数据清洗和可视化&#xff0c;以分析国际旅游收入数据。我们将使用Python中的Pandas库来进行数…...

前置知识储备

基本认知 什么是模式 在一定环境中解决一些问题的方案&#xff08;通俗来说&#xff1a;特定环境中用固定的套路解决问题&#xff09; 什么是设计模式 设计模式是一套反复被人使用&#xff0c;多数人知晓的&#xff0c;经过分类编目的代码设计经验的总结 设计模式最终的目…...

六月品牌互动营销方案的作用是什么

品牌需要借势营销&#xff0c;六月的六个节日热点&#xff0c;是企业商家不能错过的&#xff0c;如何运用合适的工具/方法借势也同样重要。 互动h5游戏/传单页面发挥不同效果&#xff0c;这份《六月品牌互动营销方案》看看有哪些内容吧~ 1、儿童节 宜&#xff1a;回忆欢乐营销…...

dummy_worker C++ 预占用部分比例cpu资源,人为创造cpu资源紧张

背景 有时候为了C测试程序在cpu资源紧张情况下是否正常&#xff0c;需要人为创造cpu资源紧张 编译方法 g -o dummp_worker dummp_worker.cpp -stdc11 -pthread 使用方法 ./dummp_worker 4 0.2 占用4个cpu核的20%比例的cpu资源 源码 // dummp_worker.cpp #include <c…...

电脑缺失opencl.dll怎么办,轻松解决opencl.dll的多种方法分享

当我们在操作电脑过程中遇到系统提示“由于找不到opencl.dll&#xff0c;无法继续执行代码”&#xff0c;这个错误会导致软件应用无法正常运行。OpenCL.dll作为一个与Open Computing Language&#xff08;开放计算语言&#xff09;相关的动态链接库文件&#xff0c;它在执行需要…...

el-select 点击按钮滚动到选择框顶部

主要代码是在visibleChange 在这个 popper 里面找到 .el-select-dropdown__list let popper ref.$refs.popper const ref this.$refs.select let dom popper.querySelector(.el-select-dropdown__list) setTimeout(() > { dom.scrollIntoView() }, 800) <templat…...

别再只用Unity做游戏了!用Game4Automation PRO插件,手把手教你搭建一条虚拟生产线(附PLC连接避坑指南)

跨界开发者的工业仿真指南&#xff1a;用Unity打造虚拟生产线全流程 当游戏开发者遇上工业自动化&#xff0c;会碰撞出怎样的火花&#xff1f;Unity作为全球最流行的游戏引擎之一&#xff0c;早已突破了娱乐产业的边界。今天&#xff0c;我们将探索如何利用Game4Automation PRO…...

从零到一:构建你的第一个智能体应用实战指南

1. 为什么你需要一个智能体应用&#xff1f; 想象一下这样的场景&#xff1a;每天早上你的手机自动整理当天的重要会议和待办事项&#xff0c;根据你的日程推荐最佳出行路线&#xff1b;工作时自动汇总行业动态和关键邮件&#xff1b;晚上回家前提前打开空调并推荐符合你口味的…...

OpenClaw+百川2-13B-4bits:自媒体人的内容创作流水线搭建

OpenClaw百川2-13B-4bits&#xff1a;自媒体人的内容创作流水线搭建 1. 为什么需要自动化内容流水线 作为一个长期运营科技类自媒体的创作者&#xff0c;我每天需要完成热点追踪、大纲构思、初稿撰写、排版发布等一系列重复性工作。最痛苦的不是写作本身&#xff0c;而是大量…...

Llama-3.2V-11B-cot多轮对话效果展示:复杂技术问题拆解与解答

Llama-3.2V-11B-cot多轮对话效果展示&#xff1a;复杂技术问题拆解与解答 最近在测试各种大模型时&#xff0c;我特意找了一个比较“刁钻”的场景&#xff1a;让模型来解答一个复杂的系统设计问题。这类问题通常不是一两句话能说清的&#xff0c;它需要模型有很强的逻辑推理能…...

java毕业设计基于springboot铜仁一中学生成绩管理系统

前言 铜仁一中学生成绩管理系统是基于Java和Spring Boot框架开发的&#xff0c;目的是高效管理学生的成绩信息&#xff0c;为学校教学管理提供便利。通过该系统&#xff0c;教师可以方便地录入学生的各科考试成绩&#xff0c;学生和教师能够根据不同条件查询成绩&#xff0c;系…...

终极GitHub加速指南:3分钟让你的下载速度飙升100倍

终极GitHub加速指南&#xff1a;3分钟让你的下载速度飙升100倍 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub GitHub作为全球最大…...

童年回忆杀!仿《燃烧的蔬菜》游戏完整源码 免费!!!

谁的童年没玩过《燃烧的蔬菜》&#xff01;这款经典的塔防休闲游戏&#xff0c;用蔬菜当炮弹击退怪物&#xff0c;治愈又解压。今天用PythonPygame复刻核心玩法&#xff0c;包含蔬菜发射、怪物生成、碰撞检测、计分系统&#xff0c;完整源码直接运行&#xff0c;带你重温童年&a…...

OpenClaw技能扩展指南:为nanobot添加自定义QQ机器人功能

OpenClaw技能扩展指南&#xff1a;为nanobot添加自定义QQ机器人功能 1. 为什么需要QQ机器人集成 去年夏天&#xff0c;我发现自己经常在深夜调试代码时&#xff0c;需要反复切换手机和电脑查看运行结果。这种低效的操作让我开始寻找一种更优雅的解决方案——通过聊天工具直接…...

熵权法背后的信息论:为什么你的特征权重计算总不准?

熵权法的信息论本质&#xff1a;从数学原理到权重计算的精准控制 当我们需要从海量数据中提取关键特征时&#xff0c;如何科学地确定每个特征的权重&#xff1f;熵权法作为一种客观赋权方法&#xff0c;其核心思想源自信息论中的熵概念。但许多实践者发现&#xff0c;直接套用标…...

联邦学习与差分隐私:如何在MXNet中实现安全的深度学习训练

联邦学习与差分隐私&#xff1a;如何在MXNet中实现安全的深度学习训练 在当今数据驱动的AI时代&#xff0c;保护用户隐私和数据安全已成为深度学习框架必须面对的重要挑战。MXNet作为Apache基金会旗下高效的深度学习框架&#xff0c;通过集成联邦学习和差分隐私技术&#xff0…...