当前位置: 首页 > news >正文

word可以做招聘网站吗只做硬件网站

word可以做招聘网站吗,只做硬件网站,福田做商城网站建设找哪家公司好,北京网页设计与网站建设一、SPI总线概述 1、SPI总线介绍 SPI是一种通信协议#xff0c;它是摩托罗拉公司研发出来的一种通信协议#xff0c;就有自己的特点#xff08;串行#xff0c;并行#xff0c;单工#xff0c;半双工#xff0c;全双工#xff0c;同步异步#xff09;。它主要应用于音…一、SPI总线概述 1、SPI总线介绍 SPI是一种通信协议它是摩托罗拉公司研发出来的一种通信协议就有自己的特点串行并行单工半双工全双工同步异步。它主要应用于音视频的开发. SPI是串行外设接口Serial Peripheral Interface的缩写是一种高速的全双工同步的通信总线并且在芯片的管脚上只占用四根线节约了芯片的管脚同时为PCB的布局上节省空间提供方便正是出于这种简单易用的特性越来越多的芯片集成了这种通信协议. 一般的通信速度可以达到几十Mhz SPISerial Peripheral Interface是一种串行外设接口标准用于在微控制器或其他数字设备之间进行通信。它被广泛应用于各种应用领域如通信、嵌入式系统和传感器网络等。 2、SPI总线接口与物理拓扑结构 SPI按照接线的不同分为3线SPI与4线SPI。 同步串行全双工 同步串行半双工 物理上的连接是怎么样的 使用SPI协议重点是知道里面的一个时序的情况如果知道了这种情况完全可以实现这种协议。 SPI协议是一种一主多从的形式 可以通过片选线来选中不同的从机 时钟线信号只能由主机控制从机受到主机发出的时钟信号来做出相应的处理 针对主机而言 当时钟线产生上升沿时接收数据当时钟线产生下降沿时发送数据 当时钟线产生下降沿时接收数据当时钟线产生上升沿时发送数据 3、SPI总线通信原理 SPI可以配置为4种模式SPI控制器 MODE0-MODE3 4、SPI总线数据格式 8位的数据高位先发 SPI的通信过程其实就是数据交换的过程 首先需要拉低片选线 再根据当前的边沿决定是发送数据还是接收数据上升沿发送下降沿接收 结束本次通信拉高片选线 用IO口来实现SPI协议 写伪代码不是真正可以实现的不过可以实现相应的逻辑 当前选择模式0CPHA 0, CPOL 0下降沿发送数据上升沿接收数据 SCK, MOSI, MISO,CS U8 Data 0;//0000 0000 CS 0;//选中这个芯片 SCK 1; for(i 0; i 8 ;i) {SCK 0;MOSI 0/1;SCK 1;Data 1;//空出低位的操作,data 0000 0100if(MISO){Data | 1;//0000 0001} } 二、SPI控制器 1、SPI的控制器特征 基于三条线的全双工同步传输(通过一个标志位的切换达到所谓的双工通信)     ● 基于双线的单工同步传输其中一条可作为双向数据线     ● 8 位或 16 位传输帧格式选择     ● 主模式或从模式操作     ● 多主模式功能     ● 8 个主模式波特率预分频器最大值为 fPCLK/2fpclk就是看当前用的SPI是在哪根总线上     ● 从模式频率最大值为 fPCLK/2     ● 对于主模式和从模式都可实现更快的通信     ● 对于主模式和从模式都可通过硬件或软件进行 NSSCS管脚 管理动态切换主 /从操作     ● 可编程的时钟极性和相位     ● 可编程的数据顺序最先移位 MSB 或 LSB        ● 可触发中断的专用发送和接收标志     ● SPI 总线忙状态标志     ● SPI TI 模式     ● 用于确保可靠通信的硬件 CRC 功能— 在发送模式下可将 CRC 值作为最后一个字节发送— 根据收到的最后一个字节自动进行 CRC 错误校验● 可触发中断的主模式故障、上溢和 CRC 错误标志● 具有 DMA 功能的 1 字节发送和接收缓冲器发送和接收请求 2、SPI控制器框架分析 SPI接口STM32的SPI控制器有多个SPI接口每个SPI接口可以连接多个SPI从设备。每个SPI接口都包含用于发送和接收数据的寄存器。SPI接口提供了多种配置选项如时钟极性、时钟相位、数据位数等。 主设备和从设备在SPI通信中系统中的一个设备充当主设备它发起和控制数据传输。其他设备则充当从设备它们响应主设备的命令并提供数据。主设备通过选择从设备来确定与之通信的目标。 缓冲器和寄存器SPI控制器使用缓冲器和寄存器来存储发送和接收的数据。主设备通过将数据写入发送缓冲器来发送数据从设备通过读取接收缓冲器来接收数据。SPI控制器还包含用于控制和配置的寄存器。 时钟设置SPI控制器使用时钟信号来同步数据传输。时钟信号由主设备控制可以通过配置时钟极性和相位来设置时钟信号的工作方式。 SPI控制器的工作流程如下 主设备选择从设备并开始传输。主设备将数据写入发送缓冲器。主设备发送时钟信号从设备接收数据。从设备将接收到的数据存储到接收缓冲器。主设备继续发送数据并重复上述过程直到传输完成。 3、相关寄存器 SPI 控制寄存器 1 (SPI_CR1) 不用于 I 2 S 模式 SPI 数据寄存器 (SPI_DR) SPI 状态寄存器 (SPI_SR) SR寄存器用于提示当前能不能发生或者接收下一个字节的数据 等到发送缓冲区为空就可以继续发下一个字节的数据 等到接收缓冲区为空就可以继续接收下一个字节的数据 三、W25Q64芯片 1、芯片介绍 W25Q64 (64M-bit) W25Q16(16M-bit) 和 W25Q32(32M-bit) 是为系统提供一个最小的空间、引脚和功耗的存储器解决方案的串行 Flash 存储器。 25Q 系列比普通的串行 Flash 存储器更灵活性能更优越。基于双倍/四倍的 SPI它们能够可以立即完成提供数据给 RAM 包括存储声音、文本和数据。芯片支持的工作电压 2.7V 到 3.6V正常工作时电流小于 5mA掉电时低于 1uA。所有芯片提供标准的封装。W25Q64/16/32 由每页 256 字节组成。 每页的 256 字节用一次页编程指令即可完成。每次可以擦除 16 页1个扇区、 128 页32KB 块、 256 页 64KB 块和全片擦除。 256字节 1页 16页 1个扇区 16个扇区   1个块 W25Q64 的内存空间结构 一页 256 字节 4K(4096 字节) 为一个扇区 16 个扇区为 1 块 容量为 8M 字节, 共有 128 个块, 2048 个扇区。 FLASH: 可读可写只能写入0不能写入1只有把1变0的能力 擦除的概念写数据之前要先擦除擦除就是全部数据变为1 1111 1111 1010 1010 当前W25Q64这个芯片最少擦除4096字节就是一个扇区然后去使用 具有唯一的 64 位识别序列号。 ● SPI 串行存储器系列                                          ●灵活的 4KB 扇区结构 -W25Q64:64M 位/8M 字节                                     -统一的扇区擦除 4K 字节 -W25Q16:16M 位/2M 字节                                     -块擦除 32K 和 64K 字节 -W25Q32:32M 位/4M 字节                                     -一次编程 256 字节 -每 256 字节可编程页                                            -至少 100,000 写/擦除周期 -数据保存 20 年 2、芯片管脚说明 CS -- 片选 DO -- 数据输出MISO DI -- 数据输入MOSI Clk -- 时钟线 3、芯片工作原理 W25Q64/16/32兼容的SPI 总线包含四个信号串行时钟 CLK、片选端 /CS、串行数据输入 DI和串行数据输出 DO。标准的 SPI 用 DI 输入引脚在 CLK 的上升沿连续的写命令、地址或数据到芯片内。 DO 输出在 CLK 的下降沿从芯片内读出数据或状态。     支持 SPI 总线的工作模式 0 0 0和 3 1 1。模式 0 和模式 3 的主要区别在于常态时的 CLK 信号当 SPI 主机已准备好数据还没传输到串行 Flash 中对于模式 0 CLK 信号常态为低.串行时钟输入引脚为串行输入和输出操作提供时序。见 SPI 操作设备数据传输是从高位开始 数据传输的格式为8bit, 数据采样从第二个时间边沿开始 空闲状态时 时钟线 clk 为高电平。 当前这个器件可用的SPI时序符合前面所讲到的模式0和模式3模式0/3:上升沿接收数据下降沿发送数据 模式1/2:上升沿发送数据下降沿接收数据 支持模式0的一般就会支持模式3支持模式1的一般就会支持模式2 4、芯片操作时序 读ID的时序 拉低片选线CS DI线就是代表代码里需要发送的数据 DO线就代表代码里接收到的数据 读取制造商/设备 ID 指令可以读取,制造商 ID 和特定的设备 ID。 读取之间 拉低 CS 片选信号 接着发送指令代码“90h” 紧随其后的是一个 24 位地址(A23-A0)000000h。之后 设备发出华邦子制造商 ID(EFh) 和设备ID(w25q64 为 16h)。如果 24 位地址设置为 000001 h 的设备 ID 会先发出,然后跟着制造商 ID。制造商和设备 ID 可以连续读取。完成指令后 片选信号/ CS 拉高。 写使能 拉低片选 接着发0x06的写使能指令 拉高片选 读状态寄存器 先拉低片选 接着发05这条指令代表存储芯片当前需要去读状态寄存器1 接下来就可以读回来状态寄存器的8个位了 拉高片选 扇区擦除 扇区擦除指令可以擦除指定一个扇区(4 k 字节)内所有数据 将内存空间恢复到 0xFF 状态。 写入扇区擦除指令之前必须执行设备写使能(发送设备写使能指令 0x06) 并判断状态寄存器(状态寄存器位最低位必须等于 0 才能操作)。发送的扇区擦除指令前 先拉低/ CS 接着发送扇区擦除指令码”20 h” 和 24 位地址(A23-A0) 地址发送完毕后拉高片选线 CS/, 并判断状态位等待擦除结束。 擦除一个扇区的最少需要 150ms 时间。 写使能 判断状态寄存器的第0位 先拉低片选 发送0x20的指令 发送24位的地址当前你要擦除的地址是哪里--首地址这个地址只能是4096的倍数 拉高片选线 页编程指令 页编程指令允许从一个字节到 256 字节的数据编程(一页)(编程之前必须保证内存空间是 0XFF--要先擦除)。允许写入指令之前,必须先发送设备写使能指令。 写使能开启后 设备才能接收编程指令。 开启页编程先拉底/ CS 然后发送指令代码“02 h” 接着发送一个 24 位地址开始存放数据的地址(A23-A0)(发送 3 次每次 8 位) 和至少一个数据字节(数据字节不能超过 256字节)。 数据字节发送完毕 需要拉高片选线 CS/,并判断状态位 等待写入结束。进行页编程时如果数据字节数超过了 256 字节 地址将自动回到页的起始地址 覆盖掉之前的数据。 在某些情况下,数据字节小于 256 字节(同一页内) 也可以正常对其他字节存放 不会有任何影响。如果存放超过 256 字节的数据 需要分次编程存放。 写使能 拉低片选 发送页编程指令0x02 发送24位的地址 发送需要存下来的数据不能超过当前页的最大地址如果超过则会回到当前页的起始地址开始存放 拉高片选 判断当前写入完成没有读状态寄存器1的第0位 读数据 读取数据指令允许按顺序读取一个字节的内存数据。当片选 CS/拉低之后 紧随其后是一个 24 位的地址(A23-A0)(需要发送 3 次 每次 8 个字节 先发高位)。芯片收到地址后将要读的数据按字节大小转移出去 数据是先转移高位对于单片机时钟下降沿发送数据上升沿接收数据。 读数据时 地址会自动增加 允许连续的读取数据。这意味着读取整个内存的数据,只要用一个指令就可以读完。 数据读取完成之后 片选信号/ CS 拉高。读取数据的指令序列,如上图所示。 如果一个读数据指令而发出的时候 设备正在擦除扇区,或者(忙 1) 该读指令将该读指令将被忽略,也不会对当前周期有什么影响。 拉低片选 先发一个0x03的指令 发送要从哪个地址开始读取数据24位的地址 再去读取数据 拉高片选 四、模拟SPI #include spi.h/************************************ 函数功能初始化SPI的管脚 函数形参void 函数返回值void 函数说明CS -- PB14: 推挽输出可以选中也可以释放--有低电平也有高电平 MISO -- PA6: 浮空输入 MOSI -- PA7: 推挽输出 SCK -- PA5: 推挽输出 作者 日期 ************************************/ void Spi_Port_Init(void) {//打开GPIOA和GPIOB的时钟RCC-AHB1ENR | 0x3 0;//配置输出//配置的是PA5--SCKGPIOA-MODER ~(0X3 10);GPIOA-MODER | (0X1 10);//配置的是PA7--MOSIGPIOA-MODER ~(0X3 14);GPIOA-MODER | (0X1 14);//配置的是PB14--CSGPIOB-MODER ~(0X3 28);GPIOB-MODER | (0X1 28);//配置输入GPIOA-MODER ~(0X3 12);//把速度配置为50MhzGPIOA-OSPEEDR ~(0X3F 10);GPIOA-OSPEEDR | (0X2A 10); }/************************************ 函数功能模拟SPI来读写数据 函数形参u8 data -- 需要发送的数据 函数返回值u8 -- 接收回来的数据可以通过返回值给调用者 函数说明data 1011 0011 高位先发 下降沿发送数据上升沿接收数据 作者 日期 ************************************/ u8 Spi_Change_Data(u8 data) {u8 rec_data 0;u8 i 0;for(i 0; i 8; i){SCK_L;//代表产生下降沿可以开始发送数据//1011 0011 //0100 0000//spi不需要加延时if(data (0x80 i)){MOSI_H;}else{MOSI_L;}SCK_H;//代表产生上升沿可以开始接收数据rec_data 1;//可以空出最低位if(MISO){rec_data | 1;}}return rec_data; }#ifndef __SPI_H_ #define __SPI_H_#include stm32f4xx.h #include io_bit.h#define SCK_H (GPIOA-ODR | 0X1 5) #define SCK_L (GPIOA-ODR ~(0X1 5)) #define MOSI_H (GPIOA-ODR | 0X1 7) #define MOSI_L (GPIOA-ODR ~(0X1 7)) #define CS_H (GPIOB-ODR | 0X1 14) #define CS_L (GPIOB-ODR ~(0X1 14)) #define MISO PAin(6)void Spi_Port_Init(void); u8 Spi_Change_Data(u8 data); #endif 五、SPI控制器 1、硬件设计 CS: 推挽输出可以选中也可以释放--有低电平也有高电平 MISO: 浮空输入 MOSI: 推挽输出 SCK : 推挽输出 2、软件设计 GPIO口配置 SPI配置 #include spi.h/************************************ 函数功能初始化SPI的管脚 函数形参void 函数返回值void 函数说明CS -- PB14: 推挽输出可以选中也可以释放--有低电平也有高电平 MISO -- PA6: 浮空输入 MOSI -- PA7: 推挽输出 SCK -- PA5: 推挽输出 作者li 日期2021.8.6 ************************************/ void Spi_Port_Init(void) {//打开GPIOA和GPIOB的时钟RCC-AHB1ENR | 0x3 0;//PA5-7配置为复用功能GPIOA-MODER ~(0X3F 10);GPIOA-MODER | (0X2A 10);//复用到SPI1GPIOA-AFR[0] ~(0XFFF 20);GPIOA-AFR[0] | (0X555 20);//把速度配置为50MhzGPIOA-OSPEEDR ~(0X3F 10);GPIOA-OSPEEDR | (0X2A 10);//配置的是PB14--CSGPIOB-MODER ~(0X3 28);GPIOB-MODER | (0X1 28);//打开SPI1的时钟RCC-APB2ENR | 0X1 12;SPI1-CR1 0;/*选择双线单向通信数据模式为发送 /接收选择 8 位数据帧格式全双工发送和接收先发送 MSBfPCLK/2下降沿发送数据上升沿接收数据*///使能软件从器件管理SPI1-CR1 | 0X3 8;//主模式SPI1-CR1 | 0X1 2;//使能外设SPI1-CR1 | 0X1 6; }/************************************ 函数功能 函数形参u8 data -- 需要发送的数据 函数返回值u8 -- 接收回来的数据可以通过返回值给调用者 函数说明data 1011 0011 高位先发 下降沿发送数据上升沿接收数据 作者 日期 ************************************/ u8 Spi_Change_Data(u8 data) {u8 rec_data 0;while(!(SPI1-SR 0X1 1))//当前发送缓冲区为空才能跳出循环{}SPI1-DR data;//发送数据while(!(SPI1-SR 0X1 0))//当前接收缓冲区为空才能跳出循环{}rec_data SPI1-DR;//接收数据return rec_data; } #ifndef __SPI_H_ #define __SPI_H_#include stm32f4xx.h #include io_bit.h#define SCK_H (GPIOA-ODR | 0X1 5) #define SCK_L (GPIOA-ODR ~(0X1 5)) #define MOSI_H (GPIOA-ODR | 0X1 7) #define MOSI_L (GPIOA-ODR ~(0X1 7)) #define CS_H (GPIOB-ODR | 0X1 14) #define CS_L (GPIOB-ODR ~(0X1 14)) #define MISO PAin(6)void Spi_Port_Init(void); u8 Spi_Change_Data(u8 data); #endif #include w25q64.h/************************************ 函数功能读厂商ID 函数形参void 函数返回值void 函数说明发送的指令是0x90 正常接收到的是0xef16 作者 日期 ************************************/ void Read_ID(void) {u16 w25q64_id 0;CS_L;//拉低CS的片选信号也就是选中这一个芯片Spi_Change_Data(0x90);//发送读ID的指令//发送24位的0Spi_Change_Data(0);Spi_Change_Data(0);Spi_Change_Data(0);w25q64_id Spi_Change_Data(0);//得到厂商ID为EFh,此时发什么不重要w25q64_id 8;//把接收到的数据存放到16位数据中的高8位w25q64_id | Spi_Change_Data(0xff);CS_H;//拉高片选表示这一次通信结束printf(%#x\r\n,w25q64_id); }/************************************ 函数功能写使能 函数形参void 函数返回值void 函数说明发送的指令是0x06 作者 日期 ************************************/ void Write_Enable(void) {CS_L;Spi_Change_Data(0X06);CS_H; }/************************************ 函数功能读状态寄存器1 函数形参void 函数返回值u8 函数说明发送的指令是0x05 作者 日期 ************************************/ u8 Read_Register1(void) {u8 reg 0;CS_L;Spi_Change_Data(0X05);reg Spi_Change_Data(0);CS_H;return reg; }/************************************ 函数功能扇区擦除 函数形参u32 addr 函数返回值void 函数说明发送的指令是0x20 地址只能是4096的倍数 00000000 00000000 00010000 00000000 作者 日期 ************************************/ void Sector_Erase(u32 addr) {u8 *p (u8*)addr;//现在是得到32位里的最低8位u8 ret;Write_Enable();//直到不忙才可以往下执行do{ret Read_Register1();}while(ret 0x1 0);CS_L;Spi_Change_Data(0x20);//发送这24位的地址数据Spi_Change_Data(p[2]);Spi_Change_Data(p[1]);Spi_Change_Data(p[0]);CS_H;//直到不忙才可以往下执行do{ret Read_Register1();}while(ret 0x1 0); }/************************************ 函数功能页编程 函数形参u32 addr--从这一页的哪个位置开始写入数据 u8 *str, -- 需要写入的数据 u8 len --数据的长度 函数返回值void 函数说明发送的指令是0x02 当前擦除了哪一个扇区就可以在当前扇区的某一页写入数据 最大写入256字节 作者 日期 ************************************/ void Page_Program(u32 addr,u8 *str,u8 len) {u8 *p (u8*)addr;//现在是得到32位里的最低8位u8 ret;Write_Enable();//直到不忙才可以往下执行do{ret Read_Register1();}while(ret 0x1 0);CS_L;Spi_Change_Data(0x02);//发送这24位的地址数据Spi_Change_Data(p[2]);Spi_Change_Data(p[1]);Spi_Change_Data(p[0]);while(len--){Spi_Change_Data(*str);str;}CS_H;//直到不忙才可以往下执行do{ret Read_Register1();}while(ret 0x1 0);}/************************************ 函数功能读数据 函数形参u32 addr--从这一页的哪个位置开始读取数据 u8 *str, -- 读取到的数据存放的地方 u8 len -- 数据的长度 函数返回值void 函数说明发送的指令是0x03 可以一直读到芯片最后 作者 日期 ************************************/ void Read_Data(u32 addr,u8 *str,u8 len) {u8 *p (u8*)addr;//现在是得到32位里的最低8位u8 ret;CS_L;Spi_Change_Data(0x03);//发送这24位的地址数据Spi_Change_Data(p[2]);Spi_Change_Data(p[1]);Spi_Change_Data(p[0]);while(len--){*str Spi_Change_Data(0);str;}CS_H; }/************************************ 函数功能跨页写 函数形参u32 addr--从这一页的哪个位置开始读取数据 u8 *str, -- 读取到的数据存放的地方 u8 len -- 数据的长度 函数返回值void 函数说明一次性可以发送多于256字节的数据到FLASH里 问题当前的页编程不能超过本页的最大地址 解决 需要判断什么时候到达本页的最大地址了 如果已经到了则地址自动跳转到下一页判断这一页还剩多少空间如果不够再去换页写入作者 日期 ************************************/ void Page_AutoWrite(u32 addr,u8 *str,u8 len)//addr 0,len 289 {u16 less_len 0;less_len 256 - addr % 256;//判断任意一页还剩多少空间可以写//如果剩余的空间足够存下要写入的数据则写入数据长度为当前数据长度if(less_lenlen){less_len len;}while(1){//写入数据Page_Program(addr,str,less_len);//判断当前页剩余空间是不是已经等于要写入数据的长度如果相等则不需要换页if(less_len len){break;}//4564654addr less_len;//代表当前地址的偏移str less_len;//加上已经写入的长度可以去到未写入的数据的位置len len - less_len;//代表未写入的数据长度less_len 256;//当前如果能跑到这一步肯定是到下一页的起始地址了if(less_lenlen)//1024{less_len len;}} }#ifndef __W25Q64_H_ #define __W25Q64_H_#include stm32f4xx.h #include io_bit.h #include spi.h #include stdio.hvoid Read_ID(void); void Sector_Erase(u32 addr); void Page_Program(u32 addr,u8 *str,u8 len); void Read_Data(u32 addr,u8 *str,u8 len); void Page_AutoWrite(u32 addr,u8 *str,u8 len);#endif
http://www.zqtcl.cn/news/65375/

