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

网站首页的尺寸wordpress google统计

网站首页的尺寸,wordpress google统计,想自学软件开发难吗,物联网专业STM32——SPI接口 宗旨#xff1a;技术的学习是有限的#xff0c;分享的精神是无限的。 一、SPI协议【SerialPeripheral Interface】 串行外围设备接口#xff0c;是一种高速全双工的通信总线。在ADC/LCD等与MCU间通信。 1、SPI信号线 SPI 包含 4 条总线#xff0c;SPI 总…STM32——SPI接口 宗旨技术的学习是有限的分享的精神是无限的。 一、SPI协议【SerialPeripheral Interface】 串行外围设备接口是一种高速全双工的通信总线。在ADC/LCD等与MCU间通信。 1、SPI信号线 SPI 包含 4 条总线SPI 总线包含 4 条总线分别为SS 、SCK、MOSI、MISO。 1SSSlaveSelect片选信号线当有多个 SPI 设备与 MCU 相连时每个设备的这个片选信号线是与 MCU 单独的引脚相连的而其他的 SCK、MOSI、MISO 线则为多个设备并联到相同的 SPI 总线上低电平有效。 2SCK Serial Clock时钟信号线由主通信设备产生不同的设备支持的时钟频率不一样如 STM32 的 SPI 时钟频率最大为 f PCLK /2。 3MOSI Master Output, Slave Input主设备输出 / 从设备输入引脚。主机的数据从这条信号线输出从机由这条信号线读入数据即这条线上数据的方向为主机到从机。 4MISOMaster Input, Slave Output主设备输入 / 从设备输出引脚。主机从这条信号线读入数据从机的数据则由这条信号线输出即在这条线上数据的方向为从机到主机。 2、SPI模式 根据 SPI 时钟极性CPOL和时钟相位CPHA 配置的不同分为 4 种 SPI 模式。时钟极性是指 SPI 通信设备处于空闲状态时也可以认为这是 SPI 通信开始时即SS 为低电平时SCK 信号线的电平信号。CPOL0 时 SCK 在空闲状态时为低电平CPOL1 时则相反。时钟相位是指数据采样的时刻当 CPHA0 时MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的奇数边沿被采样。当 CPHA1 时数据线在 SCK 的偶数边沿采样。 首先由主机把片选信号线SS 拉低意为主机输出在SS 被拉低的时刻SCK 分为两种情况若我们设置为 CPOL0则 SCK 时序在这个时刻为低电平若设置为 CPOL1则 SCK 在这个时刻为高电平。采样时刻都是在 SCK 的奇数边沿(注意奇数边沿有时为下降沿有时为上升沿)。 CPHA1时数据信号的采样时刻为偶数边沿。 二、SPI特性及架构 1单次传输可选择为 8 或 16 位。 2波特率预分频系数(最大为 fPCLK/2) 。 3时钟极性(CPOL)和相位(CPHA)可编程设置 。 4数据顺序的传输顺序可进行编程选择MSB 在前或 LSB 在前。 5可触发中断的专用发送和接收标志。 6可以使用 DMA 进行数据传输操作。 1、SPI架构 MISO 数据线接收到的信号经移位寄存器处理后把数据转移到接收缓冲区然后这个数据就可以由我们的软件从接收缓冲区读出了。 当要发送数据时我们把数据写入发送缓冲区硬件将会把它用移位寄存器处理后输出到 MOSI 数据线。 SCK 的时钟信号则由波特率发生器产生我们可以通过波特率控制位BR来控制它输出的波特率。 控制寄存器 CR1 掌管着主控制电路STM32 的 SPI 模块的协议设置时钟极性、相位等就是由它来制定的。而控制寄存器 CR2 则用于设置各种中断使能。 最后为 NSS 引脚这个引脚扮演着 SPI 协议中的SS 片选信号线的角色如果我们把 NSS 引脚配置为硬件自动控制SPI 模块能够自动判别它能否成为 SPI 的主机或自动进入 SPI 从机模式。但实际上我们用得更多的是由软件控制某些 GPIO 引脚单独作为SS信号这个 GPIO 引脚可以随便选择。 三、SPI接口读取Flash 各信号线相应连接到 Flash型号 W25X16/W25Q16的 CS、CLK、DO 和 DIO 线实现SPI 通信对 Flash进行读写其中 W25X16 和 W25Q16 在程序上不同的地方是 FLASH 的ID 不一样。 读取 Flash 的 ID 信息写入数据并读取出来进行校验通过串口打印写入与读取出来的数据输出测试结果。 不同的设备都会相应的有不同的指令如 EEPROM 中会把第一个数据解释为存储矩阵的地址实质就是指令。而 Flash 则定义了更多的指令有写指令、读指令、读ID 指令等。 SPI-FLASH通信 1配置 I/O端口使能 GPIO。 2根据将要进行通信器件的 SPI模式配置 STM32的 SPI使能 SPI时钟。 3配置好 SPI后根据各种 Flash定义的命令控制对它的读写。 注意在写操作前要先进行存储扇区的擦除操作擦除操作前也要先发出“写使能”命令 1、 main.c int main(void) {/* 配置串口 1 为115200 8-N-1 */USART1_Config();printf(\r\n 这是一个 2M 串行 flash(W25X16)实验 \r\n);/* 2M 串行 flash W25Q16 初始化 */SPI_FLASH_Init();/* Get SPI Flash Device ID */DeviceID SPI_FLASH_ReadDeviceID();Delay( 200 );/* Get SPI Flash ID */FlashID SPI_FLASH_ReadID();printf(\r\n FlashID is 0x%X, Manufacturer Device ID is 0x%X\r\n, FlashID, DeviceID);/* Check the SPI Flash ID */if (FlashID sFLASH_ID) /* #define sFLASH_ID 0xEF3015 */{printf(\r\n 检测到串行 flash W25X16 !\r\n);SPI_FLASH_SectorErase(FLASH_SectorToErase);SPI_FLASH_BufferWrite(Tx_Buffer, FLASH_WriteAddress, BufferSize);printf(\r\n 写入的数据为%s \r\t, Tx_Buffer);SPI_FLASH_BufferRead(Rx_Buffer, FLASH_ReadAddress, BufferSize);printf(\r\n 读出的数据为%s \r\n, Tx_Buffer);/* 检查写入的数据与读出的数据是否相等 */TransferStatus1 Buffercmp(Tx_Buffer, Rx_Buffer, BufferSize);if ( PASSED TransferStatus1 ){printf(\r\n 2M 串行 flash(W25X16)测试成功!\n\r);}else{printf(\r\n 2M 串行 flash(W25X16)测试失败!\n\r);}}// if (FlashID sFLASH_ID)else{printf(\r\n 获取不到 W25X16 ID!\n\r);}SPI_Flash_PowerDown();while (1); } 1调用 USART1Confi g() 初始化串口。 2调用 SPI_FLASH_Init() 初始化 SPI 模块。 3调用 SPI_FLASH_ReadDeviceID() 读取 Flash 器件生产厂商的 ID 信息。 4调用 SPI_FLASH_ReadID() 读取 Flash 器件的设备 ID 信息 5若读取得的ID正确 则调用 SPI_FLASH_SectorErase()把 Flash 的内 容擦除擦除后调用SPI_FLASH_BufferWrite() 向Flash 写入数据然后再调用SPI_FLASH_BufferRead()从刚刚写入的地址中读出数据。最后调用 Buffercmp() 函数对写入的数据与读取的数据进行比较若写入的数据与读出的数据相同则把标志变量TransferStatus1 赋值为 PASSED自定义的枚举变量。 6最后调用 SPI_Flash_PowerDown()函数关闭 Flash 设备的电源因为数据写入到Flash 后并不会因断电而丢失我们在使用它时才重新开启 Flash 的电源 2、SPI初始化 #define SPI_FLASH_CS_HIGH() GPIO_SetBits(GPIOA, GPIO_Pin_4) #define SPI_FLASH_CS_LOW() GPIO_ResetBits(GPIOA, GPIO_Pin_4)void SPI_FLASH_Init(void) {SPI_InitTypeDef SPI_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOD, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);/* SCK */GPIO_InitStructure.GPIO_Pin GPIO_Pin_5;GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP;GPIO_Init(GPIOA, GPIO_InitStructure);/* MISO */GPIO_InitStructure.GPIO_Pin GPIO_Pin_6;GPIO_Init(GPIOA, GPIO_InitStructure);/* MOS */GPIO_InitStructure.GPIO_Pin GPIO_Pin_7;GPIO_Init(GPIOA, GPIO_InitStructure);/* CS */GPIO_InitStructure.GPIO_Pin GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP;GPIO_Init(GPIOA, GPIO_InitStructure);SPI_FLASH_CS_HIGH();SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode SPI_Mode_Master;SPI_InitStructure.SPI_DataSize SPI_DataSize_8b;SPI_InitStructure.SPI_CPOL SPI_CPOL_High;SPI_InitStructure.SPI_CPHA SPI_CPHA_2Edge;SPI_InitStructure.SPI_NSS SPI_NSS_Soft;SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_4;SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB;SPI_InitStructure.SPI_CRCPolynomial 7;SPI_Init(SPI1, SPI_InitStructure);SPI_Cmd(SPI1, ENABLE); } 1SPI_Mode 主机模式SPI_Mode_Master或从机模式SPI_Mode_Slave这两个模式的最大区别为 SPI 的 SCK 信号线的时序SCK 的时序是由通信中的主机产生的。若被配置为从机模式STM32 的 SPI 模块将接受外来的 SCK 信号。 2SPI_DataSize SPI 每次通信的数据大小称为数据帧为 8 位还是 16 位。 3SPI_CPOL 和 SPI_CPHA 配置SPI的时钟极性CPOL和时钟相位CPHA这两个配置影响到 SPI 的通信模式该设置要符合将要互相通信的设备的要求。CPOL 分别可以取 SPI_CPOL_HighSPI 通信空闲时 SCK 为高电平和SPI_CPOL_LowSPI 通信空闲时 SCK 为低电平。CPHA 则可以取 SPI_CPHA_1Edge在 SCK 的奇数边沿采集数据 和 SPI_CPHA_2Edge在 SCK偶数边沿采集数据。 4SPI_NSS 配置NSS引脚的使用模式硬件模式SPI_NSS_Hard与软件模式SPI_NSS_Soft在硬件模式中的 SPI 片选信号由硬件自动产生而软件模式则需要我们亲自把相应的 GPIO 端口拉高或置低产生非片选和片选信号。如果外界条件允许硬件模式还会自动将 STM32 的 SPI 设置为主机。我们使用软件模式向这个成员赋值为 SPI_NSS_Soft。 5SPI_BaudRatePrescaler本成员设置波特率分频值分频后的时钟即为 SPI 的 SCK信号线的时钟频率。这个成员参数可设置为 f PCLK 的 2、4、6、8、16、32、64、128、256 分频。赋值为 SPI_BaudRatePrescaler_4即 f PCLK 的 4 分频。 6SPI_FirstBit所有串行的通信协议都会有 MSB 先行高位数据在前还是 LSB先行低位数据在前的问题而 STM32 的 SPI 模块可以通过这个结构体成员对这个特性编程控制。据 Flash 的通信时序我们向这个成员赋值为MSB先行SPI_FirstBit_MSB。 7SPI_CRCPolynomial这是 SPI 的 CRC 校验中的多项式若我们使用 CRC 校验时就使用这个成员的参数多项式来计算 CRC 的值。由于本实验的 Flash 不支持 CRC校验所以我们向这个结构体成员赋值为 7 实际上是没有意义的。 配置完这些结构体成员后我们要调用 SPI_Init() 函数把这些参数写入寄存器中实现SPI 的初始化然后调用 SPI_Cmd() 来使能 SPI1。 2、读FLASH的ID #define Dummy_Byte 0xFFu8 SPI_FLASH_SendByte(u8 byte) {// 等待发送数据寄存器清空while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) RESET);SPI_I2S_SendData(SPI1, byte); // 向从机发送数据while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_RXNE) RESET); // 等待接收数据寄存器非空return SPI_I2S_ReceiveData(SPI1); // 获取接收寄存器中的数据 } u32 SPI_FLASH_ReadDeviceID(void) {u32 Temp 0;SPI_FLASH_CS_LOW();SPI_FLASH_SendByte(W25X_DeviceID);SPI_FLASH_SendByte(Dummy_Byte);SPI_FLASH_SendByte(Dummy_Byte);SPI_FLASH_SendByte(Dummy_Byte);Temp SPI_FLASH_SendByte(Dummy_Byte);SPI_FLASH_CS_HIGH();return Temp; }span stylefont-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255); /span 3、读取厂商ID u32 SPI_FLASH_ReadID(void) {u32 Temp 0, Temp0 0, Temp1 0, Temp2 0;SPI_FLASH_CS_LOW();SPI_FLASH_SendByte(W25X_JedecDeviceID); // 0x9FTemp0 SPI_FLASH_SendByte(Dummy_Byte);Temp1 SPI_FLASH_SendByte(Dummy_Byte);Temp2 SPI_FLASH_SendByte(Dummy_Byte);SPI_FLASH_CS_HIGH();Temp (Temp0 16) | (Temp1 8) | Temp2;return Temp; } 4、擦除FLASH内容 void SPI_FLASH_WriteEnable(void) {SPI_FLASH_CS_LOW();SPI_FLASH_SendByte(W25X_WriteEnable); // 06HSPI_FLASH_CS_HIGH(); }void SPI_FLASH_WaitForWriteEnd(void) {u8 FLASH_Status 0;SPI_FLASH_CS_LOW();SPI_FLASH_SendByte(W25X_ReadStatusReg); // 05Hdo{FLASH_Status SPI_FLASH_SendByte(Dummy_Byte);}while ((FLASH_Status WIP_Flag) SET);SPI_FLASH_CS_HIGH(); }void SPI_FLASH_SectorErase(u32 SectorAddr) {SPI_FLASH_WriteEnable();SPI_FLASH_WaitForWriteEnd();SPI_FLASH_CS_LOW();SPI_FLASH_SendByte(W25X_SectorErase); // 20HSPI_FLASH_SendByte((SectorAddr 0xFF0000) 16);SPI_FLASH_SendByte((SectorAddr 0xFF00) 8);SPI_FLASH_SendByte(SectorAddr 0xFF);SPI_FLASH_CS_HIGH();SPI_FLASH_WaitForWriteEnd(); } 5、向Flash写数据——分页 void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite) {SPI_FLASH_WriteEnable();SPI_FLASH_CS_LOW();SPI_FLASH_SendByte(W25X_PageProgram); // 02HSPI_FLASH_SendByte((WriteAddr 0xFF0000) 16);SPI_FLASH_SendByte((WriteAddr 0xFF00) 8);SPI_FLASH_SendByte(WriteAddr 0xFF);if(NumByteToWrite SPI_FLASH_PerWritePageSize){NumByteToWrite SPI_FLASH_PerWritePageSize;}while (NumByteToWrite--){SPI_FLASH_SendByte(*pBuffer);pBuffer;}SPI_FLASH_CS_HIGH();SPI_FLASH_WaitForWriteEnd(); }void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite) {u8 NumOfPage 0, NumOfSingle 0, Addr 0, count 0, temp 0;Addr WriteAddr % SPI_FLASH_PageSize;count SPI_FLASH_PageSize - Addr;NumOfPage NumByteToWrite / SPI_FLASH_PageSize;NumOfSingle NumByteToWrite % SPI_FLASH_PageSize;if (Addr 0){if (NumOfPage 0){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);}else{while (NumOfPage--){SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);WriteAddr SPI_FLASH_PageSize;pBuffer SPI_FLASH_PageSize;}SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);}}else{if (NumOfPage 0){if (NumOfSingle count){temp NumOfSingle - count;SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);WriteAddr count;pBuffer count;SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);}else{SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);}}else{NumByteToWrite - count;NumOfPage NumByteToWrite / SPI_FLASH_PageSize;NumOfSingle NumByteToWrite % SPI_FLASH_PageSize;SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);WriteAddr count;pBuffer count;while (NumOfPage--){SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);WriteAddr SPI_FLASH_PageSize;pBuffer SPI_FLASH_PageSize;}if (NumOfSingle ! 0){SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);}}} } 6、从Flash读 void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead) {SPI_FLASH_CS_LOW();SPI_FLASH_SendByte(W25X_ReadData); // 03HSPI_FLASH_SendByte((ReadAddr 0xFF0000) 16);SPI_FLASH_SendByte((ReadAddr 0xFF00) 8);SPI_FLASH_SendByte(ReadAddr 0xFF);while (NumByteToRead--) {*pBuffer SPI_FLASH_SendByte(Dummy_Byte);pBuffer;}SPI_FLASH_CS_HIGH(); }
http://www.sadfv.cn/news/58564/

