spi开源工具可用于跟从机进行通信
1、加载spidev.ko,加载完驱动,spi框架通过device_create会为从设备分配子设备号,在/dev下生成一个spidev的节点
if (minor < N_SPI_MINORS) {
struct device *dev;
spidev->devt = MKDEV(SPIDEV_MAJOR, minor);
dev = device_create(spidev_class, &spi->dev, spidev->devt,
spidev, "spidev%d.%d",
spi->master->bus_num, spi->chip_select); //spi总线号,spi片选
status = PTR_ERR_OR_ZERO(dev);
} else {
dev_dbg(&spi->dev, "no minor number available!\n");
status = -ENODEV;
}
2、spidev_test是一个用户态工具,源码在linux已开源,通过/dev/下生成的spidev节点,系统调用内核的接口去实现spi的通信
spidev_test命令参数如下:
static void print_usage(const char *prog)
{
printf("Usage: %s [-DsbdlHOLC3vpNR24SI]\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"
" -i --input input data from a file (e.g. \"test.bin\")\n"
" -o --output output data to a file (e.g. \"results.bin\")\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"
" -v --verbose Verbose (show tx buffer)\n"
" -p Send data (e.g. \"1234\\xde\\xad\")\n"
" -N --no-cs no chip select\n"
" -R --ready slave pulls low to pause\n"
" -2 --dual dual transfer\n"
" -4 --quad quad transfer\n"
" -8 --octal octal transfer\n"
" -S --size transfer size\n"
" -I --iter iterations\n");
exit(1);
}
3、通信异常情况:
(1)spi可通过-s参数指定时钟,spi的时钟是有范围的,超过或者低于该时钟,都会报timeout或者failed
(2)加载spidev.ko的bufsiz(缓存)默认是4096个字节,这个大小确实会影响spi的传输,我尝试过加载驱动的时候增大,timeout就不会出现了,但是这个大小也是有限制的,我理解应该是不能超过你的可用内存大小,但是具体是多少就不知道了。具体因为这个配置为什么导致传输失败还不清楚,但是如果传输数据超过4096个字节,应该就会报错
(3)还有一些其他情况,例如spi一些电气属性没有对、极性相位不对、片选电平不对等等原因都有可能导致传输失败
4、spi环回验证
(1)可通过spidev_test -l这个参数进行环回通信
(2)也可物理将输入输出线进行短接
(3)通过参数指定和物理环回这两个方法通过spidev_test命令输出的结果是不一样的
5、参考网站
嵌入式linux之iMX6ULL驱动开发 | 通用spi驱动之spidev使用总结_linux spidev-CSDN博客