W25Q128的SPI通信原理及编程举例——通俗讲解

一、原理方块图

W25Q128的SPI通信原理及编程举例——通俗讲解_第1张图片

              正规电子原理解说

①根据方块图了解主机、从机的spi的硬件内外配置及其相关功能

W25Q128的SPI通信原理及编程举例——通俗讲解_第2张图片

如果是单片机上的spi则会有很多相关寄存器配置spi通信的模式或读取spi通信状态,这个需要根据不同单片机型号去查这单片机数据手册然后写对应程序最终初始化好spi,或者功能运作过程中有需要可读取通信状态。

举个例子就是下面这个单片机上对于spi通信记录其状态的标志。

 

②数据传输规则

W25Q128的SPI通信原理及编程举例——通俗讲解_第3张图片

 

③通信规则(以数据传输规则为基础,区别于主从机硬件类型的一种信息搬运规则)

不同的通信硬件做主机(主机一般是单片机)/从机他们的规则不一样,指令对应的字码也不一样

以单片机作为主机,W25Q128储存块为例子,看看代码就知道,通信过程每次数据传递都离不开一些命令规则,这些命令规则是他们交互的“暗号”。至于什么时候什么情况要用什么样的“暗号”做什么规则定死的功能,不同型号的储存块都不一样,这个需要查其数据手册知道才能对应编程控制。

接下来看看一下资料官方经过成功测试的代码,看看是不是确实这样(没兴趣了解W25Q128的同学们自行跳过片段,直接看spi应用思路),只看底层功能封装函数,其次不是主要讲解W25Q128所以它的原理不在这赘述,它的控制代码也不细讲,只去看看它控制代码是不是和我说的原理那样没做一个事都要发送对应的“暗号”才开始执行。

下面举例基于stm32f407单片机SPI通信收发数据的函数

u8 SPI1_ReadWriteByte(u8 TxData)

{    

 

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区为空

 

SPI_I2S_SendData(SPI1, TxData); //发送数据

 

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收

 

return SPI_I2S_ReceiveData(SPI1); //读取数据(根据spi通信原理可知道,发送数据同时也可以读到改位置原有的数据。以此再可知,想读取数据同样要发一个同等长度的数据才可以接收数据)

      

}

下面举例基于SPI通信的W25Q128模块的命令函数

①函数作用发送:写W25Q128状态寄存器前需要发送的命令

void W25QXX_Write_SR(u8 sr)   

{   

W25QXX_CS=0;                            //cs引脚拉低电平,即片选信号,选中该片(使能)

SPI1_ReadWriteByte(W25X_WriteStatusReg);   //发送写状态寄存器的命令(命令也是0或1的二进制数组成的,所以调用发送数据函数),W25X_WriteStatusReg这个是头文件的宏定义参数,代表0x01

SPI1_ReadWriteByte(sr);               //写入一个字节,也就是寄存器的地址,指定要操作的寄存器(sr同样是一个二进制数代表寄存器的地址)

W25QXX_CS=1;                            //取消片选           

}   

②函数作用:读取W25Q128中flash的数据

void W25QXX_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)   

{

  u16 i;        

W25QXX_CS=0;                            //片选信号同上

    SPI1_ReadWriteByte(W25X_ReadData);         //发送相关命令才能进行对应操作(同上)  

    SPI1_ReadWriteByte((u8)((ReadAddr)>>16));  //接下来根据W25Q128特性需要发送读取数据的地址(24bit)  

    SPI1_ReadWriteByte((u8)((ReadAddr)>>8));   

    SPI1_ReadWriteByte((u8)ReadAddr);   

    for(i=0;i

{

        pBuffer[i]=SPI1_ReadWriteByte(0XFF);   //循环接收3次(因为每次接收一个字节);前面的函数讲了,spi通信,接收数据同时要发送一个数据(这个数据可以任意,但一般为0xff,因为写入0xff到储存块地址里面数据就是11111111代表数据被擦除)才能返回数据

    }

W25QXX_CS=1;              

}  

  • Spi应用思路通俗解说

①以人工搬砖做类比(硬件搬的是数据,人搬的就是砖头(滑稽一下))

②以人与人之间交流传递信息做类比(硬件交流的就是0或1也就是计算机语言,人交流的是自然语言)

视频通俗讲解有我个人的对应的b站视频https://space.bilibili.com/83738746/setting

这里还有其他技术应用讲解

 

 

 

 

你可能感兴趣的:(模块学习,单片机学习)