linux下gpio模拟spi三线时序

目录

    • 前言
    • 一、配置内容
    • 二、驱动代码实现
    • 三、总结

前言

本笔记总结linux下使用gpio模拟spi时序的方法,基于arm64架构的一个SOC,linux内核版本为linux5.10.xxx,以驱动三线spi(时钟线sclk,片选cs,sdata数据读和写使用同一个数据线进行分时复用做半双工,笔记中使用mosi作为读写的数据线进行配置)的hmc704x为例;

一、配置内容

设备树配置

1.在芯片的引脚模式寄存器中配置 cs ,sclk , mosi ,miso为 gpio模式;
2.在spi控制器下添加pinctrl-x = 引脚引用,对引脚的模式进行生效

3.在spi控制器的节点下添加spi从设备节点,并定义cs,sclk,mosi,miso的gpio属性:
spics = <引用>;
spiclk = <引用>;
spimiso = <引用>;
spimosi = <引用>;

二、驱动代码实现

1、gpio请求

int spics_gpio = 0;
int spiclk_gpio = 0;
int spimiso_gpio = 0;
int spimosi_gpio = 0;
void  xxx_probe(xxxx)
{

      spics_gpio = of_get_named_gpio(spi->dev.of_node,"spics",0);
       if(spics_gpio<0){
               printk("faild to request gpio!\n");
       }
       gpio_request(spics_gpio,NULL);
    gpio_direction_output(spics_gpio,0);


   spiclk_gpio = of_get_named_gpio(spi->dev.of_node,"spiclk",0);
       if(spics_gpio<0){
               printk("faild to request gpio!\n");
       }
       printk("get GPIO%d\n",spiclk_gpio);
    gpio_request(spiclk_gpio,NULL);
       gpio_direction_output(spiclk_gpio,0);

spimiso_gpio = of_get_named_gpio(spi->dev.of_node,"spimiso",0);
if(spimiso_gpio<0){
	printk("faild to request gpio!\n");
}
gpio_request(spimiso_gpio,NULL);
   gpio_direction_output(spimiso_gpio,0);

spimosi_gpio = of_get_named_gpio(spi->dev.of_node,"spimosi",0);
       if(spimosi_gpio<0){
               printk("faild to request gpio!\n");
       }
gpio_request(spimosi_gpio,NULL);
   gpio_direction_output(spimosi_gpio,0);
}

2、读写函数实现
读写时序

在这里插入图片描述

读函数

#define HMC7044_WRITE		(0 << 15)
#define HMC7044_READ		(1 << 15)
#define HMC7044_CNT(x)		(((x) - 1) << 13)
#define HMC7044_ADDR(x)		((x) & 0xFFF)

static int xxx_read(
			unsigned int reg,
			unsigned int *val)
{
	u16 cmd,i;
        u32 data,datatemp;
	uint8_t tempvalue = 0;
        cmd = HMC7044_READ | HMC7044_CNT(1) | HMC7044_ADDR(reg);
        data = cmd; 

        gpio_direction_output(spimosi_gpio,0);
        gpio_set_value(spics_gpio,1);
        gpio_set_value(spiclk_gpio,0);
        gpio_set_value(spimosi_gpio,0);
        udelay(5);
        gpio_set_value(spics_gpio,0);
        for(i=0;i<16;i++)
        {
                gpio_set_value(spiclk_gpio,0);
                datatemp = ((data>>(15-i)) & 0x1);
                if(datatemp>0) gpio_set_value(spimosi_gpio,1);
                else gpio_set_value(spimosi_gpio,0);
                udelay(5);
                gpio_set_value(spiclk_gpio,1);
                udelay(5);
        }
	gpio_direction_input(spimosi_gpio);
        for(i=0;i<8;i++)
	{
		gpio_set_value(spiclk_gpio,0);
		udelay(5);
		tempvalue<<=1;
		gpio_set_value(spiclk_gpio,1);
		if(gpio_get_value(spimosi_gpio))
		{
			tempvalue++;
		}
		udelay(5);
	}

        gpio_set_value(spics_gpio,1);
        *val = tempvalue;
	return 0;
}

