6.8.2 spi****初始化配置首先看一下spi外设的初始化结构体成员及其描述。
1、spi_dirention 设置了spi是单向通信还是双向的通信数据模式,设置参数如表6-3所示。
2、spi_mode设置了spi 设备是工作在主机模式还是从机模式,设置参数如表6-4所示。
3、spi_datasize设置了spi通信时数据帧是8位还是16位,没有特殊要求,通常配置为8位模式,设置参数如表6-5所示。
4、spi_cpol设置了spi串行时钟sck的时钟极性,选择该参数时需要确保spi通信双方保持一致,一般根据spi从设备支持的模式设定,设置参数如表6-6所示
5、spi_cpha设置了spi采样时发生在sck的哪个边沿,该参数同样需要确保通信双方保持一致,一般也是根据从设备支持的模式设定,设置参数如表6-7所示
6、spi_nss设置了nss片选引脚是由选择硬件模式,还是由软件模式。采用硬件管理时,片选信号由spi硬件自动产生,不需要手动设置,而软件模式需要手动设置片选引脚电平。实际开发中通常设置为软件模式,即使用普通io口作为片选引脚。设置参数如表6-8所示
7、spi_baudrateprescaler设置了spi波特率预分频系数,分频后的时钟就是sck信号线的时钟频率。注意spi正在通信时不能更改波特率预分频系数,具体设置参数如表6-9所示
8、spi_firstbit设置了数据传输是高位在前(msb先行)还是低位在前(lsb先行),没有特殊要求一般设置为高位在前(msb先行)设置参数如表6-10所示。
9、spi_crcpolynomial设置是否使用crc校验。使用时根据需求设置crc多项式,不使用时设置其值为7(复位值为0x0007,默认不使用)。无特殊要求通常不设置crc校验。
spi配置流程:
1、使能spi外设时钟及spi接口引脚时钟
2、初始化spi引脚——初始化nss、sck、miso、mosi引脚。
3、初始化spi外设——根据需求设置spi初始化结构体成员参数
4、使能spi外设——spi使能库函数为:spi_cmd(spix, enable);其中spix,x为1、
2、3,用来选择spi外设。
5、编写spi数据发送和接收函数6.8.3 spi数据发送和接收spi数据发送和接收过程与usart类似,由数据缓冲区和一个8位的双向移位寄存器构成。spi的数据缓冲区叫做数据寄存器(spi_dr),虽然是一个寄存器,但是实质上包含两个缓冲区:发送缓冲和接收缓冲,分别用于进行写操作和读操作。与usart两个单独的移位寄存器不同,spi只有一个移位寄存器且是双向的,同一时刻既向mosi上移出要发送的数据,又将miso上的数据向内移入,这个过程是同步的,spi传输结构如图6-11所示。
图6-11 spi数据传输结构图
spi发送数据时只需要将数据写入到spi_dr,spi会自动将其分配到发送缓冲区,然后再将数据从发送缓冲区并行传送到移位寄存器中,同时设置一个发送缓冲区为空(txe)的标志位,最后数据按照设定的数据格式(msb或lsb)被串行的从mosi引脚移出。与此同时miso引脚也会接收到数据,接收到的数据同样按照相应的格式被串行的移入到移位寄存器,当接收完一帧数据后,移位寄存器将接收到的数据传送到接收缓冲区中,同时会设置一个接收缓冲区非空(rxne)的标志位。使用spi发送和接收数据时并不需要关心数据是怎么发送或者接收到的,只需要检测相应标志位后向数据寄存器(spi_dr)写入要发送的数据或者读出接收到的数据即可。
txe标志位被置位仅表示发送缓冲区为空,可以继续向spi_dr写入数据,但并不代表数据发送完成,这一点一定要搞清楚。向发送缓冲区写入数据会清除txe标志位,如果txe=0即发生缓冲区非空时,向spi_dr中写入数据会覆盖发送缓冲区中的数据,但不会影响移位寄存器中的数据。rxne=1表示接收缓冲区非空,即已经接收到一帧数据。读spi_dr寄存器硬件会自动清除rxne标志位,并返回接收到的数据。当spi接收到一帧数据时,意味着spi肯定已经发送完一帧数据,因此判断一帧数据是否发送完成,可以通过检测rxne标志位。如果设置了spi_cr1寄存器中的txeie位或者spi_cr2寄存器中的rxneie位,将产生对应的中断。本文主要是以查询方式介绍spi如何收发数据。
使用查询方式检测txe和rxne标志位时需要用到spi标志位检测函数,如下所示:
spi_i2s_getflagstatus(spi_typedef* spix, uint16_t spi_i2s_flag);其中spix中x为1、2、3,用来选择spi外设;spi_i2s_flag为被检测的标志位,如表6-11所示。
同时库函数中也有对应的spi数据发送和接收函数,分别为:(固件库手册中所示的发送和接收函数有误,实际以本文为准)
spi_i2s_senddata(spi_typedef* spix, uint16_t data);//spi发送函数
spi_i2s_receivedata(spi_typedef* spix);//spi接收函数
spi使用查询方式发送和接收数据时,在发送和接收数据之前需要检测相应标志位,然后再调用库函数发送或者接收数据,这样操作虽然方便,但是由于函数相互调用会占用时间,当传输数据量较大时会降低spi整体传输效率。为了提高spi的整体传输效率,本文采用寄存器方式操作。另外spi在接收从机数据时,由于从机自身不产生时钟信号(sck),通信时需要主机提供sck以启动数据传输,因此主机需要通过发送的数据来提供sck并接收从机的数据,发送的数据并不生效。
以下是配置spi2为主模式,8位数据格式,cpol=1,cpha=1,波特率2分频,msb先行,不使用crc校验,使用时可根据具体要求进行修改。由于spi外设挂载了多个从机设备,为了方便移植,初始化spi时并未设置片选引脚,而是选择将片选引脚与spi从设备放在一起配置,具体代码如下:
96.9 spi读写w25q128
6.9.1 w25q128****简介flash是一种掉电不丢数据的非易失存储设备,生活中常见的闪存存储设备包块固态硬盘、u盘、sd卡以及单片机内部的存储设备等。flash具有存储空间更大,读取速率快、可靠性高等特点。本节所要介绍的w25q128就是flash的一种,只不过它是以芯片的形式存在。 w25q128是华邦公司推出的一款spi接口的nor flash芯片,其存储空间为128mbit,相当于16m字节。w25q128可以支持spi的模式0和模式3,也就是cpol=0/cpha=0和cpol=1/cpha=1这两种模式。
往flash写入数据时,需要注意以下两个重要问题:
1、flash写入数据时和eeprom类似,不能跨页写入,一次最多写入一页,w25q128的一页是256字节。写入数据一旦跨页,必须在写满上一页的时候,等待flash将数据从缓存搬移到非易失区,重新再次往里写。
2、flash有一个特点,就是可以将1写成0,但是不能将0写成1,要想将0写成1,必须进行擦除操作。因此通常要改写某部分空间的数据,必须首先进行一定物理存储空间擦除,最小的擦除空间,通常称之为扇区,扇区擦除就是将这整个扇区每个字节全部变成0xff。每款flash的扇区大小不一定相同,w25q128的一个扇区是4096字节。为了提高擦除效率,使用不同的擦除指令还可以一次性进行32k(8个扇区)、64k(16个扇区)以及整片擦除。
kingst-32f1开发板中w25q128对应的管脚连接关系如图6-10所示。
图6-12 w25q128电路原理图及其引脚
6.9.2 w25q128****读写操作w25q128内部有一个“spi command & control logic”,可以通过spi接口向其发送指令,从而执行相应操作。指令的长度是不定的,有单字节的,也有多字节的,w25qxx一共具有34个操作指令,在此只列举常用的12个,具体如表6-13所示。
百慕大监管机构向两家新运营商发放牌照,并暂时禁止部署5G服务
芯盾时代持续推动车联网安全行业有序健康发展
雷军公布小米造车计划 小米首款折叠屏小米MIX FOLD发布 售9999元起
哪些因素影响着环氧树脂点胶加工的不良率
区块链需要改变才可能改变世界
一文讲透SPI总线和IIC总线通信3
Quanergy和PARIFEX合作发布基于3D LiDAR的超速抓拍系统
直线电机激光打标帮你解决茶杯花纹掉色问题
LEM国产替代|芯森高精度磁通门电流传感器在BMS中的应用
对话FF91副总裁 2018年肯定会交付
英特尔公布 i5-10500H 参数:与上代 i7-9750H 基本相同
基于ARM7单片机和Linux+RTCORBA架构实现嵌入式代理服务器的应用方案
基于Digipcba平台创建共享元器件库
利用可编程芯片革新区块链的基础设施
关于图像清晰度、通透度的描述
什么是叫3G无线上网卡
智能定位技术在生活中的应用
大众CEO马蒂亚斯·穆勒开怼特斯拉,称只会烧钱和裁员毫无社会责任!
电脑硬件的故障问题
四维图新助力华为自动驾驶验证,为华为定制高精度地图数据