开启spi
sudo raspi-config
选择Interfacing options,选择spi打开
lsmod
可以看到spi_bcm2835
短接MISO和MOSI
编写回环代码spitest.c
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>#include <linux/types.h>
#include <linux/spi/spidev.h>/* dac_test /dev/spidevB.D <val> */int main(int argc, char **argv)
{int fd;unsigned int val;struct spi_ioc_transfer xfer[1];unsigned char tx_buf[2];unsigned char rx_buf[2];int status;unsigned long speed = 50000; // SPI速度unsigned long spimode = SPI_MODE_0;if(argc != 4) {printf("Usage: %s /dev/spidevB.D <val>\n", argv[0]);return 0;}fd = open(argv[1], O_RDWR);if (fd < 0) {printf("can not open %s\n", argv[1]);return 1;}// 设置SPI模式if (ioctl(fd, SPI_IOC_WR_MODE, &spimode) < 0) {perror("设置SPI模式失败");return 1;}// 设置SPI速度if (ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) {perror("设置SPI速度失败");return 1;}tx_buf[0] = (unsigned long)strtoul(argv[2],NULL,0);tx_buf[1] = strtoul(argv[3],NULL,0);memset(xfer, 0, sizeof xfer);xfer[0].len = 2;xfer[0].tx_buf = (unsigned long) tx_buf;xfer[0].rx_buf = (unsigned long) rx_buf;status = ioctl(fd, SPI_IOC_MESSAGE(1), xfer);//告诉内核我们要发送1个SPI消息。这部分中的1表示我们要发送的消息数量。if (status < 0) {printf("SPI_IOC_MESSAGE\n");return -1;}/* print result */printf("recived0 %X\n",rx_buf[0]);printf("recived1 %X\n",rx_buf[1]);return 0;
}
版本2
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <linux/spi/spidev.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>#define SPI_DEVICE "/dev/spidev0.0" // SPI设备路径int main(int argc, char *argv[]) {int spi_fd;unsigned char txData[2] = {0x00, 0x00}; // 要发送的两个字节数据unsigned char rxData[2] = {0x00, 0x00}; // 接收的两个字节数据struct spi_ioc_transfer spi;unsigned long speed = 50000; // SPI速度unsigned long spimode = SPI_MODE_0;int opt;while ((opt = getopt(argc, argv, "a:b:")) != -1) {switch (opt) {case 'a':txData[0] = (unsigned long)strtoul(optarg, NULL, 0);break;case 'b':txData[1] = (unsigned long)strtoul(optarg, NULL, 0);break;default:fprintf(stderr, "Usage: %s -a <byte1> -b <byte2>\n", argv[0]);exit(EXIT_FAILURE);}}// 打开SPI设备if ((spi_fd = open(SPI_DEVICE, O_RDWR)) < 0) {perror("打开SPI设备失败");return 1;}// 设置SPI模式if (ioctl(spi_fd, SPI_IOC_WR_MODE, &spimode) < 0) {perror("设置SPI模式失败");return 1;}// 设置SPI速度if (ioctl(spi_fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) {perror("设置SPI速度失败");return 1;}memset(&spi, 0, sizeof(spi));spi.tx_buf = (unsigned long)txData;spi.rx_buf = (unsigned long)rxData;spi.len = 2; // 设置传输长度为2字节spi.speed_hz = speed;spi.bits_per_word = 8;// 发送并接收数据if (ioctl(spi_fd, SPI_IOC_MESSAGE(1), &spi) < 0) {perror("SPI发送接收失败");} else {printf("Received: 0x%X 0x%X\n", rxData[0], rxData[1]);}close(spi_fd);return 0;
}