ARM40-A5应用程序——SPI应用程序(AD7689)

2017.9.15

版权声明:本文为博主原创文章,允许转载。

一、SPI应用程序的C语言源码

文件名为 test_ad7689.c,代码见本文的最后。

二、交叉编译

arm-none-linux-gnueabi-gcc -o test_ad7689 test_ad7689.c -static

三、执行程序与测试

(1)无AD采样芯片AD7689情况下的测试

硬件上将spidev32765.0对应的SPI_MOSI与SPI_MISO这两个信号线连接在一起,直连即可,无须串接电阻。

将交叉编译得到的 test_ad7689 文件拷贝到ARM40-A5板中,执行程序:

./test_ad7689

可以看到打印为:

root@ARM40:~# ./test_ad7689
in0 get = 3d49 
in1 get = 3dc9 
in2 get = 3e49 
in3 get = 3ec9 
in4 get = 3f49 
in5 get = 3fc9 
in6 get = 3c49 
in7 get = 3cc9 
.....  // 会循环打印

(2)有AD采样芯片AD7689情况下的测试

有AD采样芯片AD7689情况下,将交叉编译得到的 test_ad7689 文件拷贝到ARM40-A5板中,执行程序:

./test_ad7689

可以看到打印为(AD7689的IN上电压不同时,显示的数据会不同):

root@ARM40:~# ./ad7689for
in0 get = 0 
in1 get = 0 
in2 get = 0 
in3 get = 0 
in4 get = 0 
in5 get = 0 
in6 get = 0 
in7 get = 3fff

.....  // 会循环打印

四、数据处理

AD采样的数据往往需要经过数字滤波处理,推荐采用一阶低通滤波或者算术平均滤波。

参考文章:

Documentation/spi/spidev_test.c

Linux内核源码中的示例spidev_test.c

http://www.aiweibang.com/yuedu/41098585.html

【Linux公开课】用户态SPI编程

【滤波器学习笔记】一阶RC低通滤波

https://blog.csdn.net/qq_27334499/article/details/52186336

荟聚计划:共商 共建 共享 Grant

附:

(1)test_ad7689.c 的代码

