主题 : 问题 :利用内核自带的spi测试测试spi驱动的时候,mosi没有直接连接miso,miso怎么也能收到数据? 复制链接 | 浏览器收藏 | 打印
因为这个舞台,我们相聚在一起!
级别: 侠客
UID: 2527
精华: 1
发帖: 91
金钱: 505 两
威望: 101 点
综合积分: 202 分
注册时间: 2008-11-22
最后登录: 2015-06-08
楼主  发表于: 2015-05-05 10:02

 问题 :利用内核自带的spi测试测试spi驱动的时候,mosi没有直接连接miso,miso怎么也能收到数据?

问题 :利用内核自带的spi测试测试spi驱动的时候,mosi没有直接连接miso,miso怎么也能收到数据?


#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>


#include <unistd.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

static void pabort(const char *s)
{
    perror(s);
    abort();
}

static const char *device = "/dev/spidev2.0";
static uint8_t mode;
static uint8_t bits = 8;
static uint32_t speed = 1000; //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 tx[] = {
//        0x55,0xaa,0xf5};
    
    uint8_t rx[ARRAY_SIZE(tx)] = {0, };    //接收的数据数据
    //声明并初始化spi_ioc_transfer结构体
    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,
    };

    //SPI_IOC_MESSAGE(1)的1表示spi_ioc_transfer的数量
    ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);        //ioctl默认操作,传输数据
    if (ret == 1)
        pabort("can't send spi message");

    for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {    //打印接收缓冲区
        if (!(ret % 6))                                //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;

     int count=0;
     char buf[]={0x11,0x22,0x33,0x44,0x55};

    parse_opts(argc, argv);

    fd = open(device, O_RDWR);
    if (fd < 0)
        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);

    while(1)
    {
        //经过测试,mosi发送数据正确,但是mosi没有直连miso脚,也能收到数据,怎么回事?
        //用示波器测量miso脚,也没有接收到数据波形,默认高电平
        transfer(fd);            //传输测试    
        sleep(1);
        transfer(fd);            //传输测试
        sleep(1);
        
        

    //count=write(fd,buf,sizeof(buf)/sizeof(buf[0]));
    //read(fd,buf,count);  
    //printf("read byte is: 0x%02X\n",buf[0]);
     //sleep(1);          
        
        
    }
    

    close(fd);

    return ret;
}

问题:   经过示波器测试,mosi发送数据正确,但是mosi没有直连miso脚,示波器测量miso脚没有数据,
测试结果:

虚拟机下编译arm-linux-gcc  spi_test.c  -o  spi_test

在超级终端下运行:./spi_test

可以见到:

       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,


可是我没有把mosi和miso连接起来,怎么spi的接收端也会有数据呢?
[ 此帖被sanmaoljh在2015-05-05 16:20重新编辑 ]
蜗牛