不知不觉,学习华清远见物联网课程已经一月。一个月的时间,我收获颇多。老师扎实的专业知识,良好的学习环境,一群认真刻苦的同学,无一不在促进我对此课程的学习和了解!
因大学我所学专业与此相同,对嵌入式的了解还是较为深入的。在一开始学习此课程时,会比其他同学更轻松一些。在嵌入式课程学习开始时,由于老师讲的知识点比较易懂,大部分也接触过。但,当理论知识学习完进入敲代码阶段时,我才正真打开了这门课程的又一扇大门,也正是应了实践是检验真理的唯一标准这句话。在学校学习时只是为了实现功能而写代码,完全没有注意到应该注重的代码规范格式,只是为了实现而实现,没有考虑到后期他人使用的感受。“无从下手”就是我当时的状态,在我认真的反思后,我从头开始,规范自己的代码格式,把在课程中学习到的理论知识带入实践中去。
在嵌入式学习的过程中,从一个小白到现在我已经慢慢走上正轨,对此付出的时间和精力,不言而喻。晚上加班加点的学习已是常态,在我的不断努力和付出之后终于收获了硕果。
前言
(一)I2C总线通信原理
1、I2C总线简介
2、I2C总线协议
3、I2C总线读写操作
4、STM32F4-I2C控制器特性
(二)EEPROM(24CXX)存储芯片介绍
1、EEPROM简介
2、24CXX简介
3、24C65设备地址
4、24C65硬件原理图
5、24C65读写时序
(三)I2C读写EEPROM实例
二、STM32-SPI总线通信
(一)串行FLASH_W25X16简介STM32
1、SPI总线简介
3、SPI的四种通信模式
4、STM32F4-SPI控制器特性
(二)串行FLASH_W25X16简介
1、串行FLASH_W25X16简介
2、W25X16硬件连线
3、W25X16控制指令
(三)STM32 SPI_FLASH基本配置和操作
(四)SPI_FLASH擦除及读数据操作
(五)SPI_FLASH写数据操作
三、STM32 单总线类传感器
(一)红外遥控工作原理讲解
1、光的基础知识
2、红外通信
3、NEC协议详解
(二)红外遥控实例讲解
(三)DS18B20温度传感器工作原理
1、DS18B20技术性能特征
2、DS18B20硬件连接
3、DS18B20通信类型
4、温度读取过程
(四)DS18B20温度采集实例
四、STM32-FSMC外扩SRAM
(一)常用存储器介绍
1、存储器的种类
2、RAM存储器
3、非易失性存储器
(二)SRAM控制原理
1、SRAM简介
2、SRAM内部框图分析
3、SRAM的读写时序
(三)STM32-FSMC控制器介绍
1、FMSC控制器简介
2、FSMC控制器框图分析
3、FSMC地址映射
4、FSMC时序控制
(四)FSMC外扩SRAM实例
五、TFT-LCD专题讲解
(一)常见显示器介绍
1、显示器分类
2、显示器的基本参数
3、TFT-LCD控制框图
(二)TFT-LCD控制原理
1、TFT-LCD屏结构
2、TFT-LCD控制原理
3、RGB-LCD控制时序分析
(三)SSD1963液晶控制器
1、液晶控制器SSD1963
2、SSD1963内部框图分析
3、8080写时序分析
4、FMSC模拟8080时序
(四)LCD测试程序讲解
(五)LCD显示图片和中文字符
六、触摸屏专题讲解
(一)触摸屏简介
1、电阻触摸屏
2、电容触摸屏检测原理
(二)触摸屏操作实例讲解
七、STM32 电源管理专题讲解
(一)STM32电源管理简介
1、电源管理简介
2、STM32电源管理系统
3、STM32低功耗模式
(二)STM32实现睡眠模式
(三)STM32实现停止模式
(四)STM32实现待机模式
八、STM32 SD卡操作专题讲解
(一)STM32 SDIO接口简介
1、SD卡简介
2、SD卡的物理结构
3、SD卡内部的寄存器
4、STM32-SDIO接口简介
6、STM32-SDIO接口特性
7、STM32-SDIO功能框图
8、STM32-SDIO时钟
9、STM32-SDIO适配器
(二)SD卡操作命令及模式详解
1、SDIO内部结构
2、SDIO命令
(三)SD卡普通模式读写操作实例
(四)SD卡DMA模式读写操作实例
总结
(1)I2C总线介绍
I2C(Inter-Integrated Circuit)总线(也称IIC或I2C)是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备,是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,期间封装形式少,通信速率高等优点。
(2)I2C总线特征
- 两条总线线路:一条串行数据SDA,一条串行时钟线SCL来完成数据的传输及外围器件的扩展
- I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址
- I2C总线数据传输速率在标准模式下可达100kbit/s,快速模式下可达400kbit/s,高速模式下可达3.4Mbit/s。一般通过I2C总线接口可编程时钟来实现传输速率的调整,同时也跟所接的上拉电阻的阻值有关。
- I2C总线上的主设备与从设备之间以字节(8位)为单位进行单双工的数据传输。
实际运用中,STM32一般为主机,其余外设为从设备,对应的地址一般为7位
(3)I2C总线物理·拓扑结构
I2C 总线在物理连接上分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。
由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。
STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来,CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C协议的方式减轻了 CPU 的工作,且使软件设计更加简单。
I2C总线规范 rev03 兼容性:
- 从机模式和主机模式
- 多主机功能- 标准模式(高达 100kHz )
- 快速模式(高达 400kHz )
- 超快速模式(高达 1 MHz )
- 7 位和 10 位地址模式
- 软件复位 1 字节缓冲带 DMA 功能
引脚 |
I2C编号 |
||
I2C1 |
I2C2 |
I2C3 |
|
SCL |
PB6/PB10 |
PF1/PB10 |
PA8 |
SDA |
PB7/PB9 |
PF0/PB11 |
PC9 |
EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器——一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。
EEPROM常用来存储一些配置信息,以便系统重新上电的时候加载之。EEPOM 芯片最常用的通讯方式就是 I 2 C 协议
AT24Cxx中文数据手册【中为电子科技工作室】.pdf
24C02 I2C EEPROM数据手册.pdf
24CXX的设备地址:
24CXX的设备地址为7位: 高4位恒定为 1010 低3位取决于A0-A2的电平状态
注:一般主机在读写24CXX都是把设备地址连同读写位组合成一个字节一起发送
读地址: 1010 0001 即 0xA1
写地址: 1010 0000 即 0xA0
24C65_datasheet.pdf
(1)SPI总线介绍
SPI接口是Motorola 首先提出的全双工三线同步串行外围接口,采用主从模式(Master Slave)架构;支持多slave模式应用,一般仅支持单Master。时钟由Master控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first);SPI接口有2根单向数据线,为全双工通信,目前应用中的数据速率可达几Mbps的水平。
SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间,要求通讯速率较高的场合。
(2)SPI总线物理·拓扑结构
SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。
(1)MOSI:主器件数据输出,从器件数据输
(2)MISO:主器件数据输入,从器件数据输出
(3)SCLK :时钟信号,由主器件产生
(4)/SS:从器件使能信号,由主器件控制(片选)
2、SPI总线协议
主机和从机都包含一个串行移位寄存器,主机通过向它的SPI串行寄存器写入一个字节发起一次传输。寄存器通过MOSI信号线将字节传送给从机,从机也将自己的移位寄存器中的内容通过MISO信号线返回给主机。这样两个移位寄存器中的内容就被交换了。从机的写操作和读操作时同步完成的,因此SPI成为一个很有效的协议。
在SPI操作中,最重要的两项设置就是时钟极性(CPOL)和时钟相位(CPHA)这两项即是主从设备间数据采样的约定方式。
当CPOL = 0 ,SCK引脚在空闲状态保持低电平; 当CPOL = 1 ,SCK引脚在空闲状态保持高电平。
当 CPHA=0 时,MOSI或 MISO 数据线上的信号将会在 SCK时钟线的奇数边沿被采样
当 CPHA=1时, MOSI或 MISO 数据线上的信号将会在 SCK时钟线的偶数边沿被采样
由CPOL及CPHA的不同状态,SPI分成了四种模式,主机与从机需要工作在相同的模式下才可以正常通讯,因此通常主机要按照从机支持的模式去设置
STM32的SPI架构剖析:• 通讯引脚 • 时钟控制逻辑 • 数据控制逻辑 • 整体控制逻辑
(1)通讯引脚
STM32F4芯片有多个SPI外设,它们的SPI通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,以《STM32F4xx规格书》为准。
注:其中SPI1、SPI4、SPI5、SPI6是APB2上的设备,最高通信速率达42Mbtis/s,SPI2、SPI3是APB1上的设备,最高通信速率为21Mbits/s。其它功能上没有差异。
(2)时钟控制逻辑
SCK线的时钟信号,由波特率发生器根据“控制寄存器CR1”中的BR[0:2]位控制,该位是对f pclk 时钟的分频因子,对f pclk 的分频结果就是SCK引脚的输出时钟频率
注:其中的f pclk 频率是指SPI所在的APB总线频率,APB1为f pclk1 ,APB2为f pckl2
(3)数据控制逻辑
STM32F4的MOSI及MISO都连接到数据移位寄存器上,数据移位寄存器的数据来源来源于接收缓冲区及发送缓冲区。
(4)整体控制逻辑
FLSAH 存储器又称闪存,它与 EEPROM 都是掉电后数据不丢失的存储器,但 FLASH存储器容量普遍大于 EEPROM,现在基本取代了它的地位。我们生活中常用的 U盘、SD卡、SSD 固态硬盘以及我们 STM32 芯片内部用于存储程序的设备,都是 FLASH 类型的存储器。在存储控制上,最主要的区别是FLASH 芯片只能一大片一大片地擦写,而EEPROM可以单个字节擦写。
W25X16有8192个可编程页,每页256字节。用“页编程指令”每次就可以编程256个字节。用扇区擦除指令每次可以擦除16页,用块擦除指令每次可以擦除256页,用整片擦除指令即可以擦除整个芯片。W25X16有512个可擦除扇区或32个可擦除块。
CS: 片选引脚,低电平有效,连接到STM32-PH2管脚
SO: 连接到STM32-PB4管脚(MISO)
SI: 连接到STM32-PB5管脚(MOSI)
CLK: 连接到STM32-PA5管脚(CLK)
WP: 写保护管脚,低电平有效,有效时禁止写入数据。接电源未使用
HOLD: HOLD 引脚可用于暂停通讯,该引脚为低电平时,通讯暂停,未使用
(1)W25X16操作方式
我们需要了解如何对 FLASH 芯片进行读写。FLASH 芯片自定义了很多指令,我们通过控制 STM32利用 SPI总线向 FLASH 芯片发送指令,FLASH芯片收到后就会执行相应的操作。 而这些指令,对主机端(STM32)来说,只是它遵守最基本的 SPI通讯协议发送出的数据,但在设备端(FLASH 芯片)把这些数据解释成不同的意义,所以才成为指令。
注:可查看FLASH 芯片的数据手册《W25X16》,可了解各种它定义的各种指令的功能及指令格式
(2)读制造商/设备ID(90)
该指令通常在调试程序的时候用到,判断SPI通信是否正常。该指令通过主器件拉低/CS片选使能器件开始传输,首先通过DI线传输“90H”指令,接着传输000000H的24位地址(A23-A0),之后从器件会通过DO线返回制造商ID(EFH)和设备ID。
注:SPI为数据交换通信,主器件在发送“90H”指令时也会接收到一个字节FFH,但此数据为无效数据
(3)写使能命令(06H)
在向 FLASH 芯片存储矩阵写入数据前,首先要使能写操作,通过“Write Enable”命令即可写使能
(4)扇区擦除(20H)
由于 FLASH 存储器的特性决定了它只能把原来为“1”的数据位改写成“0”,而原来为“0”的数据位不能直接改写为“1”。所以这里涉及到数据“擦除”的概念。
在写入前,必须要对目标存储矩阵进行擦除操作,把矩阵中的数据位擦除为“1”,在数据写入的时候,如果要存储数据“1”,那就不修改存储矩阵 ,在要存储数据“0”时,才更改该位。
(5)读状态寄存器(05H)
FLASH 芯片向内部存储矩阵写入数据需要消耗一定的时间,并不是在总线通讯结束的一瞬间完成的,所以在写操作后需要确认 FLASH 芯片“空闲”。我们只需要读取状态寄存器SRP的S0即可(当这个位为“1”时,表明 FLASH芯片处于忙碌状态,它可能正在对内部的存储矩阵进行“擦除”或“数据写入”的操作)
(6)读数据(03H)
读数据指令可从存储器依次一个或多个数据字节,该指令通过主器件拉低/CS电平使能设备开始传输,然后传输“03H”指令,接着通过DI管脚传输24位地址,从器件接到地址后,寻址存储器中的数据通过DO引脚输出。每传输一个字节地址自动递增,所以只要时钟继续传输,可以不断读取存储器中的数据。
(7)写数据——页编程(02H)
页编程指令可以在已擦除的存储单元中写入256个字节。该指令先拉低/CS引脚电平,接着传输“02H”指令和24位地址。后面接着传输至少一个数据字节,最多256字节。
注: 当数据写到一个新的扇区的时候,需要重新发起一个页编程信号才能继续写入数据。
(1)无线远程遥控技术
又称为遥控技术,是指实现对被控目标的遥远控制,在工业控制、航空航天、家电领域应用广泛。
(2)红外遥控
是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机和手机系统中。
(3)红外通讯
就是通过红外线传输数据。发射器发出红外信号,接收器接收到信号进行解析。
(4)红外遥控器
红外遥控器是利用一个红外发光二极管,以红外光为载体来将按键信息传递给接收端的设备。红外光对于人眼是不可见的,因此使用红外遥控器不会影响人的视觉(可以打开手机摄像头,遥控器对着摄像头按,可以看到遥控器发出的红外光)。
(5)信号调制
日常生活环境中有很多红外光源,太阳、蜡烛火光、白炽灯、甚至是我们的身体。这些红外光源都可能会对我们的接收设备产生干扰,为了屏蔽干扰,只接收有效信息,我们就需要用到调制。
通过调制我们可以把指定的数字信号转换为特定频率的红外光进行发送,调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz
(6)红外接受器
红外线接收器是一种可以接收红外信号并能独立完成从红外线接收到输出与TTL电平信号兼容的器件,体积和普通的塑封三极管差不多,适合于各种红外线遥控和红外线数据传输。
(7)信号解调
解调就是将模拟信号转换成数字信号。红外接收器接收到外部发射器传过来的红外信号后,会按照固定的协议去解析信号,并转换成数字信号输出。
NEC协议特点
- 8 位地址码, 8 位命令码
- 完整发射两次地址码和命令码,以提高可靠性
- 脉冲时间长短调制方式
- 38KHz 载波频率
- 位时间 1.12ms 或 2.25ms
单总线是一种半双工通信方式
DS18B20共有6种信号类型:复位脉冲、应答脉冲、写0、写1、读0和读1。
所有这些信号,除了应答脉冲以外,都由主机发出同步信号。并且发送所有的命令和数据都是字节的低位在前。
(1)复位脉冲
单总线上的所有通信都是以初始化序列开始。主机输出低电平,保持低电平时间至少480 us,,以产生复位脉冲。接着主机释放总线,4.7K的上拉电阻将单总线拉高,延时15~60 us,并进入接收模式(Rx)。接着DS18B20拉低总线60~240 us,以产生低电平应答脉冲。
(2)写时序
写时序包括写0时序和写1时序。所有写时序至少需要60us,且在2次独立的写时序之间至少需要1us的恢复时间,两种写时序均起始于主机拉低总线。
(3)读时序
单总线器件仅在主机发出读时序时,才向主机传输数据,所以,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。所有读时序至少需要60us,且在2次独立的读时序之间至少需要1us的恢复时间。每个读时序都由主机发起,至少拉低总线1us。主机在读时序期间必须释放总线,并且在时序起始后的15us之内采样总线状态。
DS18B20的典型温度读取过程为:
温度数据的存储:
转化后得到的11位数据,存储在18B20的两个8比特的RAM中, MSB的前面5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反再乘于0.0625即可得到实际 温度。
例如+125℃的数字输出为07D0H,,-25.0625℃的数字输出为FE6FH
存储器是计算机结构的重要组成部分。存储器是用来存储程序代码和数据的部件,有了存储器计算机才具有记忆功能
RAM是“Random Access Memory”的缩写,被译为随机存储器。所谓“随机存取”,指的是当存储器中的消息被读取或写入时,所需要的时间与这段信息所在的位置无关。这个词的由来是因为早期计算机曾使用磁鼓作为存储器,磁鼓是顺序读写设备,而RAM可随读取其内部任意地址的数据,时间都是相同的,因此得名。
实际上现在RAM已经专门用于指代作为计算机内存的易失性半导体存储器。
根据RAM的存储机制,又分为动态随机存储器DRAM(Dynamic RAM)以及静态随机存储器SRAM(Static RAM)两种。
(1)DRAM的存储器
DRAM以电容的电荷来表示数据
种类 |
特点 |
普通SDRAM |
在上升沿时同步数据 |
DDRII SDRAM |
在上升沿及下降沿都同步数据,时钟极限频率800MHz |
DDRIII SDRAM |
在上升沿及下降沿都同步数据,时钟极限频率1600MHz |
(2)SRAM的存储器
(3)DRAM与SRAM的应用场合
DRAM和SRAM的特性对比:
特性 |
DRAM |
SRAM |
存取速度 |
较慢 |
较快 |
集成度 |
较高 |
较低 |
生产成本 |
较低 |
较高 |
是否需要刷新 |
是 |
否 |
注:所以在实际应用场合中,SRAM 一般只用于 CPU 内部的高速缓存(Cache),而外部扩展的内存一般使用 DRAM。
非易失性存储器种类非常多,半导体类的有 ROM 和 FLASH,而其它的则包括光盘、软盘及机械硬盘。
(1)ROM存储器
ROM是“Read Only Memory”的缩写,意为只能读的存储器。由于技术的发展,后来设计出了可以方便写入数据的ROM,而这个“Read Only Memory”的名称被沿用下来了,现在一般用于指代非易失性半导体存储器,包括后面介绍的FLASH存储器,有些人也把它归到ROM类里边。
种类 |
特性 |
MASK ROM |
出厂时固化,不可修改 |
OTPROM |
用户可写入一次,之后不可修改 |
EPROM |
可重复擦写,需要使用专用紫外线照射设备擦除 |
EEPROM |
可重复擦写,电擦除,使用方便 |
(2)FLASH存储器
FLASH存储器又称为闪存,它也是可重复擦写的储器,部分书籍会把FLASH存储器称为FLASH ROM,但它的容量一般比EEPROM大得多,且在擦除时,一般以多个字节为单位
根据存储单元电路的不同,FLASH存储器又分为NOR FLASH和NAND FLASH
特性 |
NOR FLASH |
NAND FLASH |
同容量存储器成本 |
较贵 |
较便宜 |
集成度 |
较低 |
较高 |
介质类型 |
随机存储 |
连续存储 |
地址线和数据线 |
独立分开 |
共用 |
擦除单元 |
以“扇区/块”擦除 |
以“扇区/块”擦除 |
读写单元 |
可以基于字节读写 |
必须以“块”为单位读写 |
读取速度 |
较高 |
较低 |
写入速度 |
较低 |
较高 |
坏块 |
较少 |
较多 |
是否支持XIP |
支持 |
不支持 |
STM32与SRAM
STM32控制器芯片内部有一定大小的SRAM及FLASH作为内存和程序存储空间,但当程序较大,内存和程序空间不足时,就需要在STM32芯片的外部扩展存储器了。STM32F407系列芯片可以扩展外部SRAM用作内存。
给STM32芯片扩展内存与给PC扩展内存的原理是一样的,只是PC上一般以内存条的形式扩展,而且内存条实质是由多个内存颗粒(即SDRAM芯片)组成的通用标准模块,而STM32扩展时,直接与SRAM芯片连接。
IS61LV25616SRAM外观:
IS61LV25616的特点:高速访问时间:8,10,12,15ns 容量:256K * 16bit
(1)SRAM信号线
信号线 |
类型 |
说明 |
A0-A17 |
I |
地址输入 |
I/O0-I/O7 |
I/O |
数据输入输出信号,低字节 |
I/O8-I/O15 |
I/O |
数据输入输出信号,高字节 |
CE# |
I |
片选信号,CE#低电平有效 |
OE# |
I |
输出使能信号,低电平有效 |
WE# |
I |
写入使能,低电平有效 |
UB# |
I |
数据掩码信号Upper Byte,高位字节允许访问,低电平有效, |
LB# |
I |
数据掩码信号Lower Byte,低位字节允许访问,低电平有效 |
SRAM的控制比较简单,只要控制信号线使能了访问,从地址线输入要访问的地址,即可从I/O数据线写入或读出数据。
(2)SRAM的控制电路
控制电路主要包含了片选、读写使能以及上面提到的宽度控制信号UB#和LB#。利用CE#片选信号,可以把多个SRAM芯片组成一个大容量的内存条。OE#和WE#可以控制读写使能,防止误操作。
(1)SRAM的读时序
重点时序:读周期时间(tRC) 地址建立时间(tAA) OE建立时间(tDOE)
(2)SRAM的写时序
重点时序:写周期时间(tWC) 地址建立时间(tSA) WE脉宽(tPWE)
(3)SRAM的读写流程
读写时序的流程很类似,过程如下:
STM32F4系列芯片使用FSMC外设来管理扩展的存储器,FSMC是Flexible Static Memory Controller的缩写,译为灵活的静态存储控制器。它可以用于驱动包括SRAM、NOR FLASH以及NAND FLSAH类型的存储器,不能驱动如SDRAM这种动态的存储器。而在STM32F429系列的控制器中,它具有FMC外设,支持控制SDRAM存储器。
(1)通讯引脚 (2)存储器控制器 (3)时钟控制逻辑
(1)通讯引脚
由于控制不同类型存储器的时候会有一些不同的引脚,看起来有非常多,其中地址线FSMC_A和数据线FSMC_D是所有控制器都共用的
FSMC引脚名称 |
对应SRAM引脚名 |
说明 |
FSMC_NBL[1:0] |
LB#、UB# |
数据掩码信号 |
FSMC_A[17:0] |
A[17:0] |
行地址线 |
FSMC_D[15:0] |
I/O[15:0] |
数据线 |
FSMC_NWE |
WE# |
写入使能 |
FSMC_NOE |
OE# |
输出使能(读使能) |
FSMC_NE[1:4] |
CE# |
片选信号 |
注:其中比较特殊的FSMC_NE是用于控制SRAM芯片的控制信号线,STM32具有FSMC_NE1/2/3/4号引脚,不同的引脚对应STM32内部不同的地址区域。
(2)存储器控制器
上面不同类型的引脚是连接到FSMC内部对应的存储控制器中的NOR/PSRAM/SRAM设备使用相同的控制器,NAND/PC卡设备使用相同的控制器,不同的控制器有专用的寄存器用于配置其工作模式。
相关控制寄存器:控制SRAM的有FSMC_ BCR 、FSMC_ BTR以及FSMC_BWTR寄存器。每种寄存器都有4个,分别对应于4个不同的存储区域,各种寄存器介绍如下:
(3)时钟控制逻辑
FSMC外设挂载在AHB总线上,时钟信号来自于HCLK(默认168MHz),控制器的同步时钟输出就是由它分频得到。
例如,NOR控制器的FSMC_CLK引脚输出的时钟,它可用于与同步类型的SRAM芯片进行同步通讯,它的时钟频率可通过FSMC_BTR寄存器的CLKDIV位配置,可以配置为HCLK的1/2或1/3,也就是说,若它与同步类型的SRAM通讯时,同步时钟最高频率为84MHz。
后面示例中的SRAM为异步类型的存储器,不使用同步时钟信号,所以时钟分频配置不起作用。
FSMC连接好外部的存储器并初始化后,就可以直接通过访问地址来读写数据。
FSMC访问存储器的方式与I2C EEPROM、SPI FLASH的不一样,后两种方式都需要控制I2C或SPI总线给存储器发送地址,然后获取数据;在程序里,这个地址和数据都需要分开使用不同的变量存储,并且访问时还需要使用代码控制发送读写命令。
而使用FSMC外接存储器时,其存储单元是映射到STM32的内部寻址空间的;在程序里,定义一个指向这些地址的指针,然后就可以通过指针直接修改该存储单元的内容,FSMC外设会自动完成数据访问过程,读写命令之类的操作不需要程序控制。
FSMC的NOR/PSRAM/SRAM/NAND FLASH以及PC卡的地址被映射到了External RAM地址空间内,使得访问FSMC控制的存储器时,就跟访问STM32的片上外设寄存器一样
FSMC把整个External RAM存储区域分成了4个Bank区域,并分配了地址范围及适用的存储器类型,如NOR及SRAM存储器只能使用Bank1的地址。
FSMC地址映射:在NOR及SRAM区域,每个Bank的内部又分成了4个小块,每个小块有相应的控制引脚用于连接片选信号,如FSMC_NE[4:1]信号线可用于选择BANK1内部的4小块地址区域,当STM32访问0x68000000-0x6BFFFFFF地址空间时,会访问到Bank1的第3小块区域,相应的FSMC_NE3信号线会输出控制信号。
注:内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器
ADDSET对于SRAM未作要求
FSMC的主频为168M,一个周期约等于6ns
注:内核发出访问某个指向外部存储器地址时,FSMC外设会根据配置控制信号线产生时序访问存储器
显示器属于计算机的 I/O 设备,即输入输出设备。它是一种将特定电子信息输出到屏幕上再反射到人眼的显示工具。
常见显示器有三类: CRT显示器 LCD液晶显示器 LED点阵显示器 OLED显示器
(1)CRT显示器
CRT显示器是靠电子束激发屏幕内表面的荧光粉来显示图像的,由于荧光粉被点亮后很快会熄灭,所以电子枪必须循环地不断激发这些点。
(2)LCD显示器:
液晶显示器,简称 LCD(Liquid Crystal Display),相对于上一代 CRT显示器,LCD 显示器具有功耗低、体积小、承载的信息量大及不伤眼的优点,因而它成为了现在的主流电子显示设备,其中包括电视、电脑显示器、手机屏幕及各种嵌入式设备的显示器。
液晶显示器的显示结构: 液晶是一种介于固体和液体之间的特殊物质,它是一种有机化合物,常态下呈液态,但是它的分子排列却和固体晶体一样非常规则,因此取名液晶。如果给液晶施加电场,会改变它的分子排列,从而改变光线的传播方向,配合偏振光片,它就具有控制光线透过率的作用,再配合彩色滤光片,改变加给液晶电压大小,就能改变某一颜色透光量的多少 利用这种原理,做出可控红、绿、蓝光输出强度的显示结构,把三种显示结构组成一个显示单位,通过控制红绿蓝的强度,可以使该单位混合输出不同的色彩,这样的一个显示单位被称为像素。
注意: 液晶本身是不发光的,所以需要有一个背光灯提供光源
(3)LED显示器:
LED点阵彩色显示器的单个像素点内包含红绿蓝三色LED灯,通过控制红绿蓝颜色的强度进行混色,实现全彩颜色输出,多个像素点构成一个屏幕。由于每个像素点都是LED灯自发光的,所以在户外白天也显示得非常清晰,但由于LED灯体积较大,导致屏幕的像素密度低,所以它一般只适合用于广场上的巨型显示器。相对来说,单色的LED点阵显示器应用得更广泛,如公交车上的信息展示牌、店广告牌等。
(4)OLED显示器:
新一代的OLED显示器与LED点阵彩色显示器的原理类似,但由于它采用的像素单元是“有机发光二极管”(Organic Light Emitting Diode),所以像素密度比普通LED点阵显示器高得多 OLED显示器不需要背光源、对比度高、轻薄、视角广及响应速度快等优点。待到生产工艺更加成熟时,必将取代现在液晶显示器的地位。
如分辨率为 800x480 的 液 晶 屏 使 用 RGB888 格 式 显 示 , 它 的 一 帧 显 示 数 据 大 小 为 :3x800x480=1152000 字 节 ;若 使 用 RGB565 格 式 显 示 , 一 帧 显 示 数 据 大 小 为 :2x800x480=768000 字节。
一般来说,外置的液晶控制器会自带显存,而像 STM32F429等集成液晶控制器的芯片可使用内部 SRAM或外扩 SDRAM用于显存空间
STM32F429 系列的芯片不需要额外的液晶控制器,也就是说它把专用液晶控制器的功能集成到 STM32F429 芯片内部了,可以理解为电脑的 CPU集成显卡。而 STM32F407 系列的芯片由于没有集成液晶控制器到芯片内部,所以它只能驱动自带控制器的屏幕,可以理解为电脑的外置显卡。
完整的显示屏由液晶显示面板、电容触摸面板以及 PCB底板构成
STM32F429 系列的芯片不需要额外的液晶控制器,也就是说它把专用液晶控制器的功能集成到 STM32F429 芯片内部了,可以理解为电脑的 CPU集成显卡。而 STM32F407 系列的芯片由于没有集成液晶控制器到芯片内部,所以它只能驱动自带控制器的屏幕,可以理解为电脑的外置显卡。
信号名称 |
说明 |
R[7:0] |
红色数据 |
G[7:0] |
绿色数据 |
B[7:0] |
蓝色数据 |
CLK |
像素同步时钟信号 |
HSYNC |
水平同步信号 |
VSYNC |
垂直同步信号 |
DE |
数据使能信号 |
如RGB565表示红绿蓝的数据线数分别为5、6、5根,一共为16个数据位,可表示216种颜色;
如果液晶屏的种颜色分量的数据线有8根,那它表示RGB888格式,一共24位数据线,可表示的颜色为224种。
注:液晶屏显示的图像可看作一个矩形,液晶屏有一个显示指针,它指向将要显示的像素。显示指针的扫描方向方向从左到右、从上到下,一个像素点一个像素点地描绘图形。这些像素点的数据通过RGB数据线传输至液晶屏,它们在同步时钟CLK的驱动下一个一个地传输到液晶屏中,交给显示指针,传输完成一行时,水平同步信号HSYNC电平跳变一次,而传输完一帧时VSYNC电平跳变一次。
时间参数 |
参数说明 |
VBP (vertical back porch) |
表示在一帧图像开始时,垂直同步信号以后的无效的行数 |
VFP (vertical front porch) |
表示在一帧图像结束后,垂直同步信号以前的无效的行数 |
HBP (horizontal back porch) |
表示从水平同步信号开始到一行的有效数据开始之间的CLK的个数 |
HFP (horizontal front porth) |
表示一行的有效数据结束到下一个水平同步信号开始之间的CLK的个数 |
VSW (vertical sync width) |
表示垂直同步信号的宽度,单位为行 |
HSW (horizontal sync width) |
表示水平同步信号的宽度,单位为同步时钟CLK的个数 |
液晶驱动芯片或LCD驱动器,其内部有着较大的缓存空间可以存储文字、图像等数据,并能够将这些信息送入液晶模块进行显示,由于专用的芯片,因此速度往往比较快。
LCD驱动芯片的主要功能就是对主机发送过来的数据/命令,进行变换,变成每个像素的RGB数据,使之在屏幕上显示出来。常见的液晶驱动芯片有ILI932、ILI9328、SSD1963、HX8347、ILI9341、NT5510等
SSD1963特性:
- 内部包含1215KB frame buffer
- 支持分辨率为864*480的显示屏
- 支持像素位深为24bpp的显示模式(RGB888)
注:液晶屏内部包含SSD1963控制器,该控制器使用 8080 接口与单片机通讯
void LCD_WR_Byte(uint8_t dat, uint8_t cmd)
{
LCD_Data_Out(dat); //放入数据
if(cmd)
LCD_DC_Set(); //传命令
else
LCD_DC_Clr(); //传数据
LCD_CS_Clr(); //拉低片选
LCD_WR_Clr(); //写使能
LCD_WR_Set(); //WR产生上升沿,数据锁存
LCD_CS_Set(); //取消片选
LCD_DC_Set(); //复位DC信号线
}
注:STM32通过8080接口与SSD1963 芯片进行通讯,实现对液晶屏的控制。通讯的内容主要包括命令和显存数据,显存数据即各个像素点的 RGB565 内容;命令是指对 SSD1963的控制指令,MCU 可通过8080接口发送命令编码控制 SSD1963的工作方式,例如复位指令、设置光标指令、睡眠。
FSMC-NOR信号线 |
功能 |
8080信号线 |
功能 |
NEx |
片选信号 |
CS# |
片选信号 |
NWR |
写使能 |
WR# |
写使能 |
NOE |
读使能 |
RD# |
读使能 |
D[15:0] |
数据信号 |
D[15:0] |
数据信号 |
A[25:0] |
地址信号 |
D/C# |
数据/命令选择 |
对于FSMC和8080接口,前四种信号线都是完全一样的,仅仅是FSMC的地址信号线A[25:0]与8080的数据/命令选择线D/C#有区别。
为了模拟出8080时序,我们可以把FSMC的A0地址线与SSD1963芯片8080接口的D/C#信号线连接,那么当A0为高电平时(即D/C#为高电平),数据线D[15:0]的信号会被SSD1963理解为数值,若A0为低电平时(即D/C#为低电平),传输的信号则会被理解为命令。
地址 |
地址的二进制值(仅列出低四位) |
A0(D/C#)的电平 |
控制SSD1963时的意义 |
0x6Cxx xxx1 |
0001 |
1 高电平 |
D数值 |
0x6Cxx xxx3 |
0011 |
1高电平 |
D数值 |
0x6Cxx xxx5 |
0101 |
1高电平 |
D数值 |
0x6Cxx xxx0 |
0000 |
0低电平 |
C命令 |
0x6Cxx xxx2 |
0010 |
0低电平 |
C命令 |
0x6Cxx xxx4 |
0100 |
0低电平 |
C命令 |
注:LCD控制器的片选连入到FSMC的NE4管脚。所以当发出0x6C00 0000-0x6FFF FFFF之间的地址时NE4输出低电平,选中LCD控制器
在实际控制时,以上地址计算方式还不完整,根据《STM32 参考手册》对 FSMC 访问NOR FLASH 的说明STM32 内部访问地址时使用的是内部 HADDR 总线, HADDR[25:0] 包含外部存储器地址。由于 HADDR 为字节地址,而存储器按字寻址,所以根据存储器数据宽度不同,实际向存储器发送的地址也将有所不同,如下表所示。
注:实际控制A0时:把前面的地址<<1就可以了
0x6C000000 低电平表示命令 0x6C000002 高电平表示数据
触摸屏又称触控面板,它是一种把触摸位置转化成坐标数据的输入设备,根据触摸屏的检测原理,主要分为电阻式触摸屏和电容式触摸屏。
目前电容式触摸屏被大部分应用在智能手机、平板电脑等电子设备中,而在汽车导航、工控机等设备中电阻式触摸屏仍占主流。
触摸屏实际上是在液晶屏上面贴了一层大小相等的薄膜,这个薄膜能够感知触碰,根据薄膜反馈的触摸位置,我们就能知道用户触碰在屏幕的什么位地方了。
电阻式的触摸屏结构如图,它主要由表面硬涂层、两个ITO层、间隔点以及玻璃底层构成,这些结构层都是透明的,整个触摸屏覆盖在液晶面板上,透过触摸屏可看到液晶面板。表面涂层起到保护作用,玻璃底层起承载的作用,而两个ITO层是触摸屏的关键结构,它们是涂有铟锡金属氧化物的导电层。两个ITO层之间使用间隔点使两层分开,当触摸屏表面受到压力时,表面弯曲使得上层ITO与下层ITO接触,在触点处连通电路。
两个ITO涂层的两端分别引出X-、X+、Y-、Y+四个电极,这是电阻屏最常见的四线结构,通过这些电极,外部电路向这两个涂层可以施加匀强电场或检测电压。
与电阻式触摸屏不同,电容式触摸屏不需要通过压力使触点变形。它的基本原理是利用充电时间检测电容大小,若手指触摸屏幕,会影响触摸点附近两个电极之间的耦合,从而改变两个电极之间的电容量,若检测到某电容的电容量发生了改变,即可获知该电容处有触摸动作从而通过检测出电容值的变化来获知触摸信号。
触摸控制芯片XPT2406
注:当触摸屏有触点按下时,PENIRQ 引脚会输出低电平,直到没有触摸的时候,它才会输出高电平
XPT2046命令字(控制字节):
uint8_t CMD_RDX=0XD0; //读取X轴坐标命令。
Uint8_t CMD_RDY=0X90; //读取Y轴坐标命令
0xD0:1 1 0 1 0 0 0 0 0x90:1 0 0 1 0 0 0 0
电源对电子设备的重要性不言而喻,它是保证系统稳定运行的基础,而保证系统能稳定运行后,又有低功耗的要求。
在很多应用场合中都对电子设备的功耗要求非常苛刻,如某些传感器信息采集设备,仅靠小型的电池提供电源,要求工作长达数年之久,且期间不需要任何维护;由于智慧穿戴设备的小型化要求,电池体积不能太大导致容量也比较小,所以也很有必要从控制功耗入手,提高设备的续行时间。
STM32有专门的电源管理外设监控电源并管理设备的运行模式,确保系统正常运行,并尽量降低器件的功耗。
STM32的电源管理系统主要分为:备份域、调压器供电电路、ADC电源电路
(1)备份域电路
STM32的备份域包括LSE振荡器、RTC、备份寄存器及备份SRAM这些器件,这部分的电路可以通过STM32的VBAT引脚获取供电电源,在实际应用中一般会使用3V的钮扣电池对该引脚供电。
在图中备份域电路的左侧有一个电源开关结构,它的功能类似图中的双二极管,在它的上方连接了VBAT电源,下方连接了VDD主电源(一般为3.3V),右侧引出到备份域电路中。当VDD主电源存在时,由于VDD电压较高,备份域电路通过VDD供电,当VDD掉电时,备份域电路由钮扣电池通过VBAT供电,保证电路能持续运行,从而可利用它保留关键数据
(2)调压器供电电路
在STM32的电源系统中调压器供电的电路是最主要的部分,调压器为备份域及待机电路以外的所有数字电路供电,其中包括内核、数字外设以及RAM,调压器的输出电压约为1.2V,因而使用调压器供电的这些电路区域被称为1.2V域。
调压器可控制调节供电电路使系统运行在“运行模式”、“停止模式”以及“待机模式”下:
(3)ADC电源控制电路
为了提高转换精度,STM32的ADC配有独立的电源接口,方便进行单独的滤波。ADC的工作电源使用VDDA引脚输入,使用VSSA作为独立的地连接,VREF引脚则为ADC提供测量使用的参考电压。
很多单片机都有低功耗模式,STM32F4 也不例外 ,运行状态下的 HCLK 为 CPU 提供时钟,内核执行程序代码。当 CPU 不需继续运行时,可以利用多个低功耗模式来节省功耗,例如等待某个外部事件时。
STM32F4 按功耗由高到低排列具有运行、睡眠、停止和待机四种工作模式。
上电复位后STM32处于运行状态时,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式降低功耗,这三种模式中,电源消耗不同、唤醒时间不同、唤醒源不同,用户需要根据应用需求,选择最佳的低功耗模式。这三种低功耗模式层层递进,运行的时钟或芯片功能越来越少,因而功耗越来越低。
特性 |
说明 |
立即睡眠 |
在执行 WFI 或 WFE 指令时立即进入睡眠模式。 |
退出时睡眠 |
在退出优先级最低的中断服务程序后才进入睡眠模式。 |
进入方式 |
内核寄存器的SLEEPDEEP = 0 ,然后调用WFI或WFE指令即可进入睡眠模式; 另外若内核寄存器的SLEEPONEXIT=0时,进入“立即睡眠”模式,SLEEPONEXIT=1时,进入“退出时睡眠”模式。 |
唤醒方式 |
如果是使用WFI指令睡眠的,则可使用任意中断唤醒; 如果是使用WFE指令睡眠的,则由事件唤醒。 |
睡眠时 |
关闭内核时钟,内核停止,而外设正常运行,在软件上表现为不再执行新的代码。这个状态会保留睡眠前的内核寄存器、内存的数据。 |
唤醒延迟 |
无延迟。 |
唤醒后 |
若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。 |
特性 |
说明 |
调压器低功耗模式 |
在停止模式下调压器可工作在正常模式或低功耗模式,可进一步降低功耗 |
FLASH掉电模式 |
在停止模式下FLASH可工作在正常模式或掉电模式,可进一步降低功耗 |
进入方式 |
内核寄存器的SLEEPDEEP =1,PWR_CR寄存器中的PDDS=0,然后调用WFI或WFE指令即可进入停止模式; PWR_CR 寄存器的LPDS=0时,调压器工作在正常模式,LPDS=1时工作在低功耗模式; PWR_CR 寄存器的FPDS=0时,FLASH工作在正常模式,FPDS=1时进入掉电模式。 |
唤醒方式 |
如果是使用WFI指令睡眠的,可使用任意EXTI线的中断唤醒;如果是使用WFE指令睡眠的,可使用任意配置为事件模式的EXTI线事件唤醒。 |
停止时 |
内核停止,片上外设也停止。这个状态会保留停止前的内核寄存器、内存的数据。 |
唤醒延迟 |
基础延迟为HSI振荡器的启动时间,若调压器工作在低功耗模式,还需要加上调压器从低功耗切换至正常模式下的时间,若FLASH工作在掉电模式,还需要加上FLASH从掉电模式唤醒的时间。 |
唤醒后 |
若由中断唤醒,先进入中断,退出中断服务程序后,接着执行WFI指令后的程序;若由事件唤醒,直接接着执行WFE后的程序。唤醒后,STM32会使用HIS作为系统时钟。 |
特性 |
说明 |
进入方式 |
内核寄存器的SLEEPDEEP =1,PWR_CR寄存器中的PDDS=1,PWR_CR寄存器中的唤醒状态位WUF=0,然后调用WFI或WFE指令即可进入待机模式; |
唤醒方式 |
通过WKUP引脚的上升沿,RTC闹钟、唤醒、入侵、时间戳事件或NRST引脚外部复位及IWDG复位唤醒。 |
待机时 |
内核停止,片上外设也停止;内核寄存器、内存的数据会丢失;除复位引脚、RTC_AF1引脚及WKUP引脚,其它I/O口均工作在高阻态。 |
唤醒延迟 |
芯片复位的时间 |
唤醒后 |
相当于芯片复位,在程序表现为从头开始执行代码。 |
SD卡(Secure Digital Memory Card)即:安全数码卡,它是在MMC的基础上发展而来,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk公司于1999年8月共同开发研制。
SD卡按容量分类,可以分为3类:SD卡、SDHC卡、SDXC卡,如下表所示:
容量 |
命名 |
简称 |
0~2G |
Standard Capacity SD Memory Card |
SDSC或SD |
2G~32G |
High Capacity SD Memory Card |
SDHC |
32G~2T |
Extended Capacity SD Memory Card |
SDXC |
SD卡由9个引脚与外部通信,支持SPI和SDIO两种模式,不同模式下,SD卡引脚功能描述如下表所示:
一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5个部分
SD卡总共有8个寄存器,用于设定或表示SD卡信息。这些寄存器只能通过对应的命令访问,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。
名称 |
bit宽度 |
描述 |
CID |
128 |
卡识别号(Card identification number):用来识别的卡的个体号码(唯一的) |
RCA |
16 |
相对地址(Relative card address):卡的本地系统地址,初始化时,动态地由卡建议,主机核准。 |
DSR |
16 |
驱动级寄存器(Driver Stage Register):配置卡的输出驱动 |
CSD |
128 |
卡的特定数据(Card Specific Data):卡的操作条件信息 |
SCR |
64 |
SD配置寄存器(SD Configuration Register):SD 卡特殊特性信息 |
OCR |
32 |
操作条件寄存器(Operation conditions register) |
SSR |
512 |
SD状态(SD Status):SD卡专有特征的信息 |
CSR |
32 |
卡状态(Card Status):卡状态信息 |
SD卡(Secure Digital Memory Card)在我们生活中已经非常普遍了,控制器对SD卡进行读写通信操作一般有两种通信接口可选,一种是SPI接口,另外一种就是SDIO接口。SDIO全称是安全数字输入/输出接口,多媒体卡(MMC)、SD卡、SD I/O卡都有SDIO接口。STM32F407系列控制器有一个SDIO主机接口,它可以与MMC卡、SD卡、SD I/O卡以及CE-ATA设备进行数据传输。
参考资料:
- 多媒体卡协会网站www.mmca.org中提供了有MMCA技术委员会发布的多媒体卡系统规范。
- SD卡协会网站www.sdcard.org中提供了SD存储卡和SDIO卡系统规范。
- CE-ATA工作组网站www.ce-ata.org中提供了CE_ATA系统规范。
5、SDIO设备分类
注:目前SDIO协议提供的SD卡规范版本最新是4.01版本,但STM32F42x系列控制器只支持SD卡规范版本2.0,即只支持标准容量SD和高容量SDHC标准卡,不支持超大容量SDXC标准卡,所以可以支持的最高卡容量是32GB
SDIO 具有以下特性:
- 完全兼容 多媒体卡系统规范版本 4.2。卡支持三种不同数据总线模式:1 位(默认)、4 位和 8 位
- 完全兼容先前版本的多媒体卡(向前兼容性)
- 完全兼容 SD 存储卡规范版本 2.0
- 完全兼容 SD I/O 卡规范版本 2.0 : 卡支持两种不同数据总线模式:1 位(默认)和 4 位
- 完全支持 CE-ATA 功能(完全符合 CE-ATA 数字协议版本 1.1)
- 对于 8 位模式,数据传输高达 48 MHz
- 数据和命令输出使能信号,控制外部双向驱动程序。
- SDIO 不具备兼容 SPI 的通信模式。
SDIO 由两部分组成:
注:
- 默认情况下,SDIO_D0 用于数据传输。初始化后,主机可以更改数据总线宽度。
- SD 卡连接到总线,主机可以将数据传输配置为SDIO_D[3:0]
- SDIO 使用两个时钟信号:SDIO 适配器时钟 (SDIOCLK = 48 MHz)和APB2 总线时钟 (PCLK2)
SDIO_CK计算公式:
注意:在SD卡初始化时,SDIO_CK不可以超过400Khz,初始化完成后,可以设置为最大频率(但不可以超过SD卡最大操作频率)。
该适配器由五个子单元组成:
名称 |
bit宽度 |
描述 |
CID |
128 |
卡识别号(Card identification number):用来识别的卡的个体号码(唯一的) |
RCA |
16 |
相对地址(Relative card address):卡的本地系统地址,初始化时,动态地由卡建议,主机核准。 |
DSR |
16 |
驱动级寄存器(Driver Stage Register):配置卡的输出驱动 |
CSD |
128 |
卡的特定数据(Card Specific Data):卡的操作条件信息 |
SCR |
64 |
SD配置寄存器(SD Configuration Register):SD 卡特殊特性信息 |
OCR |
32 |
操作条件寄存器(Operation conditions register) |
SSR |
512 |
SD状态(SD Status):SD卡专有特征的信息 |
CSR |
32 |
卡状态(Card Status):卡状态信息 |
SD命令由主机发出,以广播命令和寻址命令为例,广播命令是针对与SD主机总线连接的所有从设备发送的,寻址命令是指定某个地址设备进行命令传输。
SD命令格式固定为48bit,都是通过CMD线连续传输的,数据线不参与。
SD命令的组成如下:
SD命令有4种类型:
在标准中定义了两种类型的通用命令:特定应用命令(ACMD)和常规命令(GEN_CMD)
要使用SD卡制造商特定的ACMD命令如ACMD6,需要在发送该命令之前无发送CMD55命令,告知SD卡接下来的命令为特定应用命令。CMD55命令只对紧接的第一个命令有效,SD卡如果检测到CMD55之后的第一条命令为ACMD则执行其特定应用功能,如果检测发现不是ACMD命令,则执行标准命令。
命令序号 |
类型 |
参数 |
响应 |
缩写 |
描述 |
基本命令(Class 0) |
|||||
CMD0 |
bc |
[31:0]填充位 |
- |
GO_IDLE_STATE |
复位所有的卡到idle状态。 |
CMD2 |
bcr |
[31:0]填充位 |
R2 |
ALL_SEND_CID |
通知所有卡通过CMD线返回CID值。 |
CMD3 |
bcr |
[31:0]填充位 |
R6 |
SEND_RELATIVE_ADDR |
通知所有卡发布新RCA。 |
CMD4 |
bc |
[31:16]DSR[15:0]填充位 |
- |
SET_DSR |
编程所有卡的DSR。 |
CMD7 |
ac |
[31:16]RCA[15:0]填充位 |
R1b |
SELECT/DESELECT_CARD |
选择/取消选择RCA地址卡。 |
CMD8 |
bcr |
[31:12]保留位[11:8]VHS[7:0]检查模式 |
R7 |
SEND_IF_COND |
发送SD卡接口条件,包含主机支持的电压信息,并询问卡是否支持。 |
CMD9 |
ac |
[31:16]RCA[15:0]填充位 |
R2 |
SEND_CSD |
选定卡通过CMD线发送CSD内容 |
CMD10 |
ac |
[31:16]RCA[15:0]填充位 |
R2 |
SEND_CID |
选定卡通过CMD线发送CID内容 |
CMD12 |
ac |
[31:0]填充位 |
R1b |
STOP_TRANSMISSION |
强制卡停止传输 |
CMD13 |
ac |
[31:16]RCA[15:0]填充位 |
R1 |
SEND_STATUS |
选定卡通过CMD线发送它状态寄存器 |
CMD15 |
ac |
[31:16]RCA[15:0]填充位 |
- |
GO_INACTIVE_STATE |
使选定卡进入“inactive”状态 |
面向块的读操作(Class 2) |
|||||
CMD16 |
ac |
[31:0]块长度 |
R1 |
SET_BLOCK_LEN |
对于标准SD卡,设置块命令的长度,对于SDHC卡块命令长度固定为512字节。 |
CMD17 |
adtc |
[31:0]数据地址 |
R1 |
READ_SINGLE_BLOCK |
对于标准卡,读取SEL_BLOCK_LEN长度字节的块;对于SDHC卡,读取512字节的块。 |
CMD18 |
adtc |
[31:0]数据地址 |
R1 |
READ_MULTIPLE_BLOCK |
连续从SD卡读取数据块,直到被CMD12中断。块长度同CMD17。 |
面向块的写操作(Class 4) |
|||||
CMD24 |
adtc |
[31:0]数据地址 |
R1 |
WRITE_BLOCK |
对于标准卡,写入SEL_BLOCK_LEN长度字节的块;对于SDHC卡,写入512字节的块。 |
CMD25 |
adtc |
[31:0]数据地址 |
R1 |
WRITE_MILTIPLE_BLOCK |
连续向SD卡写入数据块,直到被CMD12中断。每块长度同CMD17。 |
CMD27 |
adtc |
[31:0]填充位 |
R1 |
PROGRAM_CSD |
对CSD的可编程位进行编程 |
命令序号 |
类型 |
参数 |
响应 |
缩写 |
描述 |
基本命令(Class 0) |
|||||
CMD0 |
bc |
[31:0]填充位 |
- |
GO_IDLE_STATE |
复位所有的卡到idle状态。 |
CMD2 |
bcr |
[31:0]填充位 |
R2 |
ALL_SEND_CID |
通知所有卡通过CMD线返回CID值。 |
CMD3 |
bcr |
[31:0]填充位 |
R6 |
SEND_RELATIVE_ADDR |
通知所有卡发布新RCA。 |
CMD4 |
bc |
[31:16]DSR[15:0]填充位 |
- |
SET_DSR |
编程所有卡的DSR。 |
CMD7 |
ac |
[31:16]RCA[15:0]填充位 |
R1b |
SELECT/DESELECT_CARD |
选择/取消选择RCA地址卡。 |
CMD8 |
bcr |
[31:12]保留位[11:8]VHS[7:0]检查模式 |
R7 |
SEND_IF_COND |
发送SD卡接口条件,包含主机支持的电压信息,并询问卡是否支持。 |
CMD9 |
ac |
[31:16]RCA[15:0]填充位 |
R2 |
SEND_CSD |
选定卡通过CMD线发送CSD内容 |
CMD10 |
ac |
[31:16]RCA[15:0]填充位 |
R2 |
SEND_CID |
选定卡通过CMD线发送CID内容 |
CMD12 |
ac |
[31:0]填充位 |
R1b |
STOP_TRANSMISSION |
强制卡停止传输 |
CMD13 |
ac |
[31:16]RCA[15:0]填充位 |
R1 |
SEND_STATUS |
选定卡通过CMD线发送它状态寄存器 |
CMD15 |
ac |
[31:16]RCA[15:0]填充位 |
- |
GO_INACTIVE_STATE |
使选定卡进入“inactive”状态 |
面向块的读操作(Class 2) |
|||||
CMD16 |
ac |
[31:0]块长度 |
R1 |
SET_BLOCK_LEN |
对于标准SD卡,设置块命令的长度,对于SDHC卡块命令长度固定为512字节。 |
CMD17 |
adtc |
[31:0]数据地址 |
R1 |
READ_SINGLE_BLOCK |
对于标准卡,读取SEL_BLOCK_LEN长度字节的块;对于SDHC卡,读取512字节的块。 |
CMD18 |
adtc |
[31:0]数据地址 |
R1 |
READ_MULTIPLE_BLOCK |
连续从SD卡读取数据块,直到被CMD12中断。块长度同CMD17。 |
面向块的写操作(Class 4) |
|||||
CMD24 |
adtc |
[31:0]数据地址 |
R1 |
WRITE_BLOCK |
对于标准卡,写入SEL_BLOCK_LEN长度字节的块;对于SDHC卡,写入512字节的块。 |
CMD25 |
adtc |
[31:0]数据地址 |
R1 |
WRITE_MILTIPLE_BLOCK |
连续向SD卡写入数据块,直到被CMD12中断。每块长度同CMD17。 |
CMD27 |
adtc |
[31:0]填充位 |
R1 |
PROGRAM_CSD |
对CSD的可编程位进行编程 |
SD命令的响应:
响应由SD卡向主机发出,部分命令要求SD卡作出响应,这些响应多用于反馈SD卡的状态。基本特性如下:
R1(正常响应命令) |
||||||||
描述 |
起始位 |
传输位 |
命令号 |
卡状态 |
CRC7 |
终止位 |
||
Bit |
47 |
46 |
[45:40] |
[39:8] |
[7:1] |
0 |
||
位宽 |
1 |
1 |
6 |
32 |
7 |
1 |
||
值 |
"0" |
"0" |
x |
x |
x |
"1" |
||
备注 |
如果有传输到卡的数据,那么在数据线可能有busy信号 |
|||||||
R2(CID,CSD寄存器) |
||||||||
描述 |
起始位 |
传输位 |
保留 |
[127:1] |
终止位 |
|||
Bit |
135 |
134 |
[133:128] |
127 |
0 |
|||
位宽 |
1 |
1 |
6 |
x |
1 |
|||
值 |
"0" |
"0" |
"111111" |
CID或者CSD寄存器[127:1]位的值 |
"1" |
|||
备注 |
CID寄存器内容作为CMD2和CMD10响应,CSD寄存器内容作为CMD9响应。 |
|||||||
R3(OCR寄存器) |
||||||||
描述 |
起始位 |
传输位 |
保留 |
OCR寄存器 |
保留 |
终止位 |
||
Bit |
47 |
46 |
[45:40] |
[39:8] |
[7:1] |
0 |
||
位宽 |
1 |
1 |
6 |
32 |
7 |
1 |
||
值 |
"0" |
"0" |
"111111" |
x |
"1111111" |
"1" |
||
备注 |
OCR寄存器的值作为ACMD41的响应 |
|||||||
R6(发布的RCA寄存器响应) |
||||||||
描述 |
起始位 |
传输位 |
CMD3 |
RCA寄存器 |
卡状态位 |
CRC7 |
终止位 |
|
Bit |
47 |
46 |
[45:40] |
[39:8] |
[7:1] |
0 |
||
位宽 |
1 |
1 |
6 |
16 |
16 |
7 |
1 |
|
值 |
"0" |
"0" |
"000011" |
x |
x |
x |
"1" |
|
备注 |
专用于命令CMD3的响应 |
|||||||
R7(发布的RCA寄存器响应) |
||||||||
描述 |
起始位 |
传输位 |
CMD8 |
保留 |
接收电压 |
检测模式 |
CRC7 |
终止位 |
Bit |
47 |
46 |
[45:40] |
[39:20] |
[19:16] |
[15:8] |
[7:1] |
0 |
位宽 |
1 |
1 |
6 |
20 |
4 |
8 |
7 |
1 |
值 |
"0" |
"0" |
"001000" |
"00000h" |
x |
x |
x |
"1" |
备注 |
专用于命令CMD8的响应,返回卡支持电压范围和检测模式 |
SDIO读数据:
SDIO写数据:
SD卡的操作模式及切换:
SD卡有多个版本,STM32控制器目前最高支持《Physical Layer Simplified Specification V2.0》定义的SD卡,STM32控制器对SD卡进行数据读写之前需要识别卡的种类:V1.0标准卡、V2.0标准卡、V2.0高容量卡或者不被识别卡。
SD卡系统定义了两种操作模式:卡识别模式和数据传输模式。
在系统复位后,主机处于卡识别模式,寻找总线上可用的SDIO设备;同时,SD卡也处于卡识别模式,直到被主机识别到,即当SD卡接收到SEND_RCA(CMD3)命令后,SD卡就会进入数据传输模式,而主机在总线上所有卡被识别后也进入数据传输模式。
每个操作模式下,SD卡都有几种状态,通过命令控制实现卡状态的切换:
操作模式 |
SD卡状态 |
无效模式(Inactive) |
无效状态(Inactive State) |
卡识别模式(Card identification mode) |
空闲状态(Idle State) |
准备状态(Ready State) |
|
识别状态(Identification State) |
|
数据传输模式(Data transfer mode) |
待机状态(Stand-by State) |
传输状态(Transfer State) |
|
发送数据状态(Sending-data State) |
|
接收数据状态(Receive-data State) |
|
编程状态(Programming State) |
|
断开连接状态(Disconnect State) |
卡识别模式
注:在卡识别过程中,要求SD卡工作在识别时钟频率FOD的状态下。
数据传输模式
只有SD卡系统处于数据传输模式下才可以进行数据读写操作。数据传输模式下可以将主机SD时钟频率设置为FPP,默认最高为25MHz,频率切换可以通过CMD4命令来实现。
CMD7用来选定和取消指定的卡
总结了华清远见物联网课程Leve4的主要知识点,希望对大家有所帮助。
本文在语雀同时发布:
https://www.yuque.com/docs/share/9e0b58e0-6aaf-4475-9e20-dd4a7790e62b?#
《物联网ARM开发高级》密码:bgxn
希望大家多多关注。