基于全志D1-H的Tina Linux SPI主从通信验证实录

news/2024/11/28 6:28:23/

本文转载自:https://bbs.aw-ol.com/topic/3031
作者 @ whycan矿工-小叶

背景

  • 主控: D1H
  • 板卡: 两块哪吒开发板(以下简称为主机, 从机)
  • 操作系统: Tina Linux 2.0

问题

验证D1H芯片SPI主从机通信.

硬件接线

主机SPI从机SPI
19SPI1_MOSISPI1_MOSI19
21SPI1_MISOSPI1_MISO21
23SPI1_SCKSPI1_SCK23
24SPI1_CESPI1_CE24

SPI概述

SPI接口是一种高速的, 全双工, 同步的通信总线.
适配D1H芯片的Tina Linux的BSP-SDK(以下简称SDK)中已包含相关驱动文件: spi-sunxi.c.
它提供的了仅内核态下主从机的简易通信验证实验, 这或许是考虑到SPI通信速率比较高的特性.
验证操作

SPI主机配置

menuconfig

在SDK执行完环境变量加载后, 执行:

/mnt/tina-d1-h$ make kernel_menuconfig

●开启Device Drivers->SPI support
●进入SPI support, 按图示开启:

在这里插入图片描述

设备树

修改: ./device/config/chips/d1-h/configs/nezha/board.dts

在这里插入图片描述

需要根据手册和原理图确认好针脚功能:
在这里插入图片描述

SPI从机配置

menuconfig

(同SPI主机配置一致)

设备树

仅spi_slave_mode设为0, 其余项同SPI主机配置一致. spi_slave_mode = <0>;

SPI主机收发信息

按上述配置, 重新编译SDK, 打包, 烧录, 启动设备会出现:

root@TinaLinux# ls -l /dev/spidev1.0
crw-------    1 root     root      153,   0 Jan  1 08:00 /dev/spidev1.0

然后将可执行的SPI测试程序(./lichee/linux-5.4/tools/spi/spidev_test)挪到设备上(adb push等)并赋予可执行权限:

# 主机以10MHz发送(即MOSI)发送16进制数据: 0x01 0x02 0x03 0x04
./spidev_test -v -D /dev/spidev1.0 -s 10000000 -p "\x01\x02\x03\x04" 
# 主机以10MHz发送(即MOSI)发送ASCII字符串数据: "allwinner"
./spidev_test -v -D /dev/spidev1.0 -s 10000000 -p  "allwinner"
spi mode: 0x0
bits per word: 8
max speed: 10000000 Hz (10000 KHz)
TX | 61 6C 6C 77 69 6E 6E 65 72 __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __ __  |allwinner|

注意SPI是同步通信接口, 所以在发送的同时也会接收同样长度字节的数据.
下文将用到SPI主从通信的一种常见做法: 主机先发指令头, 然后再发指令体以获取从机应答.

SPI从机收发信息

spi-sunxi.c中对SPI从机模(SLAVE_MODE)采取了简单的收发验证处理, 具体是创建一个内核线程执行int sunxi_spi_slave_task(void *data), 该函数又被设备中断所控制(当收到SPI数据时).

  • SPI从机接收到数据的主要流程:
    sunxi_spi_slave_task() -> sunxi_spi_slave_handle_head(), 然后:
    若指令头是写操作(0x01), 则执行:sunxi_spi_slave_cpu_rx_config(), 该函数仅是输出写入内容.
    若指令投是读操作(0x03), 则执行:sunxi_spi_slave_cpu_tx_config(), 该函数仅是将收到的指令体的值+0x80, 然后发送(MISO)给主机.

  • 对于从机, spi-sunxi.c能验证SPI通信, 但没有可供用户层直接使用的方法.

用户层可验证的SPI从机收发方案

功能设计

从机安排一块32byte的内存缓存空间(简称"缓存空间")供主机通过指令进行读操作和写操作, 且从机能在用户层对该内存空间访问.

主要改动

  • spi.c:
    • 增加static struct class_attribute ye_spi_buf_attrs[], 以创建/sys/class/spi_slave目录下的spi_buf文件, 并提供实现了读/写缓存空间的方法.
  • spi-sunxi.c:
    • 使用ye_spi_slave_set_txdata()方法替换sunxi_spi_slave_set_txdata(), 以实现读操作.
    • 修改sunxi_spi_slave_cpu_rx_config()方法, 以实现写操作.

