上位机图像处理和嵌入式模块部署(f407 mcu中的spi总线操作)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们学习mcu,一般都是模板和模块之间的接口,比如说串口、usb、eth这种。还有一种接口,更多的是芯片和芯片之间的接口,比如说spi、iic、iis、sdio这种,这其中尤其是以spi最为典型。spi本身是一种总线协议,但是总线上面传输什么格式数据,这是不一定的。另外,spi对接的,可能是norflash,可能是nand flash,可能是wifi,可能是ad/da芯片,也可能是一块屏幕。

        所以学习spi的时候,一般需要分成两部分。第一部分,就是mcu上面的spi应该如何配置、如何发命令;另外一部分,就是和mcu对接的spi芯片,需要spi发什么样的命令才能进行通信。今天我们spi对接的就是一块norflash芯片。

1、基本电路

        学习前,我们可以简单了解一下norflash的芯片接口,其实也不复杂,主要就是四根线。一个是cs,一个是sck,一个是miso(master in slave out),一个是mosi(master out slave in)。

2、配置spi基本属性

        spi配置方面,主要就是两个部分。一个是设置spi的gpio属性,对这四个pin进行设置;还有一个就是配置spi的基本属性。前面gpio的设置方法,我们都比较熟悉,今天看下spi的设置方法。

  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_8;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(FLASH_SPI, &SPI_InitStructure);

  SPI_Cmd(FLASH_SPI, ENABLE);

3、利用spi实现flash协议

        spi配置好了之后,这个时候就可以结合norflash芯片手册来编写代码了。编写的代码,要严格按照flash给出的时序来做。出现问题的话,也只有拿着协议手册、示波器和代码,来做比对分析了,

void SPI_FLASH_SectorErase(u32 SectorAddr)
{
  SPI_FLASH_WriteEnable();
  SPI_FLASH_WaitForWriteEnd();
	
  SPI_FLASH_CS_LOW();
  SPI_FLASH_SendByte(W25X_SectorErase);
  SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
  SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
  SPI_FLASH_SendByte(SectorAddr & 0xFF);
  SPI_FLASH_CS_HIGH();

  SPI_FLASH_WaitForWriteEnd();
}

        这个函数其实就是根据norflash的时序来做的。它的主要功能是对某一个sector进行erase操作。首先写使能,等待写使能结束。接着cs拉低,依次输入erase命令、sector的24位地址,cs拉高。最后等待写结束。整个操作结束,对应的sector就erase好了。这里面W25X_SectorErase就是flash特有的命令,类似的命令还有这些,

#define W25X_WriteEnable		      0x06 
#define W25X_WriteDisable		      0x04 
#define W25X_ReadStatusReg		      0x05 
#define W25X_WriteStatusReg		  	  0x01 
#define W25X_ReadData			      0x03 
#define W25X_FastReadData		      0x0B 
#define W25X_FastReadDual		      0x3B 
#define W25X_PageProgram		      0x02 
#define W25X_BlockErase			      0xD8 
#define W25X_SectorErase		      0x20 
#define W25X_ChipErase			      0xC7 
#define W25X_PowerDown			      0xB9 
#define W25X_ReleasePowerDown	 	  0xAB 
#define W25X_DeviceID			      0xAB 
#define W25X_ManufactDeviceID   	  0x90 
#define W25X_JedecDeviceID		      0x9F 

        如果是其他的spi芯片,一般也会给出对应的命令和时序要求的。一开始大家自己不会写,其实没有关系,只要看懂别人的代码就可以。因为大多数norflash、nandflash的命令都是差不多的。后期编写其他spi芯片,也只需要看懂别人的示例代码,自己会改写就好了。

4、测试方法

        测试还是比较简单的,首先读取device id,接着读取flash id。如果flash id读取没有问题,先erase一个sector的数据,接着依次write数据、read数据。read出来的数据,要和之前write的数据进行比较。没问题,则代表数据ok;有问题,则代表写入失败。最后则是flash下电处理。

5、编译验证

        一起都准备好之后,就可以开始烧入了。运行的时候,串口提示读取不到flash id,看了一下代码,确认是作者把cs的a3当然了a4,修改一下