#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>#define IN0             (0x3c49 << 2)           // IN0 4.096V, AD7689 Configuration Register is 14bit
#define IN1             (0x3cc9 << 2)           // IN1 4.096V
#define IN2             (0x3d49 << 2)
#define IN3             (0x3dc9 << 2)
#define IN4             (0x3e49 << 2)
#define IN5             (0x3ec9 << 2)
#define IN6             (0x3f49 << 2)
#define IN7             (0x3fc9 << 2)
#define M               8                       // channel numconst char *device = "/dev/spidev1.0";
uint32_t speed = 10000000;                      // 10MHz
uint16_t delay = 0;
uint16_t ad7689_cfg[M] = {IN2, IN3, IN4, IN5, IN6, IN7, IN0, IN1, };/** Error termination*/
static void pabort(const char *s)
{perror(s);abort();
}/** configure channel & get ad data* cfg_data is Configuration Register << 2* rxbuf return ad7689 Channels data*/
uint16_t get_ad_data(int fd,int cfg_data)
{int ret;uint16_t txbuf = cfg_data;uint16_t rxbuf = 0;struct spi_ioc_transfer tr = {.tx_buf = (unsigned long)&txbuf,                // (n+1) channel Configuration.rx_buf = (unsigned long)&rxbuf,                // (n-1) channel data.len = sizeof(txbuf),.delay_usecs = delay,.speed_hz = speed,.bits_per_word = 16,};ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);               // send spi_ioc_transfer to spidevif(ret < 1)pabort("can't send spi message");return rxbuf;
}/** open spidev and set it*/
int spi_set(const char *dev_spi)
{int fd_spi;int ret = 0;uint8_t bits = 16;uint32_t mode = 0;fd_spi = open(dev_spi, O_RDWR);if (fd_spi < 0)pabort("can't open device");/** spi mode*/ret = ioctl(fd_spi, SPI_IOC_WR_MODE, &mode);if (ret == -1)pabort("can't set spi mode");ret = ioctl(fd_spi, SPI_IOC_RD_MODE, &mode);if (ret == -1)pabort("can't get spi mode");/** max speed hz*/ret = ioctl(fd_spi, SPI_IOC_WR_MAX_SPEED_HZ, &speed);if (ret == -1)pabort("can't set max speed hz");ret = ioctl(fd_spi, SPI_IOC_RD_MAX_SPEED_HZ, &speed);if (ret == -1)pabort("can't get max speed hz");/** set spi bits*/ret = ioctl(fd_spi, SPI_IOC_WR_BITS_PER_WORD, &bits);if (ret == -1)pabort("can't set bits per word");ret = ioctl(fd_spi, SPI_IOC_RD_BITS_PER_WORD, &bits);if (ret == -1)pabort("can't get bits per word");//      printf("mode=0x%x,speed=%d,bits=0x%x\n", mode, speed, bits);return fd_spi;
}int main(int argc, char *argv[])
{int i;int fd;uint16_t data[M];fd = spi_set(device);get_ad_data(fd, ad7689_cfg[6]);get_ad_data(fd, ad7689_cfg[7]);while(1){for(i=0;i<M;i++) {data[i] = get_ad_data(fd, ad7689_cfg[i]);       // use about 650us for 8 channels}for(i=0;i<M;i++) {printf("in%d get = %x \n",i,data[i]);}printf("\n");usleep(50000);}close(fd);
}

ARM40-A5应用程序——SPI应用程序(AD7689)相关推荐

  1. java如何编写spi接口_软件模拟SPI接口程序代码(4种模式)

    软件模拟SPI接口程序代码(4种模式) SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(数据输入,针对主机来说 ...

  2. 软件模拟SPI接口程序代码

    目录 SPI协议简介 SPI接口介绍 SPI接口连接图 SPI数据传输方向 SPI传输模式 模拟SPI程序 SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或者 ...

  3. 软件模拟SPI接口程序代码(4种模式)

    软件模拟SPI接口程序代码(4种模式) SPI协议简介 SPI的通信原理很简单,一般主从方式工作,这种模式通常有一个主设备和一个或多个从设备,通常采用的是4根线,它们是MISO(数据输入,针对主机来说 ...

  4. 嵌入式单片机基础篇(三十六)之STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解

    STM32F1SPI标准接口程序以及模拟SPI标准接口程序讲解 一.SPI标准接口初始化: 1.SPI 内部结构简明图 2.上一篇文章提到,spi标准协议包含4条信号线.时钟相位.时钟极性.数据单字节 ...

  5. newmark法 matlab,newmark法程序newmark法程序.doc

    newmark法程序newmark法程序 用matlab编程法 一.法原理 Newmark-?法是一种逐步积分的方法,避免了任何叠加的应用,能很好的适应非线性的反应分析. Newmark-?法假定: ...

  6. perl判断CGI程序或终端程序的方法

    2019独角兽企业重金招聘Python工程师标准>>> print "Content-type: text/plain\n\n"  if $ENV{REQUEST ...

  7. Linux环境下编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜

    题目:编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜,如果用户猜的数大于答案,则提示大了,如果用户猜的数小于答案,则提示小了.当用户猜对时提示:猜对了. #! /bi ...

  8. Android之如何获取手机程序列表以及程序相关信息并启动指定程序

    效果图: 程序列表: 启动程序,获取程序信息: 代码如下: 创建一个AppInfo类来表示应用程序 <pre name="code" class="java&quo ...

  9. python开发微信小程序-微信小程序开发:python+sanic 实现小程序登录注册

    开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + sanic + 微信小程序实现用户快速注册登录全栈方案. 微信小程 ...

最新文章

  1. iis服务器文件上传速度慢,windows 2008 R2 上传速度慢
  2. MySQL 数据库mysqlbinlog使用问题:unknown variable ‘default-character-set=utf8‘.解决方法
  3. matlab二维特殊函数面积图area()函数
  4. java数组1 100偶数和_java – 数组偶数和奇数排序
  5. linux 单例模式改密码,Java 利用枚举实现单例模式
  6. mysql查询最小的id_Mysql查询表中最小可用id值的方法
  7. CentOS统的7个运行级别的含义
  8. 电商系统_如何打造 一个完美的电商系统
  9. 机器学习速成课程 | 练习 | Google Development——编程练习:稀疏数据和嵌套简介
  10. Solr相关概念详解:SolrRequestHandler
  11. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点
  12. 好系统教你如何禁用或删除启动应用程序以加速Windows
  13. ubuntu 设置保护色
  14. Python远程连接Windows,并调用Windows命令(类似于paramiko)
  15. ecshop二次开发指南
  16. 金蝶K3修改库存更新控制方式
  17. 数据文件offline online
  18. 江苏单招C语言试题,2011年对口单招计算机试卷(C语言+原理+电工答案).doc
  19. 海康威视py和c++调用全(超精髓,亲测)
  20. 【线段树区间合并】BZOJ1593-[Usaco2008 Feb]Hotel 旅馆

热门文章

  1. 三线压力传感器原理_三线压力传感器|三线风压传感器|三线压差变送器简介
  2. solaris的ndd指令(相当于linux的sysctl命令)
  3. 有源RFID在人员和资产管理上的应用
  4. 百度codetop-3
  5. SpringAMQP整合RabbitMQ-五种工作模式Demo
  6. php 外勤,Qdphpcode 签到程序,可用于外勤 ,支持百度地图SDK! Web Server 269万源代码下载- www.pudn.com...
  7. 关于互联-这些你可能很想知道
  8. 求解第二大元素——锦标赛算法(Tournament Algorithm)
  9. EDIUS中的模板该怎样修改
  10. 计算机基础知识二进制转换,计算机基础二进制转换作业01