改动详情请查看: d1h_spi_driver.diff

使用方法

写操作: 操作:0x01(写) 地址:0x00 0x00 0x00 指令体长度:0x09
./spidev_test -v -D /dev/spidev1.0 -s 10000000 -p "\x01\x00\x00\x00\x09" && \
./spidev_test -v -D /dev/spidev1.0 -s 10000000 -p  "allwinner"读操作: 操作:0x03(读) 地址:0x00 0x00 0x00 指令体长度:0x09
./spidev_test -v -D /dev/spidev1.0 -s 10000000 -p "\x03\x00\x00\x00\x09" && \
./spidev_test -v -D /dev/spidev1.0 -s 10000000 -p  "\x00\x00\x00\x00\x00\x00\x00\x00\x00"从机读取缓存空间:
cat /sys/class/spi_slave/spi_buf从机写入缓存空间:
echo "Hello world" > /sys/class/spi_slave/spi_buf

http://www.ppmy.cn/news/83691.html

相关文章

要不要提前去实习?

大家好&#xff0c;我是帅地。 秋招结束&#xff0c;很多人在纠结要不要提前去公司实习&#xff0c;最近也有一些帅友问了这个问题 说说我去年在腾讯实习的经历给你做个参考吧。 入职前的学习 20年初那会&#xff0c;还是蛮激动&#xff0c;之前我从来没有去打过工&#xff…

SpringBoot JDBC连接数据库项目代码构建

本期引言&#xff1a; 本文将介绍如何使用SpringBoot框架构建一个简单的JDBC连接数据库项目。在这个项目中&#xff0c;我们将使用MySQL作为数据库&#xff0c;通过SpringBoot框架实现数据的增删改查操作。本文将涵盖以下内容&#xff1a; 配置项目所需的环境和工具创建Sprin…

Plc能否通过以太网网关实现无线数据交互?

西门子S7-1200 PLC 使用Profinet通讯时&#xff0c;一个做Profinet IO控制器&#xff0c;一个做Profinet IO设备。一个Profinet IO控制器可以最多支持16个Profinet IO设备&#xff0c;Profinet通讯不使用通讯指令&#xff0c;只需要配置好数据传输地址&#xff0c;就能够实现数…

数据结构中常见的树

二叉树&#xff1a;每个子节点只有两个节点的树&#xff0c;每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结 点)&#xff0c;并且&#xff0c;二叉树的子树有左右之分&#xff0c;其次序不能任意颠倒 我们一般在解题过程中二叉树有两种主要的形式&#xff1a;满二叉树…

【从零开始写视觉SLAM】v0.1基于特征点的简单VO

v0.1版本的oSLAM实现了基于orb特征点的简单视觉里程计&#xff0c;通过连续两帧的rgbd数据实现相机相对位姿的估计。 #mermaid-svg-ibQfHFVHezQD5RWW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ibQfHFVHezQD5RW…

字段信息 详解,以易举例,创建数据库,程序自动创建数据库的前提,程序读写数据库的第一步

今天要做一个处理比较多数据的工具&#xff0c;就是桌面小软件&#xff0c;重新收拾起以前的易语言来编写&#xff0c;C#等也可以&#xff0c;反正就是最后的成品是绿色免安装。 数据多&#xff0c;优先考虑的就是数据库操作了&#xff0c;又快又好是吧&#xff1f; 第一步&am…

遍历 globals() 时必不可少的 RuntimeError

文章目录 参考描述globals() 函数For Loop 过程中产生的迭代变量Runtime Errordictionary changed size during iteration异常产生原因解决方案copy 方法绕过 RuntimeError 产生 RuntimeError 异常的基本要求遍历 locals() 时可能产生的 RuntimeError 参考 项目描述Python 官方…

HR不会告诉你!Java程序员月薪8K和20K的区别!

昨天有同学问好程序员&#xff0c;为啥都是干Java程序员&#xff0c;别人可以拿20k&#xff0c;我才拿8k呢&#xff1f;为啥人家能提前转正我就得晚俩月&#xff1f;小源一听大事不妙&#xff0c;赶紧连夜整理了以下清单供大家check&#xff01; 对于刚入职场还有跳槽成功的同学…