首页 > 解决方案 > 使用 spidev C 读取的数据与示波器测量结果不一致

问题描述

我已经为此奋斗了一段时间,却无处可去。我正在使用 spidev 和 C 与相机通信并接收 jpeg 图片。

接收图片:只需发送0x3C,相机将发送以 , 开头,以,0xFF结尾0xD8的jpeg 图片。0xFF0xD9

这是我从 spidev_fdx.c 改编的代码,用于全双工并在 RPi 上运行:

    int ret;
   
    struct spi_ioc_transfer xfer[2];
    unsigned char       buf[300000], *bp;
    int         status;

    memset(xfer, 0, sizeof xfer);
    memset(buf, 0, sizeof buf);

    buf[0] = BURST_FIFO_READ;//This is 0x3C = 0011 1100
    xfer[0].tx_buf = (unsigned long)buf;
    xfer[0].len = 1;
    xfer[0].cs_change = 0;//Keep CS low after sending 0x3C

    xfer[1].rx_buf = (unsigned long) buf;
    xfer[1].len = 300000;

printf("Starting fourth transfer...\n");
    delay_ms(2000);
    status = ioctl(spi_fd, SPI_IOC_MESSAGE(2), xfer);
    if (status < 0) 
        perror("SPI_IOC_MESSAGE");
   
    
    printf("Image received...\n");  
                
    for(int bufcnt = 0;bufcnt<100;bufcnt++){
        printf("%02x",buf[bufcnt]);
    }

现在这是最后一个 for 循环的输出,它是前 100 个字节:

00010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

你可以看到这里没有0xFF, 0xD8。但是,这是范围内的图片:

在此处输入图像描述

信号从上到下依次为:CS、Clock、MOSI、MISO。

SPI 模式为 0,因此时钟在低电平空闲,数据在上升沿采样。

您可以在蓝线上看到 0x3C = 0011 1100,而相机在紫线上以 0xFF、0xD8 响应。供参考,0xFF = 1111 1111, 0xD8 = 1101 1000

这与上面打印的 buf 的前 100 个元素不一致。我试图阅读最后 100 个元素,但它仍然是垃圾。我不知道我做错了什么。任何帮助表示赞赏!

注意:我知道 spi 的默认缓冲区大小是4096. 我已经将其更改为300000并且 cat /sys/module/spidev/parameters/bufsiz返回300000

标签: clinuxraspberry-pispi

解决方案


推荐阅读