c - 使用 spidev C 读取的数据与示波器测量结果不一致
问题描述
我已经为此奋斗了一段时间,却无处可去。我正在使用 spidev 和 C 与相机通信并接收 jpeg 图片。
接收图片:只需发送0x3C
,相机将发送以 , 开头,以,0xFF
结尾0xD8
的jpeg 图片。0xFF
0xD9
这是我从 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
解决方案
推荐阅读
- regex - 为什么我的 Ruby RegExp 不能正常工作?
- arrays - 如果所有值都是正数并且数字 <= k,我可以在 O(n) 中对数组进行排序吗?
- r - R:如何重新排列列中的冗余值,以便行少列多
- sql - 根据上次更新的记录更新下一条记录
- r - 根据另一个变量的特定值的顺序创建一个变量
- c - 从文件读取时出现分段错误
- r - 在 R 中创建 sumif 函数的等价物
- leaflet - 我不明白如何在没有瓷砖主机的情况下使用 OSM Bright
- azure-policy - 基于 VM 名称的 VM Sku 的 Azure 策略
- python - 比较由 dicts Python 制作的列表的 dicts