ArmSom---SPI开发指南

这篇具有很好参考价值的文章主要介绍了ArmSom---SPI开发指南。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 简介

  • RK3588从入门到精通
  • 本⽂主要介绍在Rockchip平台配置spi接口并且使用的方法
  • 开发板:ArmSoM-W3
  • Kernel:5.10.160
  • OS:Debian11

2. SPI接口概述

SPI(Serial Peripheral Interface),即串行外围设备接口,是一种同步的,全双工的,多设备的,多主机的通信协议,用于连接外围设备,如ADC、DAC、数据存储器、定时器、接受器等。

2.1 spi接口的结构

ArmSom---SPI开发指南,RK3588从入门到精通,驱动开发,开源,arm开发,spi

  1. 主机:主机是SPI总线的控制者,它负责控制数据传输的方向和传输速度。
  2. 从机:从机是SPI总线的被控制者,它根据主机发出的指令,发出或接收数据。
  3. MOSI(Master Out Slave In):主机输出从机输入,用于传输从主机到从机的数据。
  4. MISO(Master In Slave Out):主机输入从机输出,用于传输从从机到主机的数据。
  5. CK(Serial Clock):时钟线,用于同步主机和从机之间的数据传输。
  6. CS(Chip Select):片选线,用于控制主机和从机之间的数据传输。

此外,SPI接口还有其他可选项,如中断线(INT)、复位线(RESET)等。

2.2 SPI接口的工作原理

在SPI接口通信过程中,主机发出一个片选信号,然后在时钟信号的控制下,主机发出一个字节的数据,从机接收到数据之后,也会发出一个字节的数据,主机接收到数据之后,发出一个片选信号,结束一次通信。

SPI接口有两种工作模式:主模式和从模式。主模式下,主机控制从机,从机接收主机发出的指令。从模式下,从机可以接收主机发出的指令,并向主机发送数据。

3.SPI硬件接口

RK3588旗舰芯片上可使用的spi接口有5组,ArmSoM SOM-3588-LGA核心板采用LGA 506引脚封装方式将spi资源全部引出,ArmSoM-W3开发板上40PIN引脚中有两组spi接口:

ArmSom---SPI开发指南,RK3588从入门到精通,驱动开发,开源,arm开发,spi

4.spi设备配置

spi驱动相关代码路径:

drivers/spi/spi.c spi驱动框架
drivers/spi/spi-rockchip.c rk spi各接口实现
drivers/spi/spidev.c 创建spi设备节点,用户态使用。
drivers/spi/spi-rockchip-test.c spi测试驱动,需要自己手动添加到Makefile编译
Documentation/spi/spidev_test.c 用户态spi测试工具

4.1 配置 DTS 节点

&spi1 {
	status = "okay";
	//assigned-clock-rates = <200000000>; //默认不用配置,SPI 设备工作时钟
	max-freq = <48000000>; /* spi internal clk, don't modify */
	//dma-names = "tx","rx"; //使能DMA模式
	//rx-sample-delay-ns = <10>; //默认不用配置,读采样延时
	spi_dev@0 {
		compatible = "rockchip,spidev";
		reg = <0>;
		spi-max-frequency = <12000000>;
		spi-lsb-first; //IO 先传输 lsb		
	};
};
  • status:如果要启用 SPI,则设为 okay,如不启用,设为 disable。

  • spi_dev@0:本例子使用 CS0,故此处设为 0,如果使用 CS1,则设为 1。

  • compatible:这里的属性必须与驱动中的结构体:of_device_id 中的成员 compatible 保持一致。

  • reg:此处与 spi_dev@0 保持一致,这里设为0。

  • spi-max-frequency:此处设置 spi 使用的最高频率,ITX-3588J 最高支持 50000000。

这里使用的驱动是drivers/spi/spidev.c,驱动设备加载注册成功后,会出现类似这个名字的设备:/dev/spidev1.0。

一些常见的SPI驱动API接口:

Linux SPI API:

  • spi_register_driver():注册SPI设备驱动程序。
  • spi_unregister_driver():注销SPI设备驱动程序。
  • spi_setup():设置SPI总线和设备的参数。
  • spi_sync():同步方式进行SPI数据传输。
  • spi_message_init():初始化SPI消息结构。
  • spi_message_add_tail():向SPI消息添加传输操作。
  • spi_sync():同步方式进行SPI数据传输。
  • spi_transfer():进行SPI数据传输。