相关文章:

  • 网站设计制作平台哪个好重庆秀山网站建设
  • 网站推广免费 优帮云网页游戏网站排行
  • 婚纱摄影网站怎么建设网页设计与制作智慧树单元检测答案
  • 龙岗做网站多少钱公司网站可以免费建吗
  • 郑州网站推广方法优化推广网站推荐
  • 重庆建设工程质量协会网站建筑模板规格型号
  • 做网站前的准备wordpress php 得到页面描述
  • 医院网站 行风建设中建八局一公司总部
  • 网站方案建设书wordpress 搭建多站点
  • 营销型网站建设一般多少钱自己怎么做装修网站
  • 电力建设集团网站wordpress标签不输出文章
  • 苏州企业网站设计制作付费网站怎么做
  • 怎么用易语言做网站友链交换平台
  • 一学一做看视频网站wordpress首页随机推荐
  • 上海电商设计招聘网站横店八上信息书做网站的内容
  • 河南省建设厅网站103号文件电商网站建设公司排名
  • 网站建设初期的宣传网页设计与网页制作课程总结
  • 舞蹈东莞网站建设wordpress如何搭建网站
  • 市场调研数据网站下载代码的网站
  • 做详情页上什么网站找素材建设部网站投诉核查
  • 网站开发官网谷歌搜索引擎入口google
  • 淘宝联盟做的好的网站wordpress 导航菜单添加
  • 济南企业做网站推广网站网站建设目的功能
  • 好看的公司网站排版设计衡水安徽网站建设
  • 网站可以做2个公司的吗广州网络建站
  • 东莞南城网站开发公司电话网站开发做前端还是后端
  • 人设生成器网站太原论坛天涯社区
  • 电影网站设计模板制作一个网页的教程
  • 单片机程序员开发网站网站后台密码忘记了
  • 沈阳网站建设开发如何增加网站索引量