树莓派 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

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/505113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

es6删除数组某一项_精学手撕系列——数组扁平化

参考文章:面试官连环追问:数组拍平(扁平化) flat 方法实现编者荐语:在前端面试中,手写flat是非常基础的面试题,通常出现在笔试或者第一轮面试中,主要考察面试者基本的手写代码能力和JavaScript的基本功。今…

iqc工作职责和工作内容_监理工程师工作职责

1.安全监理员是项目安全生产日常监理工作的主要实施者,代表总监理工程师在项目工程监理过程中行使项目安全生产监理的职责。2.安全监理员应认真贯彻执行《建设工程安全生产管理条例》,贯彻执行劳动保护、安全生产的方针政策、法令…

php 类常量用法,php类常量用法实例分析

这篇文章主要介绍了php类常量用法,实例分析了php中类常量的概念、特性与相关使用技巧,需要的朋友可以参考下本文实例讲述了php类常量用法。分享给大家供大家参考。具体如下:;echo Foo::BAR, ;$obj new Foo();echo $obj->getConstant(), ;echo $obj->getConst…

webservice 实现与his系统对接_[Share] EDI 及其他常见系统对接技术

近期,有客户提及:你们有没有对接技术相关的介绍,不同系统之间的对接技术,现在企业内部系统比较多,有自主开发的,有外部采购的,所以我们想了解一下对接技术相关的信息。小知马不停蹄的做了下功课…

php弱类型漏洞,php代码审计之弱类型引发的灾难

天融信阿尔法实验室 李喆有人说php是世界上最好的语言,这可能是对开发人员来说,确实有这方面的特点,因为它开发起来不像其他语言那样麻烦,就比如:弱类型,它不需要像java等语言那样明确定义数据类型。这给开…

大学计算机基础python第二次作业_第二次python作业-titanic数据练习

原博文 2019-10-14 14:45 − 一、读入titanic.xlsx文件,按照教材示例步骤,完成数据清洗。 titanic数据集包含11个特征,分别是: Survived:0代表死亡,1代表存活Pclass:乘客所持票类,有三种值(1,2,3)Name:乘客…

微小宝公众号排行榜_榜单 广东省技工院校微信公众号排行榜(第51期)

▼2020年10月榜单出炉!本期榜单最大看点,莫过于发文33篇的劳模代表——“广东高新技术高级技校”以高达830.49的微信传播指数WCI,荣登第51期广东省技工院校微信公众号排行榜榜首!截至本期,实力一向强劲的“广东高新技术…

python 读取excel表格_python 对Excel表格的读取

importxlrd flbrd "D:\\考勤系统.xlsx"wsxlrd.open_workbook(flbrd)#获取所有sheet名字:ws.sheet_names() print(获取所有sheet名字,ws.sheet_names())#获取sheet数量:ws.nsheets print(获取所有sheet对象,ws.nsheets)#…

matlab相机标定 外参数,相机外参数的标定.doc

相机外参数的标定本 科 毕 业 设 计 (论 文)题 目 __________________________________指导教师__________________________辅导教师__________________________学生姓名__________________________学生学号_________________________________________________________院(部)__…

word公式编辑器_【Word技巧】word使用终极技巧,工程人必会(四)

1、问:Word中怎么在一个英文字母上打对号?答:透明方式插入图片对象,内容是一个√2、问:Word里怎么显示修订文档的状态?文档修订后,改后标记很多,但是在菜单里没有“显示修订最终状态…

python pip install pil_解决python的pip install PIL失败问题

标签: 安装PIL的时候遇到个问题, pip install PIL Downloading/unpacking PIL Could not find any downloads that satisfy the requirement PIL Some externally hosted files were ignored (use --allow-external PIL to allow). Cleaning up... No di…

加载oracle属性文件,关于属性文件的详细介绍

我们通常会将Java应用的配置参数保存在属性文件中,Java应用的属性文件可以是一个正常的基于key-value对,以properties为扩展名的文件,也可以是XML文件. 在本案例中,將会向大家介绍如何通过Java程序输出这两种格式的属性文件,并介绍…

android 访问服务器sql_XSS 攻击、CSRF 攻击、SQL 注入、流量劫持(DNS 劫持、HTTP 劫持)—— 浏览器安全

今天看了 jsliang 大佬关于网络安全的文章,为了加深一下印象,自己动手写一下。 主要参考文章:网络安全 ——— jsliang XSS攻击 XSS(Cross Site Script)跨站脚本攻击,指的是向网页注入恶意代码,…

python3 class init_python3 module中__init__.py的需要注意的地方

网上关于__init__.py的作用的资料到处都是,我在此就不再啰嗦哪些了。若有需要、请各位看官去搜搜即可。最近刚开始用Python3 就遇到了这个比较有意思的事情闲言少叙,下面要介绍的是python3中__init__.py中的一些略微不同的地方目录结构如下:├…

simulink和psim仿真结果不同_在HFSS进行AC耦合电容仿真优化怎么做?

AC耦合电容,也叫DC blocking隔直电容,在几乎所有的高速串行链路中,都可以看到它的身影,它的主要作用是去掉信号中的直流偏置分量,同时让高频分量可以顺利通过,类似于一个高宽带的滤波器。由于电容的焊盘通常…

民生银行 一码付 php,PHP开心码支付免签约第四方支付平台源码修复版

源码说明后台号码admin后台密码123456声明:该源码仅供学习出现,修复者不承担任何责任,下载安装即代表使用者自行承担责任源码安装方法需要服务器开启g11插件PHP5.6,主机用户推荐95云主机,因为已经开启所有扩展插件必须…

oracle主从表分离怎么实时更新数据_高可用数据库UDB主从复制延时的解决

MySQL主从复制的延时一直是业界困扰已久的问题。延时的出现会降低主从读写分离的价值,不利于数据实时性较高的业务使用MySQL。UDB是UCloud推出的云数据库服务,上线已达六年,运营了数以万计的UDB MySQL实例。除了提供高可用、高性能、便捷易用…

vp翻N_VP刀叨叨:如何让G胖给你唱生日歌

VS看起来好凶喵▼ESL欧洲&独联体区VP发推庆祝击败OG昨晚第九个比赛日,OG与VP的比赛无疑是大家关注的焦点,一边是TI双冠王,一边是状态开始回升的俄罗斯毛熊,大家都很期待他们能给我们带来精彩的比赛。不过比赛结果却出乎了不少…

秒后面的单位是什么_为什么兰州马拉松很难跑出好成绩?

如果要评选中国最难PB的马拉松,西北第一马兰州马拉松当之无愧可以排名第一。为什么这么说呢?先来看下今年兰马的一组数据,不管是精英选手还是大众选手,成绩都要比个人PB慢。国内男子冠军是管油胜,成绩为2小时18分58秒&…

surface php老是用不了,surface pro7触摸屏没反应怎么办

发生该问题的原因可能是:有很多可能原因,从校准到硬件或者固件。故障排查可以找到根本原因。1. 清洁屏幕将柔软的无绒布蘸上水或眼镜清洗液来清洁屏幕,但不要直接在屏幕上喷洒液体。2. 重启 Surface注意:你将需要连接键盘或鼠标到…