RK3568笔记五十:SPI通信-回环测试

news2024/9/24 5:32:49

若该文为原创文章,转载请注明原文出处。

一、SPI引脚关系

其中SPI1的引脚关系如下表所示

SPI

引脚

功能

MOSI

GPIO3_C1

主设备输出/从设备输入

MISO

GPIO3_C2

主设备输入/从设备输出

CLOCK

CPIO3_C3

时钟信号线

CS0

GPIO3_A1

片选信号线0

CS1

NC

片选信号线1

二、内核和设备树配置

正点原子的内核已经配置了SPI设备驱动,可以不在配置内核但需要配置设备树。

为了学习和了解,还是要知道SPI设备驱动内核是如何配置的。

1、内核支持

进入kenel目录,make menuconfig

具体路径如下所示:

> Device Drivers

 > SPI support

2、设备树配置

修改/home/alientek/rk3568_linux_sdk/kernel/arch/arm64/boot/dts/rockchip/目录下的rk3568-atk-evb1-ddr4-v10.dtsi文件,在文件末添加代码,在spi1设备树下添加w25q64节点。

&spi1 {
	status = "okay";
	pinctrl-0 = <&spi1m1_cs0 &spi1m1_pins>;
	pinctrl-1 = <&spi1m1_cs0 &spi1m1_pins_hs>;
	
		  
	// 向 spi1 节点追加 w25q64 设备节点
	w25q64: w25q64@0 {
		compatible = "rockchip,spidev";
		reg = <0>;  // 设置 reg 属性为 0, 表示 spi 连接到 spi1 的通道 0
		spi-max-frequency = <24000000>;  // 设置 SPI 传输的最大频率
		status = "okay";
	};
};

和上一篇有点区别,上一篇的compatible是自己写的,驱动需要自己编写,这里使用内核自带的,所以改成内核支持的,在linux/drivers/spi/spidev.c 可以看出是rockchip,spidev.

修改完成以后,重新编译一下内核,并烧写boot.img文件

重启板子后,查询,可以看到spidev1.0,其中1是spi1,0是cs0

三、回环测试

1、接线

根据ioctl相关参数即可编写spi相关测试程序,为了简单仅做回环测试实验, 只需要将SPI1的 MIOS与MOSI引脚使用跳线帽短接即可。即7和9短路。

2、测试程序

#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <linux/spi/spidev.h>

#define SPI_DEV_PATH "/dev/spidev1.0"

/*SPI 接收 、发送 缓冲区*/
unsigned char tx_buffer[100] = "hello the world !";
unsigned char rx_buffer[100];


int fd;                  					// SPI 控制引脚的设备文件描述符
static unsigned  mode = SPI_MODE_2;         //用于保存 SPI 工作模式
static uint8_t bits = 8;        			// 接收、发送数据位数
static uint32_t speed = 10000000; 			// 发送速度
static uint16_t delay;          			//保存延时时间

void transfer(int fd, uint8_t const *tx, uint8_t const *rx, size_t len)
{
  	int ret;

  	struct spi_ioc_transfer tr = {
      	.tx_buf = (unsigned long)tx,
      	.rx_buf = (unsigned long)rx,
      	.len = len,
      	.delay_usecs = delay,
      	.speed_hz = speed,
      	.bits_per_word = bits,
      	.tx_nbits = 1,
      	.rx_nbits = 1
  	};

  	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
  	if (ret < 1)
  	  	printf("can't send spi message\n");
}

void spi_init(int fd)
{
  	int ret = 0;

	// spi mode 设置SPI 工作模式
  	ret = ioctl(fd, SPI_IOC_WR_MODE32, &mode);
  	if (ret == -1)
  	  	printf("can't set spi mode\n");

	//  bits per word  设置一个字节的位数
  	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
  	if (ret == -1)
    	printf("can't set bits per word\n");

	//  max speed hz  设置SPI 最高工作频率
  	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
  	if (ret == -1)
    	printf("can't set max speed hz\n");

	// 打印
   	printf("spi mode: 0x%x\n", mode);
    printf("bits per word: %d\n", bits);
    printf("max speed: %d Hz (%d KHz)\n", speed, speed / 1000);
}

