嵌入式linux驱动之路13: 裸机开发之SPI 实验

SPI简介

SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线.
①、CS/SS,Slave Select/Chip Select,这个是片选信号线,用于选择需要进行通信的从设备。I2C 主机是通过发送从机设备地址来选择需要进行通信的从机设备的,SPI 主机不需要发送从机设备,直接将相应的从机设备片选信号拉低即可。
②、SCK,Serial Clock,串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。
③、MOSI/SDO,数据线.只能用于主机向从机发送数据,也就是主机输出,从机输入。
④、MISO/SDI,这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出。
SPI 通信都是由主机发起的,主机需要提供通信的时钟信号。主机通过 SPI 线连接多个从设备的结构如图所示:
在这里插入图片描述
在这里插入图片描述
图 中,CS 片选信号先拉低,选中要通信的从设备,然后通过 MOSI 和 MISO 这两根数据线进行收发数据,MOSI 数据线发出了0XD2 这个数据给从设备,同时从设备也通过 MISO 线给主设备返回了 0X66 这个数据。这个就是 SPI 时序图。

I.MX6U ECSPI 简介

I.MX6U 的 ECSPI 可以工作在主模式或从模式,我们使用主模式,I.MX6U 有 4 个ECSPI,每个 ECSPI 支持四个片选信号,也就说,如果你要使用 ECSPI 的硬件片选信号的话,一个 ECSPI 可以支持 4 个外设。如果不使用硬件的片选信号就可以支持无数个外设,我们不使用硬件片选信号,因为硬件片选信号只能使用指定的片选 IO,软件片选的话可以使用任意的 IO。如果要发送数据就向寄存器 ECSPIx_TXDATA 写入数据,读取及存取ECSPIx_RXDATA
里面的数据就可以得到刚刚接收到的数据。另外配置SPI其他的模式也是去往对应的寄存器中写值。使用 SPI 接口读写寄存器需要 16 个时钟或者更多(如果读写操作包括多个字节的话),第一个字节包含要读写的寄存器地址,寄存器地址最高位是读写标志位,如果是读的话寄存器地址最高位要为 1,如果是写的话寄存器地址最高位要为 0,剩下的 7 位才是实际的寄存器地址,寄存器地址后面跟着的就是读写的数据。
配置步骤如下:
1.初始化SPI,配置寄存器,设置采样周期,时钟配置
2.设置发送或接受一个字节的数据,等待发送 FIFO 为空,然后将数据赋给TXDATA寄存器,或者等待接收 FIFO 有数据,将>RXDATA寄存器中的值赋给变量,。
3.定义icm20608设备:定义SPI 片选引脚。定义了一些 ICM20608 的 ID 和寄存器地址。第 41 行定义了一个结构体icm20608_dev_struc,里面的成员变量用来保存ICM20608 的原始数据值和经过转换得到的实际值。
4.初始化 ICM20608:将用到的IO进行复用,配置电器属性包括软件复位引脚
5.读ICM20608的ID寄存器,是否符合预期(读操作:ICM20608 在使用 SPI 接口的时候寄存器地址只有低 7 位有效, 寄存器地址最高位是读/写标志位,读的时候要为 1,写的时候要为 0。先使能 SPI 传输,再发送寄存器地址,在发送数据,最后禁止SPI传输,读取连续多个寄存器方法:发送完寄存器地址后,顺序读取寄存器的值放入buf[i]中)。
6.设置ICM20608的配置寄存器,设置速率,分辨率等。
7.获取ICM20608中的分辨率,本质也是读取对应寄存器
8.获取 ICM20608 的加速度计、陀螺仪和温度计的数据,顺序读取寄存器的值放入data[i]中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值