写函数

static int xxx_write(
			 unsigned int reg,
			 unsigned int val)
{ 
        u16 cmd,i;
        u32 data,datatemp;
	cmd = HMC7044_WRITE | HMC7044_CNT(1) | HMC7044_ADDR(reg);
        data = (cmd << 8) | (val & 0xFF);
        
	gpio_direction_output(spimosi_gpio,0);
	gpio_set_value(spics_gpio,1); 
	gpio_set_value(spiclk_gpio,0);
	gpio_set_value(spimosi_gpio,0);
	udelay(5);
	gpio_set_value(spics_gpio,0);
	
	for(i=0;i<24;i++)
	{
		gpio_set_value(spiclk_gpio,0);
		datatemp = ((data>>(23-i)) & 0x1);
		if(datatemp>0) gpio_set_value(spimosi_gpio,1); 
                else gpio_set_value(spimosi_gpio,0);
		udelay(5);
		gpio_set_value(spiclk_gpio,1);
		udelay(5);
	}
	gpio_set_value(spics_gpio,1);

        return 0;
}

三、总结

具体的芯片读写协议不一样,按具体spi时序协议做相应修改即可;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/901360.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

「二叉树进阶题解:构建、遍历与结构转化全解析」

文章目录 根据二叉树创建字符串思路代码 二叉树的层序遍历思路代码 二叉树的最近公共祖先思路代码 二叉搜索树与双向链表思路代码 从前序与中序遍历序列构造二叉树思路代码 总结 根据二叉树创建字符串 题目&#xff1a; 样例&#xff1a; 可以看见&#xff0c;唯一特殊的就…

SCI被「On Hold」意味着什么?会有哪些影响?

本文首发于“生态学者”微信公众号&#xff01; 继Chemosphere在2023年7月被「On Hold」之后&#xff0c;昨晚Science of The Total Environment 被标记为「On Hold」状态在各大公众号和朋友圈被刷屏&#xff01;&#xff08;官方网址&#xff1a;https://mjl.clarivate.com/s…

PouchDB - 免费开源的 JavaScript 数据库,轻量易用,用于离线保存数据的场景

这个 JS 工具库可以让我们很容易地实现数据缓存到本地的需求&#xff0c;要写的代码量也很少。 PouchDB 是一个基于 JavaScript 语言开发的轻量级的数据库&#xff0c;可以在浏览器、Node.js 等环境中使用。作者是一位来自国外的女开发工程师 Alba Herreras。 这是一个运行在浏…

el-datepicker禁用未来日期(包含时分秒)type=‘datetime’

文章目录 实现代码方式1&#xff1a;当选中日期的时候去更新一次。方式2: 优化版本&#xff0c;使用 setTimout 每分钟更新一次。&#xff08;防止选中日期之后过了很久再去选择时分秒时没有根据当前时间去改变&#xff09; el-datepicker 选择器禁用未来日期&#xff0c;动态禁…

重生之“我打数据结构,真的假的?”--2.单链表(无习题)

C语言中的单链表总结 单链表是一种基础的数据结构&#xff0c;广泛应用于C语言编程中。它由节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。单链表的优点在于动态内存分配和高效的插入与删除操作。本文将详细探讨单链表的定义、基本操作、应用场景以及相关示例…

Gateway 统一网关

一、初识 Gateway 1. 为什么需要网关 我们所有的服务可以让任何请求访问&#xff0c;但有些业务不是对外公开的&#xff0c;这就需要用网关来统一替我们筛选请求&#xff0c;它就像是房间的一道门&#xff0c;想进入房间就必须经过门。而请求想要访问微服务&#xff0c;就必须…

ComfyUI系列——新手安装ComfyUI,就是这么简单

比较Midjoury、WebUI和ComfyUI 在了解ComfyUI的时候&#xff0c;还有其它两款类似的产品&#xff0c;于是就搜集了一下资料&#xff0c;以下是Midjoury、WebUI&#xff08;通常指的是Stable Diffusion Web UI&#xff09;和ComfyUI三者之间的异同点对比表。 特性MidjourneySt…

