小v电子技术博文 上海鲤鲸网络科技 小v单片机
ad7689在arm Linux imx6ul上的使用
  • 首页 > Linux
  • 作者:小v
  • 2017年10月31日 15:18 星期二
  • 浏览:188
  • 字号:
  • 评论:0
  • ad7689 是一款8通道adc采集芯片,使用spi接口通信。

    移植到Linux上使用用的是内核的spidev驱动,找到 /dev/spidev1.0 设备是我们 用的总线接口。

    ad7689 直接读取数据便是1-8的通道。

    在读取ad7689的数据时需要配置spi 的,这里配置成默认的0模式  10MHZ


    将第0路接地 

    打印


    in0 get = 0 
    in1 get = 1bb 
    in2 get = 2079 
    in3 get = 9b 
    in4 get = 20a2 
    in5 get = 20a3 
    in6 get = 2059 
    in7 get = 94 


    源码如下

    #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 num  
    #define SPI_DEVICE "/dev/spidev1.0"
    const 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 spidev  
            if(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=%d,speed=%d,bits=%d\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] >> 2);  
                // printf("in%d get = %x \n",i,data[i]);  
                    }  
      
                    printf("\n");  
                    sleep(2);  
            }  
      
            close(fd);  
    }



      您阅读这篇文章共花了:  
     本文无需标签!
    二维码加载中...
    本文作者:小v      文章标题: ad7689在arm Linux imx6ul上的使用
    本文地址:http://www.xiaovdiy.cn/?post=371
    版权声明:若无注明,本文皆为“”原创,转载请保留文章出处。

    返回顶部| 首页| 手气不错| 捐赠支持| 自定义链接| 自定义链接| 自定义链接| 手机版本|后花园

    Copyright © 2014-2017   京ICP备14059411 Copyright 2014-2015 上海鲤鲸网络科技工作室 版权所有 All Rights Reserved

    sitemap