嵌入式Linux(3):DDR内存及通讯协议UART、I2C、SPI
嵌入式Linux驱动开发(一)DDR内存DDRUARTI2CSPIDDR内存RAM: 随机存储器,可以随时进行读写操作,速度很快,掉电以后数据会丢失。比如内存条、 SRAM、 SDRAM、 DDR 等都是 RAM。 RAM 一般用来保存程序数据、中间结果,比如在程序中定义了一个变量 a,然后对这个 a 进行读写操作。int a;a = 10;a 是一个变量,我们需要很方便的对这个变量进行读写操作,
DDR内存
RAM: 随机存储器,可以随时进行读写操作,速度很快,掉电以后数据会丢失。比如内存条、 SRAM、 SDRAM、 DDR 等都是 RAM。 RAM 一般用来保存程序数据、中间结果,比如在程序中定义了一个变量 a,然后对这个 a 进行读写操作。
int a;
a = 10;
a 是一个变量,我们需要很方便的对这个变量进行读写操作,方法就是直接“a”进行读写操作,不需要在乎具体的读写过程。我们可以随意的对 RAM 中任何地址的数据进行读写操作,非常方便。
ROM: 只读存储器,相比于 RAM,向 ROM 或者 Flash 写入数据要复杂很多,因此意味着速度就会变慢(相比 RAM),但是 ROM 和 Flash 可以将容量做的很大,而且掉电以后数据不会丢失,适合用来存储资料,比如音乐、图片、视频等信息。
综上所述, RAM 速度快,可以直接和 CPU 进行通信,但是掉电以后数据会丢失,容量不容易做大(和同价格的 Flash 相比)。 ROM(目前来说,更适合叫做 Flash)速度虽然慢,但是容量大、适合存储数据。对于正点原子的 I.MX6U-ALPHA 开发板而言, 256MB/512MB 的 DDR3 就是 RAM,而 512MB NANF Flash 或 8GB EMMC 就是 ROM。
SRAM :全称叫做 Static Random-Access Memory,也就是静态随机存储器,这里的“静态”说的就是只要 SRAM 上电,那么 SRAM 里面的数据就会一直保存着,直到 SRAM 掉电。对于RAM 而言需要可以随机的读取任意一个地址空间内的数据,因此采用了地址线和数据线分离,地址线、控制线、数据线。成本高!价格高,容量小。
SDRAM :全称是 Synchronous Dynamic Random Access Memory,翻译过来就是同步动态随机存储器,“同步”的意思是 SDRAM 工作需要时钟线,“动态”的意思是 SDRAM 中的数据需要不断的刷新来保证数据不会丢失,“随机”的意思就是可以读写任意地址的数据。
与 SRAM 相比, SDRAM 集成度高、功耗低、成本低、适合做大容量存储,但是需要定时刷新来保证数据不会丢失。因此SDRAM 适合用来做内存条, SRAM 适合做高速缓存或 MCU内部的 RAM。
DDR
DDR 内存是 SDRAM 的升级版本, SDRAM 分为 SDR SDRAM、DDR SDRAM、 DDR2 SDRAM、 DDR3 SDRAM、 DDR4 SDRAM。
DDR 全称是 Double Data Rate SDRAM,也就是双倍速率 SDRAM,看名字就知道 DDR 的速率(数据传输速率)比 SDRAM 高 1 倍!这 1 倍的速度不是简简单单的将 CLK 提高 1 倍,SDRAM 在一个 CLK 周期传输一次数据, DDR 在一个 CLK 周期传输两次数据,也就是在上升沿和下降沿各传输一次数据,这个概念叫做预取(prefetch),相当于 DDR 的预取为 2bit,因此DDR 的速度直接加倍。
SDRAM | DDR | DDR2 | DDR3 |
---|---|---|---|
速度一般是 133~ 200MHz,对应的传输速度就是133~ 200MT/s | 同样 133~ 200MHz的频率, DDR 的传输速度就变为了 266~ 400MT/S | DDR2 的 IO 时钟是 DDR 的 2 倍,因此 DDR 内核时钟依旧是 133~ 200MHz 的时候,总线速度就是 266~ 400MHz ,而且 DDR2 在 DDR 基础上进一步增加预取(prefetch),增加到了 4bit,相当于比 DDR 多读取一倍的数据,因此 DDR2 的数据传输速率就是 533~ 800MT/s | DDR3 在 DDR2 的基础上将预取(prefetch)提高到 8bit,因此又获得了比 DDR2 高一倍的传输速率,因此在总线时钟同样为 266~ 400MHz 的情况下, DDR3 的传输速率就是 1066~1600MT/S。 |
- I.MX6U 的 MMDC 外设用于连接 DDR,支持 LPDDR2、 DDR3、 DDR3L,最高支持 16 位数据位宽。总线速度为 400MHz(实际是 396MHz),数据传输速率最大为 800MT/S。
LPDDR3、 DDR3 和 DDR3L 的区别,这三个都是 DDR3,但是区别主要在于工作电压, LPDDR3叫做低功耗 DDR3,工作电压为 1.2V。 DDR3 叫做标压 DDR3,工作电压为 1.5V,一般台式内存条都是 DDR3。 DDR3L 是低压 DDR3,工作电压为 1.35V,一般手机、嵌入式、笔记本等都使用 DDR3L。
MMDC控制器
MMDC 是一个多模的 DDR 控制器,可以连接 16 位宽的 DDR3/DDR3L、 16 位宽的 LPDDR2, MMDC 是一个可配置、高性能的 DDR 控制器。 MMDC 外设包含一个内核(MMDC_CORE)和 PHY(MMDC_PHY),内核和 PHY 的功能如下:
- MMDC 内核:内核负责通过 AXI 接口与系统进行通信、 DDR 命令生成、 DDR 命令优化、读/写数据路径。
- MMDC PHY: PHY 负责时序调整和校准,使用特殊的校准机制以保障数据能够在 400MHz被准确捕获。
UART
1、 UART 通信格式
(用于蓝牙、GPS、GPRS模块)串口全称叫做串行接口,通常也叫做 COM 接口,串行接口指的是数据一个一个的顺序传输,通信线路简单。使用两条线即可实现双向通信,一条用于发送,一条用于接收。串口通信距离远,但是速度相对会低,串口是一种很常用的工业接口。 I.MX6U 自带的 UART 外设就是串口的一种, UART 全称是 Universal Asynchronous Receiver/Trasmitter,也就是异步串行收发器。
USART 的全 称 是 Universal Synchronous/Asynchronous Receiver/Transmitter,也就是同步/异步串行收发器。 相比 UART 多了一个同步的功能,在硬件上体现出来的就是多了一条时钟线。 一般 USART 是可以作为 UART使用的,也就是不使用其同步的功能。
UART 作为串口的一种,其工作原理也是将数据一位一位的进行传输,发送和接收各用一条线,因此通过 UART 接口与外界相连最少只需要三条线: TXD(发送)、 RXD(接收)和 GND(地线)。
- 空闲位:数据线在空闲状态的时候为逻辑“1”状态,也就是高电平,表示没有数据线空闲,没有数据传输。
- 起始位:当要传输数据的时候先传输一个逻辑“0”,也就是将数据线拉低,表示开始数据传输。
- 数据位: 数据位就是实际要传输的数据,数据位数可选择 5~8 位,我们一般都是按照字节传输数据的,一个字节 8 位,因此数据位通常是 8 位的。低位在前,先传输,高位最后传输。
- 奇偶校验位: 这是对数据中“1”的位数进行奇偶校验用的,可以不使用奇偶校验功能。
- 停止位:数据传输完成标志位,停止位的位数可以选择 1 位、 1.5 位或 2 位高电平,一般都选择 1 位停止位。
- 波特率:波特率就是 UART 数据传输的速率,也就是每秒传输的数据位数,一般选择 9600、19200、 115200 等。
2、UART 电平标准
UART 一般的接口电平有 TTL 和 RS-232,一般开发板上都有 TXD 和 RXD 这样的引脚,这些引脚低电平表示逻辑 0,高电平表示逻辑 1,这个就是 TTL 电平。 RS-232 采用差分线, -3~-
15V 表示逻辑 1, +3~+15V 表示逻辑 0。
I2C
用于陀螺仪、加速度计、触摸屏。I2C 是常见的一种总线协议, I2C 使用两条线在主控制器和从机之间进行数据通信。一条是 SCL(串行时钟线),另外一条是 SDA(串行数据线),这两条数据线需要接上拉电阻,总线空闲的时候 SCL 和 SDA 处于高电平。 I2C 总线标准模式下速度可以达到 100Kb/S,快速模式下可以达到 400Kb/S。
I2C 是支持多从机的,也就是一个 I2C 控制器下可以挂多个 I2C 从设备,这些不同的 I2C从设备有不同的器件地址,这样 I2C 主控制器就可以通过 I2C 设备的器件地址访问指定的 I2C设备了,一个 I2C 总线连接多个 I2C 设备。
1、起始位
I2C 通信起始标志,通过这个起始位就可以告诉 I2C 从机,要开始进行 I2C 通信了。在 SCL 为高电平的时候, SDA 出现下降沿就表示为起始位:
2、停止位
停止位就是停止 I2C 通信的标志位,和起始位的功能相反。在 SCL 位高电平的时候, SDA出现上升沿就表示为停止位,
3、数据传输
I2C 总线在数据传输的时候要保证在 SCL 高电平期间, SDA 上的数据稳定,因此 SDA 上的数据变化只能在 SCL 低电平期间发生。
4、应答信号
当 I2C 主机发送完 8 位数据以后会将 SDA 设置为输入状态,等待 I2C 从机应答,也就是等到 I2C 从机告诉主机它接收到数据了。应答信号是由从机发出的,主机需要提供应答信号所需的时钟,主机发送完 8 位数据以后紧跟着的一个时钟信号就是给应答信号使用的。从机通过将 SDA 拉低来表示发出应答信号,表示通信成功,否则表示通信失败。
5、 I2C 写时序
主机通过 I2C 总线与从机之间进行通信两个操作:写和读。
I2C 总线单字节写时序:
- 写时序的具体步骤:
1)、开始信号。
2)、发送 I2C 设备地址,每个 I2C 器件都有一个设备地址,通过发送具体的设备地址来决定访问哪个 I2C 器件。这是一个 8 位的数据,其中高 7 位是设备地址,最后 1 位是读写位,为1 的话表示这是一个读操作,为 0 的话表示这是一个写操作。
3)、 I2C 器件地址后面跟着一个读写位,为 0 表示写操作,为 1 表示读操作。
4)、从机发送的 ACK 应答信号。
5)、重新发送开始信号。
6)、发送要写写入数据的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、发送要写入寄存器的数据。
9)、从机发送的 ACK 应答信号。
10)、停止信号。
6、 I2C 读时序
I2C 总线单字节读时序
读时序分为 4 大步,第一步是发送设备地址,第二步是发送要读取的寄存器地址,第三步重新发送设备地址,最后一步就是 I2C 从器件输出要读取的寄存器值
- 1)、主机发送起始信号。
2)、主机发送要读取的 I2C 从设备地址。
3)、读写控制位,因为是向 I2C 从设备发送数据,因此是写信号。
4)、从机发送的 ACK 应答信号。
5)、重新发送 START 信号。
6)、主机发送要读取的寄存器地址。
7)、从机发送的 ACK 应答信号。
8)、重新发送 START 信号。
9)、重新发送要读取的 I2C 从设备地址。
10)、读写控制位,这里是读信号,表示接下来是从 I2C 从设备里面读取数据。
11)、从机发送的 ACK 应答信号。
12)、从 I2C 器件里面读取到的数据。
13)、主机发出 NO ACK 信号,表示读取完成,不需要从机再发送 ACK 信号了。
14)、主机发出 STOP 信号,停止 I2C 通信。
SPI
SPI 全称是 Serial Perripheral Interface,也就是串行外围设备接口。 SPI 是 Motorola 公司推出的一种同步串行接口技术,是一种高速、全双工的同步通信总线, SPI 时钟频率相比 I2C 要高很多,最高可以工作在上百 MHz。 SPI 以主从方式工作,通常是有一个主设备和一个或多个从设备,一般 SPI 需要4 根线,但是也可以使用三根线(单向传输)。
- ①、 CS/SS, Slave Select/Chip Select,这个是片选信号线,用于选择需要进行通信的从设备。I2C 主机是通过发送从机设备地址来选择需要进行通信的从机设备的, SPI 主机不需要发送从机设备地址,直接将相应的从机设备片选信号拉低即可。
- ②、 SCK, Serial Clock,串行时钟,和 I2C 的 SCL 一样,为 SPI 通信提供时钟。
- ③、 MOSI/SDO, Master Out Slave In/Serial Data Output,简称主出从入信号线,这根数据线只能用于主机向从机发送数据,也就是主机输出,从机输入。
- ④、 MISO/SDI, Master In Slave Out/Serial Data Input,简称主入从出信号线,这根数据线只能用户从机向主机发送数据,也就是主机输入,从机输出。
SPI 通信都是由主机发起的,主机需要提供通信的时钟信号。主机通过 SPI 线连接多个从设备。
SPI 有四种工作模式,通过串行时钟极性(CPOL)和相位(CPHA)的搭配来得到四种工作模式:
①、 CPOL=0,串行时钟空闲状态为低电平。
②、 CPOL=1,串行时钟空闲状态为高电平,此时可以通过配置时钟相位(CPHA)来选择具
体的传输协议。
③、 CPHA=0,串行时钟的第一个跳变沿(上升沿或下降沿)采集数据。
④、 CPHA=1,串行时钟的第二个跳变沿(上升沿或下降沿)采集数据。
以 CPOL=0, CPHA=0 这个工作模式为例, SPI 进行全双工通信的时序
SPI 是全双工的,所以读写时序可以一起完成, CS 片选信号先拉低,选中要通信的从设备,然后通过 MOSI 和 MISO 这两根数据线进行收发数据, MOSI 数据线发出了0XD2 这个数据给从设备,同时从设备也通过 MISO 线给主设备返回了 0X66 这个数据。
更多推荐
所有评论(0)