嵌入式linux中SPI应用开发

2019-07-12 22:23发布

在嵌入式设备中用到spi的器件有很多,目前常见的有刷卡器、蓝牙模块等,都是通过spi总线来通信的。本文来讲解一下SPI应用程序开发的常见模式。
一 、 主要结构体 linux中,应用开发常用的结构体主要是struct spi_ioc_transfer: struct spi_ioc_transfer { __u64 tx_buf; __u64 rx_buf; __u32 len; __u32 speed_hz; __u16 delay_usecs; __u8 bits_per_word; __u8 cs_change; __u32 pad; };
#define SPI_MSGSIZE(N) ((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) ? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)])
只要对spi_ioc_transfer进行赋值,就可以进行读写操作了,很简单。
二、 SPI设备的初始化 void spi_Init() { int ret = 0; spifd = open(device, O_RDWR); if (spifd < 0) pabort("can't open device"); /* * spi mode */ ret = ioctl(spifd, SPI_IOC_WR_MODE, &mode); if (ret == -1) pabort("can't set spi mode"); ret = ioctl(spifd, SPI_IOC_RD_MODE, &mode); if (ret == -1) pabort("can't get spi mode"); /* * bits per word */ ret = ioctl(spifd, SPI_IOC_WR_BITS_PER_WORD, &bits); if (ret == -1) pabort("can't set bits per word"); ret = ioctl(spifd, SPI_IOC_RD_BITS_PER_WORD, &bits); if (ret == -1) pabort("can't get bits per word"); /* * max speed hz */ ret = ioctl(spifd, SPI_IOC_WR_MAX_SPEED_HZ, &speed); if (ret == -1) pabort("can't set max speed hz"); ret = ioctl(spifd, SPI_IOC_RD_MAX_SPEED_HZ, &speed); if (ret == -1) pabort("can't get max speed hz"); }
首先open打开SPI的设备,然后通过ioctl函数进行数据位、速率、模式进行配置。
三 、SPI的读写 int spi_read() { bt_devide_msg msg; unsigned char ucRegVal; int ret,i; unsigned char tx[20]; for(i = 0;i<20;i++) { tx[i] = 0xda; } unsigned char rx[ARRAY_SIZE(tx)] = {0, }; struct spi_ioc_transfer tr = { .tx_buf = (unsigned long)tx, .rx_buf = (unsigned long)rx, .len = ARRAY_SIZE(tx), .delay_usecs = udelay, .speed_hz = speed, .bits_per_word = bits, }; ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); if (ret < 1) { printf("can't read spi message "); return -1; } if(rx[0] !=0xAA) { printf("read spi data: "); for (ret = 0; ret < ARRAY_SIZE(tx); ret++) { printf("%02X ", rx[ret]); } printf(" "); } ucRegVal = rx[ARRAY_SIZE(tx)-1]; get_data_process(rx); return 1;
write函数和这类似。
四、 测试函数
void main() { spi_init(); spi_read(); }OK,就是这么简单