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

动漫网站设计模板制作网页链接的软件

动漫网站设计模板,制作网页链接的软件,建设部注册人员查询,wordpress 截取字符串开胃简介 根据上一节对STM32的SPI介绍#xff01;本节将进行硬件SPI的实现#xff0c;片选用软件实现#xff01;跟着Whappy走起#xff01;W25Q64的驱动层#xff0c;我们不需要更改#xff0c;仅仅需要更改一下SPI的协议#xff0c;即#xff1a;由软件实现改成硬件…开胃简介 根据上一节对STM32的SPI介绍本节将进行硬件SPI的实现片选用软件实现跟着Whappy走起W25Q64的驱动层我们不需要更改仅仅需要更改一下SPI的协议即由软件实现改成硬件实现。跟着Whappy同志步伐学起来 SPI硬件整体框架如下图代码配置也是根据这个SPI的基本结构进行实现的如下五步实现过程。 STM32的SPI相关库函数的介绍如下 初始化和配置函数 函数名功能参数介绍使用方法SPI_I2S_DeInit将 SPI/I2S 外设寄存器重置为默认值SPIx: SPI 外设地址在重新配置 SPI 前调用清除所有之前的配置SPI_Init根据指定配置初始化 SPISPIx: SPI 外设地址brSPI_InitStruct: SPI 配置结构体配置 SPI 通信参数如时钟极性、数据大小等I2S_Init根据指定配置初始化 I2SSPIx: SPI 外设地址brI2S_InitStruct: I2S 配置结构体配置 I2S 通信参数如标准、数据长度等SPI_StructInit填充 SPI 初始化结构体默认值SPI_InitStruct: SPI 配置结构体指针在手动配置 SPI 前快速获取默认配置SPI_I2S_StructInit填充 I2S 初始化结构体默认值I2S_InitStruct: I2S 配置结构体指针在手动配置 I2S 前快速获取默认配置 控制和命令函数 函数名功能参数介绍使用方法SPI_Cmd使能或禁用 SPISPIx: SPI 外设地址brNewState: 使能/禁用状态开启或关闭 SPI 外设I2S_Cmd使能或禁用 I2SSPIx: SPI 外设地址brNewState: 使能/禁用状态开启或关闭 I2S 外设SPI_I2S_ITConfig配置 SPI/I2S 中断SPIx: SPI 外设地址brSPI_I2S_IT: 中断类型brNewState: 使能/禁用状态配置中断如发送完成、接收完成等SPI_I2S_DMACmd配置 SPI/I2S DMA 请求SPIx: SPI 外设地址brSPI_I2S_DMAReq: DMA 请求类型brNewState: 使能/禁用状态启用或禁用 DMA 传输 数据传输函数 函数名功能参数介绍使用方法SPI_I2S_SendData通过 SPI/I2S 发送数据SPIx: SPI 外设地址brData: 待发送的 16 位数据发送单个数据字SPI_I2S_ReceiveData从 SPI/I2S 接收数据SPIx: SPI 外设地址读取接收缓冲区的 16 位数据 高级配置函数 函数名功能参数介绍使用方法SPI_NSSInternalSoftwareConfig配置内部片选信号SPIx: SPI 外设地址brSPI_NSSInternalSoft: NSS 信号配置软件控制从设备片选SPI_SSOutputCmd配置 SS 输出SPIx: SPI 外设地址brNewState: 使能/禁用状态控制从设备片选输出SPI_DataSizeConfig配置数据大小SPIx: SPI 外设地址brSPI_DataSize: 数据大小设置每次传输的数据位数SPI_BiDirectionalLineConfig配置双向线路方向SPIx: SPI 外设地址brSPI_Direction: 传输方向设置单工或半双工模式下的传输方向 CRC 校验函数 函数名功能参数介绍使用方法SPI_TransmitCRC发送 CRCSPIx: SPI 外设地址手动发送 CRC 值SPI_CalculateCRC使能/禁用 CRC 计算SPIx: SPI 外设地址brNewState: 使能/禁用状态开启或关闭 CRC 硬件计算SPI_GetCRC获取 CRC 值SPIx: SPI 外设地址brSPI_CRC: CRC 类型读取发送或接收 CRC 值SPI_GetCRCPolynomial获取 CRC 多项式SPIx: SPI 外设地址读取当前使用的 CRC 多项式 状态和标志函数 函数名功能参数介绍使用方法SPI_I2S_GetFlagStatus获取状态标志SPIx: SPI 外设地址brSPI_I2S_FLAG: 标志类型检查传输、错误等各种状态SPI_I2S_ClearFlag清除状态标志SPIx: SPI 外设地址brSPI_I2S_FLAG: 标志类型手动清除特定状态标志SPI_I2S_GetITStatus获取中断状态SPIx: SPI 外设地址brSPI_I2S_IT: 中断类型检查中断是否触发SPI_I2S_ClearITPendingBit清除中断挂起位SPIx: SPI 外设地址brSPI_I2S_IT: 中断类型手动清除中断挂起状态 代码实现SPI步骤--五步实现采用非连续传输发送 GPIO 模式十六进制值模式说明典型应用场景GPIO_Mode_AIN0x0模拟输入模式用于模拟信号输入如传感器、ADC采样GPIO_Mode_IN_FLOATING0x04浮空输入模式外部悬空输入无上拉/下拉电阻GPIO_Mode_IPD0x28下拉输入模式输入引脚默认为低电平GPIO_Mode_IPU0x48上拉输入模式输入引脚默认为高电平GPIO_Mode_Out_OD0x14开漏输出模式需要外部上拉电阻常用于 I2C 通信GPIO_Mode_Out_PP0x10推挽输出模式通用数字输出模式驱动能力强GPIO_Mode_AF_OD0x1C开漏复用功能复用功能的开漏输出如 I2CGPIO_Mode_AF_PP0x18推挽复用功能复用功能的推挽输出如 USART、SPI 第一步开启时钟开启SPI和GPIO的时钟 第二步初始化GPIO其中SCK和MOSI是由硬件外设控制的输出信号配置称复用推挽输出MISO是硬件外设的输入信号配置上拉输入。SN片选引脚是由软件控制的输出信号配置成通用推挽输出。 第三步配置SPI外设这一步我们使用一个结构体进行配置STM32的库函数 第四步使能SPI。 void MySPI_Init(void) {// 开启GPIOA时钟/* 开启GPIOA的时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 开启SPI1的时钟/* GPIO的配置 */// 配置SCK和MOSI引脚GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 设置为复用推挽输出模式 (Alternate Function Push-Pull)GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_7; // 选择引脚5 (SCK) 和 引脚7 (MOSI)GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速率为50MHzGPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA的这两个引脚// 配置MISO引脚GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; // 设置为上拉输入模式 (Input with Pull-Up)GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; // 选择引脚6 (MISO)GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速率为50MHzGPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA的MISO引脚// 配置NSS引脚 (片选)GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 设置为推挽输出模式 (Push-Pull Output)GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; // 选择引脚4 (NSS)GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速率为50MHzGPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA的NSS引脚/* SPI的配置 */SPI_InitTypeDef SPI_InitStructure;SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_128; // 设置SPI波特率预分频器为128确定SPI通信速度SPI_InitStructure.SPI_CRCPolynomial 7; // 设置CRC多项式为7用于数据完整性检测SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; // 设置数据位宽为8位SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; // 设置SPI为全双工模式即同时发送和接收数据SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; // 设置数据传输顺序为先发送最高有效位MSBSPI_InitStructure.SPI_Mode SPI_Mode_Master; // 设置SPI为主模式SPI_InitStructure.SPI_NSS SPI_NSS_Soft; // 设置为软件控制的片选NSSSPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; // 设置时钟相位 (CPHA) 为第一沿变化SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; // 设置时钟极性 (CPOL) 为低电平SPI_Init(SPI1, SPI_InitStructure); // 初始化SPI1外设// 使能SPISPI_Cmd(SPI1, ENABLE); // 启动SPI1外设开始进行SPI通信 }详细解释 时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)启用GPIOA外设时钟以便能够配置和使用GPIOA引脚。RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE)启用SPI1外设时钟确保SPI外设可以正常工作。 GPIO配置 SCK (Serial Clock) 和 MOSI (Master Out Slave In) 引脚配置为复用推挽输出模式GPIO_Mode_AF_PP通过这些引脚来传输数据。MISO (Master In Slave Out) 引脚配置为上拉输入模式GPIO_Mode_IPU用于接收从外设发送来的数据。NSS (Chip Select) 引脚配置为推挽输出模式GPIO_Mode_Out_PP用于控制SPI外设的选通。 SPI配置 波特率预分频器设置为128这会影响SPI的时钟频率确保SPI通信速度适合与外设交互。CRC多项式设置为7SPI传输过程中可以使用CRC校验以提高数据的完整性。数据位宽设置为8位即每次传输一个字节的数据。SPI方向设置为全双工模式意味着数据可以在同一时间同时进行接收和发送。数据位顺序设置为MSB先传输SPI_FirstBit_MSB即先发送最高有效位MSB。SPI模式设置为主模式SPI_Mode_Master意味着此外设将控制通信。片选控制选择软件控制片选模式SPI_NSS_Soft即通过软件控制NSS信号的状态。时钟极性和相位SPI_CPOL_Low 表示时钟的空闲状态为低电平SPI_CPHA_1Edge 表示数据将在时钟的第一沿变化时采样。 使能SPI SPI_Cmd(SPI1, ENABLE)使能SPI1外设开始SPI通信允许SPI发送和接收数据。 这段代码配置了STM32的SPI1外设使其能够与其他SPI外设进行通信例如传感器、外部存储设备等。 第五步最后参考一下非连续传输进行一个字节的交换如下图 uint8_t MySPI_SwapByte(uint8_t Byte) {// 等待SPI1的发送数据寄存器空确保可以发送数据while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ! SET);// 发送数据SPI_I2S_SendData(SPI1, Byte); // 通过SPI发送一个字节的数据// 等待SPI1的接收数据寄存器非空确保数据已接收while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) ! SET);// 读取接收到的数据并返回return SPI_I2S_ReceiveData(SPI1); // 返回接收到的字节数据 }详细解释 等待发送寄存器空 SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE)检查SPI1的数据发送寄存器TXE标志是否为空。如果为“空”即可以发送数据则返回SET否则继续等待。这是通过循环检查确保数据寄存器准备好可以发送数据避免数据溢出或丢失。 发送数据 SPI_I2S_SendData(SPI1, Byte)将参数 Byte 中的数据通过SPI总线发送出去。SPI的发送操作是同步的当数据发送寄存器可用时数据将被传送到外部设备。 等待接收寄存器非空 SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE)检查SPI1的接收数据寄存器RXNE标志是否非空。若接收寄存器有数据即数据已经接收到则返回SET否则继续等待。这确保了只有在数据完全接收后才进行下一步操作。 读取接收数据 SPI_I2S_ReceiveData(SPI1)从SPI1接收数据寄存器中读取接收到的字节并返回。在交换字节数据时发送和接收操作是并行进行的。因此读取接收到的数据通常就是发送数据时外设返回的数据。 总结 该函数实现了SPI的数据发送与接收。它通过等待SPI硬件标志位来确保发送和接收过程的同步确保数据的完整传输。在使用时传入一个字节发送后等待接收另一个字节并返回。这个函数可以用于SPI设备之间的字节交换操作。 源码 把上一节软件部分改一下即可 #include stm32f10x.h // Device header//片选 void MySPI_W_CS(uint8_t BitValue) {GPIO_WriteBit(GPIOA,GPIO_Pin_4,(BitAction)BitValue); }void MySPI_Init(void) {// 开启GPIOA时钟/* 开启GPIOA的时钟 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // 开启SPI1的时钟/* GPIO的配置 */// 配置SCK和MOSI引脚GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; // 设置为复用推挽输出模式 (Alternate Function Push-Pull)GPIO_InitStructure.GPIO_Pin GPIO_Pin_5 | GPIO_Pin_7; // 选择引脚5 (SCK) 和 引脚7 (MOSI)GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速率为50MHzGPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA的这两个引脚// 配置MISO引脚GPIO_InitStructure.GPIO_Mode GPIO_Mode_IPU; // 设置为上拉输入模式 (Input with Pull-Up)GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; // 选择引脚6 (MISO)GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速率为50MHzGPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA的MISO引脚// 配置NSS引脚 (片选)GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_PP; // 设置为推挽输出模式 (Push-Pull Output)GPIO_InitStructure.GPIO_Pin GPIO_Pin_4; // 选择引脚4 (NSS)GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; // 设置引脚速率为50MHzGPIO_Init(GPIOA, GPIO_InitStructure); // 初始化GPIOA的NSS引脚/* SPI的配置 */SPI_InitTypeDef SPI_InitStructure;SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_128; // 设置SPI波特率预分频器为128确定SPI通信速度SPI_InitStructure.SPI_CRCPolynomial 7; // 设置CRC多项式为7用于数据完整性检测SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; // 设置数据位宽为8位SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex; // 设置SPI为全双工模式即同时发送和接收数据SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; // 设置数据传输顺序为先发送最高有效位MSBSPI_InitStructure.SPI_Mode SPI_Mode_Master; // 设置SPI为主模式SPI_InitStructure.SPI_NSS SPI_NSS_Soft; // 设置为软件控制的片选NSSSPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; // 设置时钟相位 (CPHA) 为第一沿变化SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; // 设置时钟极性 (CPOL) 为低电平SPI_Init(SPI1, SPI_InitStructure); // 初始化SPI1外设// 使能SPISPI_Cmd(SPI1, ENABLE); // 启动SPI1外设开始进行SPI通信 }//SPI模式0 /*** brief 开始SPI通信拉低片选信号* note 通常在发送数据前调用选中从设备*/ void MySPI_Start(void) {MySPI_W_CS(0); // 拉低CS片选信号选中从设备 }/*** brief 结束SPI通信拉高片选信号* note 通常在数据传输完成后调用取消从设备选择*/ void MySPI_Stop(void) {MySPI_W_CS(1); // 拉高CS片选信号取消从设备选择 }uint8_t MySPI_SwapByte(uint8_t Byte) {// 等待SPI1的发送数据寄存器空确保可以发送数据while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) ! SET);// 发送数据SPI_I2S_SendData(SPI1, Byte); // 通过SPI发送一个字节的数据// 等待SPI1的接收数据寄存器非空确保数据已接收while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) ! SET);// 读取接收到的数据并返回return SPI_I2S_ReceiveData(SPI1); // 返回接收到的字节数据 } 知识普及 SPI 的四种模式详细解析 模式定义 SPI 模式由两个参数决定 CPOL (Clock Polarity)时钟极性CPHA (Clock Phase)时钟相位 详细模式说明 模式0 (CPOL0, CPHA0) 时钟空闲态为低电平在上升沿采样数据在下降沿发送数据最常用的模式 模式1 (CPOL0, CPHA1) 时钟空闲态为低电平在下降沿采样数据在上升沿发送数据 模式2 (CPOL1, CPHA0) 时钟空闲态为高电平在下降沿采样数据在上升沿发送数据 模式3 (CPOL1, CPHA1) 时钟空闲态为高电平在上升沿采样数据在下降沿发送数据 时序图解释 SPI Timing Diagram Click to open code 选择建议 确保主从设备的模式一致根据从设备的具体通信要求选择模式0最为通用特定外设可能有特定模式要求 配置示例STM32 SPI_InitStructure.SPI_Mode SPI_Mode_Master; SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; // 时钟极性 SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; // 时钟相位 SPI的学习到此就圆满结束了相较于I2C尽管SPI需要多几条物理线路但它的实现要简单得多。I2C在多设备通信时的复杂性和时序管理常常让人感到头疼而SPI通过其清晰、简洁的同步时序极大简化了实现过程。与此不同USART通信尽管也能够由软件模拟但相较于SPI和I2C它的实现要复杂得多。原因在于USART是一种异步通信协议没有统一的时钟信号数据传输完全依赖于发送和接收设备之间的同步时序完全靠软件来控制和测量带来了更高的实现难度和出错的风险。 在实际应用中许多设备的基础通信都使用USART这也是因为USART协议在很多情况下是最为通用且具备足够灵活性的标准。尽管它实现较为复杂但其异步特性在一些特定场合如无需时钟信号、长距离通信等下仍具有不可替代的优势。因此虽然USART的时序和同步管理比SPI和I2C复杂但它仍在很多嵌入式应用中占有一席之地。进军下一章节 时间2024.12.26  2051 地点苏州
http://www.dnsts.com.cn/news/53736.html