SPI驱动中常用的ioctl请求值,这些请求值用于设置和读取SPI设备的各种参数,包括通信模式、字长、数据模式和通信速率等。这些请求值通常用于Linux的SPI驱动编程。以下是一些常用的SPI ioctl请求值:

  • SPI_IOC_RD_MODE: 读取SPI设备的通信模式。
  • SPI_IOC_WR_MODE: 设置SPI设备的通信模式。
  • SPI_IOC_RD_MODE32: 读取SPI设备的32位通信模式。
  • SPI_IOC_WR_MODE32: 设置SPI设备的32位通信模式。
  • SPI_IOC_RD_LSB_FIRST: 读取SPI设备的LSB(Least Significant Bit)优先模式。
  • SPI_IOC_WR_LSB_FIRST: 设置SPI设备的LSB优先模式。
  • SPI_IOC_RD_BITS_PER_WORD: 读取SPI设备的字长。
  • SPI_IOC_WR_BITS_PER_WORD: 设置SPI设备的字长。
  • SPI_IOC_RD_MAX_SPEED_HZ: 读取SPI设备的最大通信速率。
  • SPI_IOC_WR_MAX_SPEED_HZ: 设置SPI设备的最大通信速率。
  • SPI_IOC_MESSAGE(N): 一次进行N次双向或多次读写操作。

4.2 SPI测试实验

将上述设备树以及驱动修改之后更新板卡的内核,通过SPI设备文件来判断spi驱动是否加载成功

这里测试使用的是spi1这一组spi相关接口,检查spi设备:

root@linaro-alip:~# ls /dev/spi*
/dev/spidev1.0	
root@linaro-alip:~# 

测试SPI接口,使用/dev/spidev1.0设备节点,实现短接MOSI和MISO线路以自发自收数据,同时在未短接时报告错误

4.2.1 硬件连接

将SPI1的 MIOS与MOSI引脚(板卡上的7和8)短接即可,如下图所示
ArmSom---SPI开发指南,RK3588从入门到精通,驱动开发,开源,arm开发,spi

4.2.2 测试程序

用户应用层使用spidev驱动的步骤如下:

  1. 打开SPI设备文件:用户可以通过打开/dev/spidevX.Y文件来访问SPI设备,其中X是SPI控制器的编号,Y是SPI设备的编号。

  2. 配置SPI参数:用户可以使用ioctl命令SPI_IOC_WR_MODE、SPI_IOC_WR_BITS_PER_WORD和SPI_IOC_WR_MAX_SPEED_HZ来设置SPI模式、数据位数和时钟速度等参数。

  3. 发送和接收数据:用户可以使用read和write系统调用来发送和接收SPI数据。写入的数据将被传输到SPI设备,而从设备读取的数据将被存储在用户提供的缓冲区中。

  4. 关闭SPI设备文件:当不再需要与SPI设备通信时,用户应该关闭SPI设备文件。

总结起来,spidev驱动提供了一种简单而灵活的方式来与SPI设备进行通信,使得用户可以轻松地在Linux系统上开发和控制SPI设备。

armsom团队 的测试程序spi_test.c如下:

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

#define SPI_DEV_PATH "/dev/spidev1.0"

int fd;
static unsigned mode = SPI_MODE_0;
static uint8_t bits = 8;
static uint32_t speed = 1000000; // 设置SPI速度为1MHz
static uint16_t delay;

void transfer(int fd, uint8_t const *tx, uint8_t *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,
        .cs_change = 0, // 设置为1以在每次传输前切换片选,这里不切换片选
    };

    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);

    if (ret < 1) {
        perror("SPI transfer failed");
    }
}

void spi_init(void)
{
    int ret;
    // 打开 SPI 设备
    fd = open(SPI_DEV_PATH, O_RDWR);
    if (fd < 0) {
        perror("Can't open SPI device");
        exit(1);
    }

    // 设置 SPI 工作模式
    ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
    if (ret == -1) {
        perror("Can't set SPI mode");
        exit(1);
    }

    // 设置位数
    ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
    if (ret == -1) {
        perror("Can't set bits per word");
        exit(1);
    }

    // 设置SPI速度
    ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
    if (ret == -1) {
        perror("Can't set max speed");
        exit(1);
    }

    // 打印设置
    printf("SPI mode: 0x%x\n", mode);
    printf("Bits per word: %d\n", bits);
    printf("Max speed: %d Hz\n", speed);
}

int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("Usage: %s <string_to_send>\n", argv[0]);
        return 1;
    }

    char *tx_buffer = argv[1]; // 获取要发送的字符串作为命令行参数

    // 初始化SPI接口
    spi_init();

    // 设置要接收数据的缓冲区
    unsigned char rx_buffer[strlen(tx_buffer) + 1];

    // 执行SPI数据传输
    transfer(fd, tx_buffer, rx_buffer, strlen(tx_buffer));

    // 打印发送和接收的数据
    printf("Sent: %s\n", tx_buffer);
    printf("Received: %s\n", rx_buffer);

    // 关闭SPI设备
    close(fd);

    return 0;
}

4.2.3 编译&运行

开发板上下载gcc编译器:

apt upgrade
apt update
apt install gcc

编译:

gcc spi_test.c -o spi

短接与不短接的运行情况如下:

