首页 > 系统相关 >基于全志D1-H的Tina Linux SPI主从通信验证实录

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

时间:2023-05-22 10:32:00浏览次数:59  
标签:__ slave spi 全志 SPI 从机 Tina x00

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

背景

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

问题

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

硬件接线

主机SPI 从机SPI
19 SPI1_MOSI SPI1_MOSI 19
21 SPI1_MISO SPI1_MISO 21
23 SPI1_SCK SPI1_SCK 23
24 SPI1_CE SPI1_CE 24

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

标签:__,slave,spi,全志,SPI,从机,Tina,x00
From: https://blog.51cto.com/u_15380233/6321211

相关文章

  • linux(RK3308)添加CH9434(SPI串口扩展)驱动
    linux(RK3308)添加CH9434(SPI串口扩展)驱动1、CH9434驱动下载https://www.wch.cn/downloads/CH9434EVT_ZIP.html2、驱动移植2.1、移植准备1、查看系统是否支持DTS设备树支持,若支持DTS可以直接在DTS文件中定义SPI节点。如下所示:&spi2{status="okay";max-freq=<500......
  • idea启动spingboot项目一直在build中
    在本地启动项目时,会一直build,然后就百度查了下,看了下这个帖子写的内容 https://www.cnblogs.com/tysk/p/10859594.html,反正就是重启电脑也不行,重新拉项目也不行。重启idea也不太行我的情况可能也是在springboot项目的类上写了个main方法测试,然后run运行,后面可能是进程还没退出完......
  • Android 动态改变 navigation 的 startDestination, 使得已登录的用户直接跳过 LoginF
    需求:未登录用户打开App,会展示登录页面LoginFragment已登录用户打开App,直接展示MainFragmentnav_graph.xml结构如下:MainActivity.java:@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);......
  • Python的gma包计算标准化降水指数SPI
    采用干旱气象指标的气象干旱综合指数MCI时因公式要涉及标准化降水指数SPI,故需要先进行SPI的计算: SPI的计算依赖python里的包gma,安装方法参考: https://blog.csdn.net/weixin_42155937/article/details/121023363 原始数据是每个月的降水数据: python计算SPI代码如下:......
  • Istio 目标规则 (Destination Rule)
                DestinationRule还可以做什么通常在生产场景下,用使用DestinationRule对用户进行身份、地址位置等条件的识别后的流量路由,例如部分用户优先享用新版本,则可以通过HTTPHeader附加相关的字段进行识别,路由到新版本的服务上。或者在版本......
  • Java中String.spilt()方法的使用
    1、Java中可以使用String.spilt()方法按照指定的分隔符将字符串进行分割,然后返回字符串。2、测试demo:     ......
  • 博学谷学习记录 自我总结 用心分享 | Dubbo SPI机制
    SPI简介SPI全称为ServiceProviderInterface,是一种服务发现机制,刚好与javajdk的类加载机制进行了一个互补。SPI的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口替换实现类。正因此特性,我们可以很容易......
  • 问题解决:TNS-12543: TNS:destination host unreachable
    环境:11.2.0.3ADG(db11g\db11gadg\db11gcas)在自己先前克隆后的环境互相tnsping报错。tnsping本机ok,tnsping其他机器均报错:[oracle@db11g~]$tnspingjingyuTNSPingUtilityforLinux:Version11.2.0.3.0-Productionon13-MAY-202308:09:11Copyright(c)1997,......
  • FPGA以SPI模式读写SD卡,已经下板验证通过。 可移植到任何FP
    FPGA以SPI模式读写SD卡,已经下板验证通过。可移植到任何FPGA之中。ID:85100653023033019......
  • SPI机制
    SPI机制SPI(ServiceProviderInterface),主要适用于扩展作用,SPI可以很灵活的让接口和实现分离,让api提供者只提供接口,第三方来实现,然后可以使用配置文件的方式来实现替换或者扩展,在框架中比较常见,提高框架的可扩展性。JDK的SPI机制-ServiceLoaderServiceLoader是Java提供的一种......