相关文章:

  • 网站建设网站规划书wordpress淘宝客程序
  • 怎么做网站百度贴吧哪些网站可以做视频搬运
  • 登封 网站建设WordPress对象存储插件
  • 好的网站怎么建设东台企业网站建设
  • 金融网站开发文档自己建设一个网站软件
  • 微信公众号怎么发布文章自媒体seo优化
  • 网站建设必须注意的事项广西智能网站建设找哪家
  • 太原做网站的工作室个人静态网页制作
  • 明星网站开发项目介绍手机网站设计
  • 做高仿网站有哪些广州外贸公司排名前十
  • 学校网站源码html网站建设要什么知识
  • 眼科医院网站做竞价带来的询盘量外贸如何推广
  • 网站建设教程 第十课 cf战队网站制作教程和源码杭州全案设计公司
  • 有哪些做排球比赛视频网站幸福人寿保险公司官方网站
  • 公司网站数媒设计制作做产品类网站
  • 邢台做网站的那好做网站自学
  • 用html制作购物网站wordpress 付费剧集网站
  • 青岛网站制作公司订货商城小程序源码
  • 洛龙区网站制作建设费用海南网站定制
  • 怎么建设一个淘宝客网站谁知道wordpress移动端不显示图片
  • 住房和城乡建设部网站行标建网站签合同
  • 渭南网站建设wordpress 归档页显示文章缩略图
  • 家居定制类网站建设ui设计的基本流程
  • 山西科技网站建设黄冈app下载推广平台官网
  • 重庆网站营销网易企业邮箱服务器怎么设置
  • 优化方案电子版百度seo外包
  • 淘宝推广平台有哪些seo推广优化
  • 万网网站模板下载长沙做彩票网站公司
  • 怎样在设计网站做图赚钱福州seo建站
  • 济南网站建设_美叶网络优秀的公司网站