int main(int argc, char *argv[])
{
	int fd;
	
	if(argc < 2){
    printf("Wrong use !!!!\n");
        printf("Usage: %s [dev]\n",argv[0]);
        return -1;
    }
	/*打开 SPI 设备*/
    fd = open(argv[1], O_RDWR); // open file and enable read and  write
    if (fd < 0){
        printf("Can't open %s \n",argv[1]); // open i2c dev file fail
        exit(1);
    }

	/*初始化SPI */
	spi_init(fd);

	/*执行发送*/
	transfer(fd, tx_buffer, rx_buffer, sizeof(tx_buffer));

	/*打印 tx_buffer 和 rx_buffer*/
	printf("tx_buffer: \n %s\n ", tx_buffer);
	printf("rx_buffer: \n %s\n ", rx_buffer);

	close(fd);

	return 0;
}

编译

/opt/atk-dlrk356x-toolchain/bin/aarch64-buildroot-linux-gnu-gcc spi_selftest.c -o spi_selftest

在板子上运行测试:

 ./spi_selftest /dev/spidev1.0

此实验弥补了上一篇的遗憾,接下来编写W25Q64的测试程序,使用SPI测试,另GPIO模拟SPI要怎么处理?

如有侵权,或需要完整代码,请及时联系博主。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

kettle从入门到精通 第八十二课 ETL之kettle kettle中的【阻塞数据直到步骤都完成】使用教程

1、在使用步骤【阻塞数据直到步骤都完成】&#xff08;英文为Block this step until steps finish&#xff09;之前&#xff0c;我们先来了解下什么是 Copy Nr&#xff1f; Copy Nr是指 “副本编号” 或 “拷贝编号”&#xff0c;也就是下图中的复制的记录行数&#xff0c;图中…

全网最强Nginx教程 | 万字长文爆肝Nginx(五)

Nginx实现服务器端集群搭建 Nginx与Tomcat部署 前面课程已经将Nginx的大部分内容进行了讲解&#xff0c;我们都知道了Nginx在高并发场景和处理静态资源是非常高性能的&#xff0c;但是在实际项目中除了静态资源还有就是后台业务代码模块&#xff0c;一般后台业务都会被部署在…

基于Spring boot + Vue的灾难救援系统

作者的B站地址&#xff1a;程序员云翼的个人空间-程序员云翼个人主页-哔哩哔哩视频 csdn地址&#xff1a;程序员云翼-CSDN博客 1.项目技术栈&#xff1a; 前后端分离的项目 后端&#xff1a;Springboot MybatisPlus 前端&#xff1a;Vue ElementUI 数据库&#xff1a; …

Java 关键字之 native 详解

本篇博客我们将介绍Java中的一个关键字——native。 native 关键字在 JDK 源码中很多类中都有&#xff0c;在 Object.java类中&#xff0c;其 getClass() 方法、hashCode()方法、clone() 方法等等都是用 native 关键字修饰的。 那么为什么要用 native 来修饰方法&#xff0c;…

离线安装MeterSphere遇到的问题

1.安装步骤&#xff0c;参考官方文档 在线安装 - MeterSphere 文档 2.安装完成以后&#xff0c;docker ps查看有很多服务一直处于重启状态&#xff0c;查看容器日志docker logs ID,发现所有一直处于重启状态的容器都是因为服务无法创建日志目录和文件。一直处于重启的服务如…

【Java基础题型】矩阵的对角线之和

二维数组真是存矩阵的好东西啊&#xff0c;现在问题来了&#xff0c;输入一个5*5一共25个数字&#xff0c;要求你求出它们两个对角线上的数字之和&#xff01; 输入格式 25个数字&#xff0c;5行5列 输出格式 它们两个对角线上的和 左上->右下第一条 右上->左下第二…

【秋招笔试】24-07-27-OPPO-秋招笔试题(后端卷)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡 01.二进制反转游戏 问题描述 K小姐…

