挖掘全志Tina Linux下SPI主从通信验证模块的秘密
- 主控: 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

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
无代码可视化开源爬虫软件EasySpider,希望能帮到大家
软件介绍 EasySpider是一款完全免费和开源的可视化爬虫软件,此软件可以让大家使用图形化界面,无代码可视化的设计和执行爬虫任务。只需要在网页上选择自己想要爬的内容并根据提示框操作即可完成爬虫设计和执行。同时软件还可以直接在命令行中通过传参的方式执行,从而可以很方便的嵌入到其他系统中。 V0.3.0版本新增的功能,包括下载图片,元素截图, 执行任意JS指令和系统命令, 通过JS代码进行条件判断,OCR识别等等功能,想要的功能应有尽有,而且这些功能 完全免费!!! 以下是示例界面: 相关链接 代码仓库 Github仓库地址,欢迎大家Star: https://github.com/NaiboWang/EasySpider 下载 EasySpider 进入Releases Page:https://github.com/NaiboWang/EasySpider/releases 下载最新版本。 视频教程 1. EasySpider介绍 - 中国地震台网采集案例:https://www.bilibili.com/video/BV1Fk4y1L7xX/ 2. 如何无代码可视化的爬取...
- 下一篇
走在技术前沿,百度将亮相 GOTC 2023
全球开源技术峰会(Global Open-source Technology Conference) GOTC 2023 由开放原子开源基金会、 Linux 基金会亚太区、上海浦东软件园和开源中国联合发起, 将于 5 月 27 日至 28 日在上海张江科学会堂隆重举行。 这场面向全球开发者的盛大开源技术盛宴,堪称 2023 年开源风向标。大会将以行业展览、主题发言、专题论坛、开源市集的形式展现,与会者将一起探讨元宇宙、3D 与游戏、eBPF、Web3.0、区块链等热门技术主题,以及开源社区、AIGC、汽车软件、AI 编程、开源教育培训、云原生等热门话题,探讨开源未来,助力开源发展。 其中,百度成为了 GOTC 2023 的钻石赞助商。一直以来,百度致力于开源技术生态的建设,通过开源项目的推广和贡献,吸引全球开发者参与,共同推动技术的发展。GOTC 2023 报名通道现已开启: https://www.bagevent.com/event/8387611 截至 2022 年底,百度已经开源了超过 1000 个项目,社区贡献者超过 20,000 人,技术涵盖了机器学习、自动驾驶、区...
相关文章
文章评论
共有0条评论来说两句吧...