嵌入式linux中SPI应用开发

来源:互联网 发布:天猫淘宝助理不能上传 编辑:程序博客网 时间:2024/06/03 13:59

在嵌入式设备中用到spi的器件有很多,目前常见的有刷卡器、蓝牙模块等,都是通过spi总线来通信的。本文来讲解一下SPI应用程序开发的常见模式。


一 、 主要结构体

linux中,应用开发常用的结构体主要是struct spi_ioc_transfer:

struct spi_ioc_transfer {__u64tx_buf;__u64rx_buf;__u32len;__u32speed_hz;__u16delay_usecs;__u8bits_per_word;__u8cs_change;__u32pad;};

#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\n");return -1;}if(rx[0] !=0xAA){        printf("read spi data: ");    for (ret = 0; ret < ARRAY_SIZE(tx); ret++) {    printf("%02X ", rx[ret]);    }        printf("\n");}ucRegVal = rx[ARRAY_SIZE(tx)-1];get_data_process(rx);  return 1;

write函数和这类似。


四、 测试函数

void main(){    spi_init();    spi_read();}
OK,就是这么简单

0 0
原创粉丝点击