#define FLASH_CS_PIN                        GPIO_Pin_4             
#define FLASH_CS_GPIO_PORT                  GPIOA                     
#define FLASH_CS_GPIO_CLK                   RCC_AHB1Periph_GPIOA

        重新编译烧入,这个时候可以读到flash id,但是测试没有开始,单步调试一下,发现id不匹配。可能是因为作者后期替换了flash芯片,我们添加一下测试的flash id,

#define  sFLASH_ID                       0xEF4016    //W25Q32
#define  pFLASH_ID                       0x856016    //P25Q32
#define  qFLASH_ID                       0x684016    

        判断逻辑也重新修改下,

	if(FlashID == sFLASH_ID||FlashID == pFLASH_ID||FlashID == qFLASH_ID)
    {
        /* ...... */
    }

        至此,测试可以顺利进行了。不过测试的时候,发现flash id有的时候可以读出来;有的时候会失败。不太清楚失败的原因是flash原因,还是读的太快了。这个时候我们把延时放大一点,至少读不出来的现象没有了,

	DeviceID = SPI_FLASH_ReadDeviceID();
	Delay( 20000 ); 
	FlashID = SPI_FLASH_ReadID();

        重新编译后,上电、复位、测试,输出的结果是这样的,

6、总结

        从存储的角度来说,有的时候mcu生成的文件比较大,或者是一部分数据mcu放不下,例如字体、图片、配置文件,这些都需要放在norflash、nandflash里面,这都是常有的事情。建议大家好好掌握一下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/683483.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】 深入理解Pandas中的iloc和loc:数据选择的艺术

基本原理 在Python的Pandas库中,数据选择是数据分析和处理的基础。iloc和loc是两种常用的数据选择方法,它们都允许用户根据索引位置或标签来选择数据。然而,它们在行为和用途上存在一些关键的差异。 iloc iloc是基于整数索引的&#xff0c…

【Modelground】个人AI产品MVP迭代平台(3)——工程化架构设计

文章目录 背景monorepo多项目调试/打包公共静态资源服务公共模型拷贝入项目的public文件夹总结 背景 Modelground中的项目,基本都依赖Mediapipe模型,因此,有很强的需要对Mediapipe进行封装,其余项目都调用这个封装库。从架构上&a…

IIS漏洞

IIS7.5解析漏洞 安装IIS7.5 安装完成之后直接访问浏览器: 安装phpstudy for IIS 安装这个的目的是方便,不用自己去配置 解压开傻瓜式安装即可。然后查看探针: 漏洞原理 IIS7/7.5在Fast-CGI运行模式下,在一个文件路径(/shell.jpg)后面加上/…

linux线程的同步与互斥

前面我们讲了线程的概念以及如何创建与控制线程,接下来我们来对线程的细节与线程之间的问题进行一些讲解; 1.线程的互斥 互斥就是相互排斥,我们可以理解为对立竞争不相容;线程的互斥则是线程之间在对于临界资源竞争时相互排斥的…

openh264 编码命令行工具源码分析

openh264 OpenH264 是由 Cisco 公司发布的一个开源的 H.264 编码和解码器。它提供了命令行工具,可以用于对视频进行编码和解码操作。 使用说明 openh264 编码命令行工具可以使用命令行或 config 配置进行编码操作。编译和使用方法具体可以参考 Windows11编译open…

12_JavaWebAjax

文章目录 Ajax1. 同步请求异步请求2. Ajax实现方式3. 日程管理第四期4. 响应JSON串4.1 响应JSON串格式的一般格式 Appendix Ajax 发送请求的一些方式 1.输入浏览器回车 2.html>head>script/link ​ img标签 3.a标签form表单标签等 用户手动控制提交产生&#xff1b…

实验七、创建小型实验拓扑《计算机网络》

早检到底是谁发明出来的。 一、实验目的 完成本实验后,您将能够: • 设计逻辑网络。 • 配置物理实验拓扑。 • 配置 LAN 逻辑拓扑。 • 验证 LAN 连通性。 二、实验任务 在本实验中,将要求您连接网络设备并配置主机实现基本的网络…

R语言探索与分析20-北京市气温预测分析