国内短剧系统源码搭建系统平台小程序新玩法

在数字化内容消费日益普及的今天&#xff0c;短剧小程序作为一种新兴的内容平台&#xff0c;其功能设计至关重要。一个好的短句系统不仅需要提供优质的内容展示&#xff0c;还需要具备一系列优秀功能以满足用户和运营者的需求。以下是一些必备的功能特点&#xff1a; 为大家介…

WebGL 添加背景图

1. 纹理坐标&#xff08;st坐标&#xff09;简介 ST纹理坐标&#xff08;也称为UV坐标&#xff09;是一种二维坐标系统&#xff0c;用于在三维模型的表面上精确地定位二维纹理图像。这种坐标系统通常将纹理的左下角映射到(0,0)&#xff0c;而右上角映射到(1,1)。 S坐标&#x…

leetcode_128:最长连续序列

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&#xff1a;4 解…

CSS揭秘:7. 伪随机背景

前置知识&#xff1a;CSS 渐变&#xff0c;5. 条纹背景&#xff0c;6. 复杂的背景图案 前言 本篇主要内容依然是关于背景的&#xff0c;无限平铺的背景会显得整齐美观&#xff0c;但又有些呆板&#xff0c;如何实现背景的多样性和随机性&#xff0c;是本篇的核心。 一、四种颜…

AI周报(10.20-10.26)

AI应用-牙科AI产品Pearl Pearl是一家致力于改善牙科患者护理的人工智能驱动型公司&#xff0c;推出了首款获得美国食品药品监督管理局&#xff08;FDA&#xff09;批准的人工智能&#xff0c;能够读取牙科X光片并即时识别疾病。今年7月获得5800万美元的B轮融资&#xff0c;以加…

GESP一级真题分析-202303-选择题1-输入输出设备、存储单位、默认数据类型、标识符命名

PDF文档回复:20241026 1 相关知识点 1) 输入输出设备 输入设备 是外界向计算机传送信息的装置。在微型计算机系统中&#xff0c;最常用的输入设备是键盘和鼠标。 此外还有电子光笔、数字化仪、图形扫描仪、触摸屏、麦克风、视频输入设备、条形码扫描等 输出设备 作用是将计…

Java-图书管理系统

我的个人主页 欢迎来到我的Java图书管理系统&#xff0c;接下来让我们一同探索如何书写图书管理系统吧&#xff01; 1管理端和用户端 2建立相关的三个包&#xff08;book、operation、user&#xff09; 3建立程序入口Main类 4程序运行 1.首先图书馆管理系统分为管理员端和…

6.stm32 OLED显示屏

调试方式 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上 Keil调试模式&#xff1a;借助Keil软件的调试模式&#…

【阅读笔记】Instruction-based Hypergraph Pretraining

Abstract中可以提炼的信息&#xff1a; 背景&#xff1a;预训练的作用是为了增强图学习模型将知识从大数据集转移到下游任务的适应性。 想解决的问题&#xff1a;训练目标的不同与数据分布的不同会阻碍预训练知识的迁移。 文章受到基于指令的提示词在语言模型训练广泛应用的启发…

Vue学习笔记(四)

事件处理 我们可以使用 v-on 指令 (通常缩写为 符号) 来监听 DOM 事件&#xff0c;并在触发事件时执行一些 JavaScript。用法为 v-on:click"methodName" 或使用快捷方式 click"methodName" 事件处理器的值可以是&#xff1a; 内联事件处理器&#xff1…

鹅厂面试官:Transformer 为何需要位置编码?

最近这一两周看到不少互联网公司都已经开始秋招发放Offer。 不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球…

前端零基础入门到上班:【Day2】开发环境VSCode安装

VSCode 安装教程&#xff1a;图文保姆教程 引言 在前端开发中&#xff0c;选择合适的代码编辑器是提高工作效率的重要一步。Visual Studio Code&#xff08;简称 VSCode&#xff09;作为一款强大的开源编辑器&#xff0c;因其简洁易用、功能强大、扩展性好而广受开发者喜爱。…

【智能大数据分析 | 实验四】Spark实验:Spark Streaming

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…