相关文章:

  • 怎样用godaddy建设一个网站免费行情软件app网站大全下载免费
  • 国内做的好看的网站网页版面布局设计步骤
  • 解释网站为什么这样做石家庄seo网站优化
  • 宁波网站建设制作多少钱wordpress微博样式评论
  • 成品网页网站福建做网站的公司
  • 山东爱易网站建设工作室女教师遭网课入侵直播录屏曝光i
  • 网站建设可以在家做吗公众号编辑器免费模板
  • 用dw6做网站江西网站开发方案
  • 企业网站建设的常见流程找人做任务网站有哪些
  • 做的网站被注销wordpress七牛云缓存插件
  • 游戏行业seo整站优化创建
  • 网站建设中服务器的搭建方式有几种jsp网站访问万维网
  • 校园网站集群建设wordpress音乐加载慢
  • 网站服务费网络建设会计分录微信代运营收费标准
  • 做推广必须知道的网站吗什么后台做网站安全
  • 如何做环保管家网站网站修改用什么工具
  • 网站开发建设中甘肃省建设厅网站
  • 做网站分什么软件网站电脑版和手机版区别
  • 毕业设计是做网站设计网站怎么集成支付宝
  • 开网站挣不挣钱vps网站如何设置缓存
  • 济南专门做公司网站的公司wordpress移动端广告位
  • 哈尔滨网站开发电话免费英文网站模板
  • 做面食视频网站网站建设和网页设计的关系
  • 互联网行业招聘网站移动公司需要网络工程专业
  • 成品网站源码68w68游戏福田祥菱双排座小货车
  • asp网站耗资源台州网站建设找哪家好点
  • dx网站是哪家公司做的建设对公银行网站打不开
  • 企业网站帮助中心excel做网页放进网站
  • 模版建站西安做网站缑阳建
  • 网站开发开题报告计划进度安排平台推广精准客源