一、序言 近年来,人类大量燃烧煤炭、天然气等含碳燃料导致温室气 体过度排放,大量温室气体强烈吸收地面辐射中的红外线,造 成温室效应不断累积,使得地球温度上升,造成全球气候变暖。气象温度的预测一直以来都是天气预…

计算机毕业设计 | 基于node(Koa)+vue 高校宿舍管理系统 宿舍可视化(附源码)

1,绪论 1.1 项目背景 随着科技的发展,智能化管理越来越重要。大学生在宿舍的时间超过了1/3,因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍,不浪费公共资源,减轻学校管理…

微信扫普通二维码后通过小程序观看的实现

为了方便小程序开发者更便捷地推广小程序,兼容线下已有的二维码,微信公众平台开放扫描普通链接二维码跳转小程序能力。 功能介绍 普通链接二维码,是指开发者使用工具对网页链接进行编码后生成的二维码。 线下商户可不需更换线下二维码&…

【面试干货】SQL中count(*)、count(1)和count(column)的区别与用法

【面试干货】SQL中count(*)、count(1)和count(column)的区别与用法 1、count(*)2、count(1)3、count(column) 💖The Begin💖点点关注,收藏不迷路💖 在SQL中&a…

基于GTX 8B10B编码的自定义PHY上板测试(高速收发器十四)

前文整理了GTX IP,完成了自定义PHY协议的收发模块设计,本文将通过光纤回环,对这些模块上板测试,首先需要编写一个用于生成测试数据的用户模块。 1、测试数据生成模块 本模块用于生成自定义PHY协议的测试数据,通过axi_…

【微信小程序】页面导航

声明式导航 导航到 tabbar 页 tabBar页面指的是被配置为tabBar的页面。 在使用<navigator>组件跳转到指定的tabBar页面时&#xff0c;需要指定url属性和open-type属性&#xff0c;其中&#xff1a; url 表示要跳转的页面的地址&#xff0c;必须以/开头open-type表示跳…

Python轻量级嵌入式关系数据库之apsw使用详解

概要 在现代应用开发中,数据库是一个非常重要的组成部分。SQLite 是一个轻量级的嵌入式关系数据库管理系统,被广泛应用于各种应用程序中。APSW(Another Python SQLite Wrapper)库是一个专门用于访问 SQLite 数据库的 Python 包,它提供了 SQLite 所有的功能,并且比标准库…

usb设备在主机和VMWare虚拟机中切换连接

操作&#xff1a;点击菜单栏虚拟机(M)>可移动设备>选择自己的usb设备>连接(断开与 主机 的连接)

【会议征稿,ACM出版】2024年图像处理、智能控制与计算机工程国际学术会议(IPICE 2024,7月9-11)

2024年图像处理、智能控制与计算机工程国际学术会议&#xff08;IPICE 2024&#xff09;将于2024年7月9-11日在中国福州举行。本届会议由阳光学院、福建省空间信息感知与智能处理重点实验室、空间数据挖掘与应用福建省高校工程研究中心联合主办。 会议主要围绕图像处理、智能控…

巨详细Linux安装Tomcat教程

巨详细Linux安装Tomcat教程 1、检查是否残留其他版本2、上传安装包至服务器2.1安装包获取2.2创建相关目录 3、安装Tomcat3.1安装3.2启动3.3web页面 4、配置Tomcat4.1把tomcat进程交给systemctl管理4.2设置tomcat开机自启动 1、检查是否残留其他版本 #检查残留数据 rpm -qa|gre…

Eclipse添加C和C++编译成汇编文件的选项

在miscellaneous中添加assemble listing选项就可以生成汇编文件了

C++标准模板(STL)- 迭代器库-迭代器适配器- 逆序遍历的迭代器适配器 (二)

迭代器库-迭代器原语 迭代器库提供了五种迭代器的定义&#xff0c;同时还提供了迭代器特征、适配器及相关的工具函数。 迭代器分类 迭代器共有五 (C17 前)六 (C17 起)种&#xff1a;遗留输入迭代器 (LegacyInputIterator) 、遗留输出迭代器 (LegacyOutputIterator) 、遗留向前…