ArmSom---SPI开发指南,RK3588从入门到精通,驱动开发,开源,arm开发,spi文章来源地址https://www.toymoban.com/news/detail-745746.html

到了这里,关于ArmSom---SPI开发指南的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ArmSoM-W3(RK3588)之调试UART

    专栏总目录 本文主要讲解如何关于RK3588开发板UART的使用和调试方法,包括UART作为普通串口和控制台两种不同使用场景 Rockchip UART (Universal Asynchronous Receiver/Transmitter) 基于16550A串口标准,完整模块支持以下功能: 支持5、6、7、8 bits数据位。 支持1、1.5、2 bits停止位。 支持奇校

    2024年02月10日
    浏览(31)
  • ArmSoM-W3之RK3588 - ES8388音频调试笔记

    专栏总目录 本文是基于RK3588平台,音频芯片ES8388调试总结。 外接声卡:ES8388 步骤 ① dts配置 步骤 ② 编译烧写,调试 系统声音配置: ES8388设备驱动配置 查看声卡命令: cat /proc/asound/cards 将wav文件拷贝到板子上: RK Android 播放音乐 ( RK Android SDK 标配 tiny-alsa 工具 ): RK Android

    2024年02月12日
    浏览(116)
  • ArmSoM-W3之RK3588调试imx415摄像头

    [RK3588从入门到精通] 专栏总目录 soc:rk3588 sensor:imx415 board: ArmSoM-W3 linux:5.10 品牌:SONY 型号:IMX415 接口:MIPI CSI 瑞芯微支持的摄像头,有个support list, 此次从该list中选择了IMX415 RK提供的默认sdk里面已经将支持的所有摄像头驱动都添加到了内核,所以不需要移植该驱动了。

    2024年02月13日
    浏览(35)
  • RK3588平台产测之ArmSoM-W3 DDR压力测试

    RK3588从入门到精通 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:Arm

    2024年02月09日
    浏览(36)
  • RK3588之ArmSoM-W3 + MPP实现多路硬解码拉流

    学习完MPP的解码Demo之后,想必大家都想通过一个项目来进行RK3588-MPP的解码实战。 本篇文章就基于ArmSoM-W3开发板,开发一个多路硬解码项目,实现四路MPP硬解码拉流显示 实现的效果如下: RK3588四路MPP硬解码拉流 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:ArmSoM-W3 Debian11

    2024年02月06日
    浏览(43)
  • RK3588平台产测之ArmSoM-W3软硬件重启测试

    专栏总目录 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力测试才能够经得起市场的检验 软件方式重启系统3000次测试 硬件电源拔插重启3000次测试

    2024年02月08日
    浏览(37)
  • ArmSoM-W3之RK3588-MPP实现多路硬解码拉流

    学习完MPP的解码Demo之后,想必大家都想通过一个项目来进行RK3588-MPP的解码实战。 本篇文章就基于ArmSoM-W3开发板,开发一个多路硬解码项目,实现四路MPP硬解码拉流显示 实现的效果如下: RK3588四路MPP硬解码拉流 硬件环境: ArmSoM-W3 RK3588开发板 软件版本: OS:ArmSoM-W3 Debian11

    2024年02月05日
    浏览(39)
  • 迅为RK3568开发板驱动开发指南-输入子系统

    《iTOP-RK3568开发板驱动开发指南》 更新,本次更新内容对应的是驱动 (第十三篇 输入子系统) 视频,帮助用户快速入门,大大提升研发速度。 第13篇-输入子系统 目录 第1篇 驱动基础篇 第2篇 字符设备基础 第3篇 并发与竞争 第4篇 高级字符设备进阶 第5篇 中断 第6篇 平台总

    2024年03月26日
    浏览(35)
  • ArmSoM-W3之RK3588安装Qt+opencv+采集摄像头画面

    [RK3588从入门到精通] 专栏总目录 场景:在RK3588上做qt开发工作 RK3588安装Qt+opencv+采集摄像头画面 硬件环境: ArmSoM-W3 RK3588开发板、MIPI-CSI摄像头( ArmSoM官方配件 ) 软件版本: OS:ArmSoM-W3 Debian11 QT:QT5.15.2(Qt Creator:4.11.0) OpenCV:3.4.14 RK3588开发板联网,确认好是否能访问网络

    2024年02月14日
    浏览(43)
  • Linux SPI-NAND 驱动开发指南

    1.1 编写目的 介绍 Sunxi SPINand mtd/ubi 驱动设计, 方便相关驱动和应用开发人员 1.2 适用范围 本设计适用于所有 sunxi 平台 1.3 相关人员 Nand 模块开发人员,及应用开发人员等 2 术语、缩略语及概念 MTD :(Memory Technology device)是用于访问存储设备的 linux 子系统。本模块是MTD 子系统

    2024年02月04日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包