树莓派 python spi,树莓派测试SPI-基于设备操作ioctl
用于测试树莓派的SPI接口是否正常工作,代码来自于
https://raw.githubusercontent.com/raspberrypi/Linux/rpi-3.10.y/Documentation/spi/spidev_test.c
测试方法参考自:http://louisthiery.com/spi-Python-hardware-spi-for-raspi/
/*
* SPI testing utility (using spidev driver)
*
* Copyright (c) 2007 MontaVista Software, Inc.
* Copyright (c) 2007 Anton Vorontsov
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* Cross-compile with cross-gcc -I/path/to/cross-kernel/include
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
static void pabort(const char *s)
{
perror(s);
abort();
}
static const char *device = "/dev/spidev1.1";
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay;
static void transfer(int fd)
{
int ret;
uint8_t tx[] = {
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
0xF0, 0x0D,
};
uint8_t rx[ARRAY_SIZE(tx)] = {0, };
struct spi_ioc_transfer tr = {
.tx_buf = (unsigned long)tx,
.rx_buf = (unsigned long)rx,
.len = ARRAY_SIZE(tx),
.delay_usecs = delay,
.speed_hz = speed,
.bits_per_word = bits,
};
ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
if (ret
pabort("can't send spi message");
for (ret = 0; ret
if (!(ret % 6))
puts("");
printf("%.2X ", rx[ret]);
}
puts("");
}
static void print_usage(const char *prog)
{
printf("Usage: %s [-DsbdlHOLC3]\n", prog);
puts(" -D --device device to use (default /dev/spidev1.1)\n"
" -s --speed max speed (Hz)\n"
" -d --delay delay (usec)\n"
" -b --bpw bits per word \n"
" -l --loop loopback\n"
" -H --cpha clock phase\n"
" -O --cpol clock polarity\n"
" -L --lsb least significant bit first\n"
" -C --cs-high chip select active high\n"
" -3 --3wire SI/SO signals shared\n");
exit(1);
}
static void parse_opts(int argc, char *argv[])
{
while (1) {
static const struct option lopts[] = {
{ "device", 1, 0, 'D' },
{ "speed", 1, 0, 's' },
{ "delay", 1, 0, 'd' },
{ "bpw", 1, 0, 'b' },
{ "loop", 0, 0, 'l' },
{ "cpha", 0, 0, 'H' },
{ "cpol", 0, 0, 'O' },
{ "lsb", 0, 0, 'L' },
{ "cs-high", 0, 0, 'C' },
{ "3wire", 0, 0, '3' },
{ "no-cs", 0, 0, 'N' },
{ "ready", 0, 0, 'R' },
{ NULL, 0, 0, 0 },
};
int c;
c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);
if (c == -1)
break;
switch (c) {
case 'D':
device = optarg;
break;
case 's':
speed = atoi(optarg);
break;
case 'd':
delay = atoi(optarg);
break;
case 'b':
bits = atoi(optarg);
break;
case 'l':
mode |= SPI_LOOP;
break;
case 'H':
mode |= SPI_CPHA;
break;
case 'O':
mode |= SPI_CPOL;
break;
case 'L':
mode |= SPI_LSB_FIRST;
break;
case 'C':
mode |= SPI_CS_HIGH;
break;
case '3':
mode |= SPI_3WIRE;
break;
case 'N':
mode |= SPI_NO_CS;
break;
case 'R':
mode |= SPI_READY;
break;
default:
print_usage(argv[0]);
break;
}
}
}
int main(int argc, char *argv[])
{
int ret = 0;
int fd;
parse_opts(argc, argv);
fd = open(device, O_RDWR);
if (fd
pabort("can't open device");
/*
* spi mode
*/
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
if (ret == -1)
pabort("can't set spi mode");
ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
if (ret == -1)
pabort("can't get spi mode");
/*
* bits per word
*/
ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't set bits per word");
ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
if (ret == -1)
pabort("can't get bits per word");
/*
* max speed hz
*/
ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't set max speed hz");
ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
if (ret == -1)
pabort("can't get max speed hz");
printf("spi mode: %d\n", mode);
printf("bits per word: %d\n", bits);
printf("max speed: %d Hz (%d KHz)\n", speed, speed/1000);
transfer(fd);
close(fd);
return ret;
}
————————————————
先用gcc编译
原文链接:https://blog.csdn.net/qq_36373500/article/details/72962887
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。
树莓派 python spi,树莓派测试SPI-基于设备操作ioctl相关推荐
- 树莓派python机器人程序_如何基于树莓派开发机器人
此前我们收到读者反馈,想听一节关于如何用树莓派开发机器人.树莓派为学习计算机编程教育设计的一种微型电脑,其系统基于Linux, 只有信用卡大小但视频.音频等功能通通皆有,可谓是"麻雀虽小,五 ...
- go python php 压力测试_pyLot 基于python的压力测试工具
因为组内的产品是一个供上海甚至全球所有designer使用的网站,所以并发性很高,于是一直存在访问速度不佳的诟病.为了提高访问速度,就需要对该网站的性能进行测试.于是在网上查了并发性测试和自动化测试的 ...
- python语法元素测试_基于python全局设置id 自动化测试元素定位过程解析
背景: 在自动化化测试过程中,不方便准确获取页面的元素,或者在重构过程中方法修改造成元素层级改变,因此通过设置id准备定位. 一.python准备工作: 功能:用自动化的方式进行批量处理. 比如,你想 ...
- 树莓派 python spi_如何理解 Python_Spidev 的 spi.xfer2 方法? (时序图 位操作)
间单点说就是对时序图及相关操作理解不到位,python 这边也就卡住了~ 连接方式:温度传感器 -> ADC -> 树莓派, 在树莓派上使用 SPI,用到 Python Spidev AD ...
- 树莓派 python 无人机_DIY一个基于树莓派和Python的无人机视觉跟踪系统
DIY一个基于树莓派和Python的无人机视觉跟踪系统 无人机通过图传将航拍到的图像存储并实时传送回地面站几乎已经是标配.如果想来点高级的--在无人机上直接处理拍摄的图像并实现自动控制要怎么实现呢?其 ...
- 树莓派python物体识别_基于树莓派和Tensowflow的物体识别
近来这篇文章很火:How to build a robot that "sees" with $100 and TensorFlow (作者是Lukas,CrowdFlower创始 ...
- 单片机学习:第一篇 基于Python的树莓派语音助手
title: 单片机学习:第一篇 基于Python的树莓派语音助手 tags: 树莓派,python,语音助手,百度AIP 目录 一.pyaudio录音 二.语音识别 三.与图灵机器人对话 四.语音合 ...
- 基于深度学习的口罩规范佩戴检测【树莓派+PC训练、测试】
训练.测试.部署代码下载地址:下载地址 一.硬件: PC端运行:Windows10或11(无需GPU,有最好)或MacOS 都测试可行 树莓派运行:树莓派 4B model B 8G 版 USB RG ...
- python 图片识别服装_基于树莓派的服装识别系统及方法与流程
本发明涉及一种基于树莓派的服装识别系统及方法. 背景技术: 随着人们生活水平的不断提高,人们对于服装的需求不再是传统意义上的生活必需品,服装已经成为人们生活中的一种时尚消费品,所以很大一部分的消费者家 ...
最新文章
- 【CV夏季划】2021年冲刺CV秋招,100余课时从理论基础到进阶实践系统掌握
- 重启大法好!线上常见问题排查手册
- LeetCode之Island Perimeter
- 小程序下一破局点?钉钉小程序卡片,应用与平台的深度集成
- 分享一款自用网站导航分类目录程序源码
- Google Maps API 以某一经纬度为中心,以某一长度位半径画圆 Draw the radius of a circle...
- 西瓜书《支持向量机SVM》 原始形式推导+拉格朗日乘数法的SVM形式+SVM对偶形式推导+SMO算法推导
- hdu2844 Coins -----多重背包+二进制优化
- svchost 100%怎么办==》win
- 单片机各种通信协议详解
- 单项选择题标准化考试系统设计c语言报告,C语言课程设计(单项选择题标准化考试系统)报告...
- 用户收货地址管理后端实现
- java ftps 证书_java – 连接到FTPS服务器
- 分享大学生关于创新创业的想法,包括外卖私人订制化,网购衣服3D化远程试衣,睡眠耳机开发等等创新创业想法。
- 论文阅读:(NFM)Neural Factorization Machines for Sparse Predictive Analytics
- BT3amp;spoonwep无线破解与Q3amp;spoonwep无线破解哪个容易
- 70行代码实现同花顺,通达信,麦语言大部分技术指标公式
- 40、100 个网络基础知识普及
- FreeMind打开提示This application requires Java Runtime Environment XX
- 定语的基本概念和用法
热门文章
- vue aplayer 进度条无法拖动_Vue-rideo-player视频播放插件的使用
- hashcode是什么意思_什么才是 Java 的基础知识?
- 如何看创建媒体日期_汽车各零部件也有身份证,教你们如何看这些部件的出生日期...
- mysql count里面能加条件吗_select count(1) 和 count(*),哪个性能更好?
- openMP的简单使用
- 菜鸟教程 之 JavaScript 教程
- Java8 Stream详解~归约(reduce)
- 一个简单的 iBatis 实现——完整示例
- 计算机网络技术专业的规划,计算机网络技术专业建设规划
- 哈希值+非对称加密+网络+数字签名,你真的知道怎么给游戏充钱吗