Nvidia黄仁勋对话Meta扎克伯格:AI和下一代计算平台的未来 | SIGGRAPH 2024对谈回顾

在今年的SIGGRAPH图形大会上&#xff0c;Nvidia创始人兼CEO黄仁勋与Meta创始人马克扎克伯格进行了一场长达60分钟的对谈。这场对话不仅讨论了AI的未来发展和Meta的开源哲学&#xff0c;还发布了不少新产品&#xff0c;并深入探讨了下一代计算平台的可能性。 引言 人工智能的发…

InternLM-L0 Git作业

0. 任务背景 GitInternStudio 任务说明 GitInternStudio 关卡说明 任务1: 破冰活动&#xff1a;自我介绍 任务2: 实践项目&#xff1a;构建个人项目 1. 破冰活动并构建个人branch Fork 目标项目 git clone https://github.com/sd258sos/Tutorial.git # 修改为自己frok的仓…

模拟实现strcmp,判断二个字符串是否相等

1.判断二个字符串是否相等&#xff0c;可以模仿strcmp.当二个字符串相等的时候ruturn 0.,当二个字符串小于时返回为小于0&#xff0c;当二个字符串大于时返回为大于0。const为不可以更改。 //方法一 int my_strcmp(const char* arr1, const char* arr2) {assert(arr1 &&…

Java后端每日面试题(day6)

目录 创建线程的方式锁的分类公平锁与非公平锁共享式与独占式锁悲观锁与乐观锁 rbac相关的表spring security原理DelegatingFilterProxyFilterChainProxySecurityFilterChain<font colorred>Spring Security 作用机制大致如下&#xff1a; mybatis一对一&#xff0c;一对…

AttributeError: module ‘jwt‘ has no attribute ‘decode‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【大数据】什么是数据集市?如何创建数据集市?

目录 一、数据集市的定义 二、数据集市的存在方式 三、数据集市的特点 四、数据集市和数仓的关系 五、数据集市建设步骤 一、数据集市的定义 数据仓库中集成后的数据&#xff0c;又按照了主题进行了划分&#xff0c;而面向主题划分出来的部分就是数据集市&#xff0c;也就是说数…

织物图像的配准和拼接算法的MATLAB仿真,对比SIFT,SURF以及KAZE

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 SIFT (Scale-Invariant Feature Transform) 4.2 SURF (Speeded Up Robust Features) 4.3 KAZE (Key-point Affine-Zernike descriptors) 5.算法完整程序工程 1.算法运行效果图预览 (…

python家教预约管理系统 python+django+vue开发的家教信息管理系统 - 毕业设计 - 课程设计

python家教预约管理系统 pythondjangovue开发的家教信息管理系统 - 毕业设计 - 课程设计 文章目录 python家教预约管理系统 pythondjangovue开发的家教信息管理系统 - 毕业设计 - 课程设计一、功能介绍二、代码结构三、运行步骤1、后端运行步骤3、前端运行步骤 四、源程序下载 …

69.搭建分析工具界面

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;易道云信息技术研究院 上一个内容&#xff1a;68.游戏分析工具设计以及更改辅助中存在的界面问题 以 68.游戏分析工具设计以及更改辅助…

【Dash】简单的直方图

一、Visualizing Data The Plotly graphing library has more than 50 chart types to choose from. In this example, we will make use of the histogram chart. # Import packages from dash import Dash, html, dash_table, dcc import pandas as pd import plotly.expre…

ASUS/华硕幻14 2022 GA402R系列 原厂win11系统 工厂文件 带F12 ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数)

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件&#xff08;qInstallMessageHandler回调函数&#xff09; 文章目录 Log输出方式qInstallMessageHandler回调函数线程安全textEdit控件附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发…

银行数据质量保障体系建设实践

引言 在数字化转型浪潮中&#xff0c;数据中台成为企业实现数据驱动决策的关键支撑。它不仅整合了企业内外部的数据资源&#xff0c;还通过数据共享与复用&#xff0c;提升了运营效率和业务创新能力。然而&#xff0c;随着数据量的激增和数据来源的多样化&#xff0c;如何确保…