嵌入式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
- 嵌入式linux中SPI应用开发
- 嵌入式LinuX应用开发
- 嵌入式Linux串口应用开发
- 嵌入式linux之SPI驱动
- 嵌入式Linux的开发和应用优势
- 嵌入式Linux的开发和应用优势
- 嵌入式linux应用开发之:初识Qt
- VMWare 在嵌入式Linux开发的应用
- ARM嵌入式LINUX应用实例开发
- 基于Linux嵌入式原理与应用开发
- 嵌入式Linux应用开发完全手册
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发之:初识Qt
- 嵌入式linux应用开发手册笔记
- 《嵌入式linux应用开发》2440 中断 体系结构
- 嵌入式linux应用开发之:初识Qt
- 常用的jQuery代码片段
- Android中文API
- android开发疑难杂症记录
- fragment或adapter中使用LayoutInflater加载布局时出现的问题
- RecyclerView item监听探究
- 嵌入式linux中SPI应用开发
- Mybatis3源码分析(21)-Mapper实现-动态代理
- nodejs - multer模块教程,使用multer进行附件上传
- POJ 3083图搜 bfs+dfs
- iOS简单的音效播放单例 (您可照搬代码)
- 【数据结构】堆排序
- Java并发编程类学习二(线程的包装)
- rake的相关操作
- Android 判断字符串是不是是身份证、邮箱、银行卡、手机号、中文 1