“第020课 SPI裸板”的版本间的差异

来自百问网嵌入式Linux wiki
(创建页面,内容为“<categorytree mode=all style="float:right; clear:right; margin-left:1ex; border:1px solid gray; padding:0.7ex; background-color:white;">ARM裸机加强版</categoryt...”)
 
第1行: 第1行:
<categorytree mode=all style="float:right; clear:right; margin-left:1ex; border:1px solid gray; padding:0.7ex; background-color:white;">ARM裸机加强版</categorytree>
+
=第001节_SPI协议介绍 =
 +
 
 +
*配套视频:ARM裸机1期加强版->第20课_SPI->第001节_SPI协议介绍_P.mp4
 +
*配套代码:023_spi_020->01th_spi_i2c_adc_jz2440_oled_020_002
 +
*配套笔记:
 +
*实验环境:百问网Ubuntu16.04、Window7/Window10
 +
*适用单板:JZ2440(原理适用所有Soc)
 +
 
 +
市面上的开发板很少接有SPI设备,但是SPI协议在工作中经常用到。我们开发了SPI模块,上面有SPI Flash和SPI OLED。OLED就是一块显示器。
 +
 
 +
我们裸板程序会涉及两部分:
 +
#用GPIO模拟SPI
 +
#用S3C2440的SPI控制器
 +
 
 +
我们先介绍下SPI协议,硬件框架如下:
 +
<img src="./lesson/lesson1/lesson1_001.jpg">
 +
SCK:提供时钟
 +
DO:作为数据输出
 +
DI:作为数据输入
 +
CS0/CS1:作为片选
 +
同一时刻只能有一个SPI设备处于工作状态。
 +
 
 +
假设现在2440传输一个0x56数据给SPI Flash,时序如下:
 +
<img src="./lesson/lesson1/lesson1_002.jpg">
 +
首先CS0先拉低选中SPI Flash,0x56的二进制就是0b0101 0110,因此在每个SCK时钟周期,DO输出对应的电平。
 +
SPI Flash会在每个时钟周期的上升沿读取D0上的电平。
 +
 
 +
在SPI协议中,有两个值来确定SPI的模式。
 +
CPOL:表示SPICLK的初始电平,0为电平,1为高电平
 +
CPHA:表示相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿
 +
 
 +
{| class="wikitable"
 +
|-
 +
! CPOL !! CPHA !! 模式 !!                  含义                 
 +
|-
 +
0 ||  0  ||  0  || 初始电平为低电平,在第一个时钟沿采样数据
 +
|-
 +
|  0  ||  1  ||  1  || 初始电平为低电平,在第二个时钟沿采样数据
 +
|-
 +
|  1  ||  0  ||  2  || 初始电平为高电平,在第一个时钟沿采样数据
 +
|-
 +
|  1  ||  1  ||  3  || 初始电平为高电平,在第二个时钟沿采样数据
 +
|}
 +
 
 +
我们常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。
 +
 
 +
极性选什么?格式选什么?通常去参考外接的模块的芯片手册。比如对于OLED,查看它的芯片手册时序部分:
 +
<img src="./lesson/lesson1/lesson1_003.jpg">
 +
SCLK的初始电平我们并不需要关心,只要保证在上升沿采样数据就行。
 +
 
 +
='''《《所有章节目录》》'''=
 +
<categorytree mode=all background*color:white;">ARM裸机加强版</categorytree>
 
[[Category:ARM裸机加强版 ]]
 
[[Category:ARM裸机加强版 ]]

2018年1月17日 (三) 17:26的版本

第001节_SPI协议介绍

  • 配套视频:ARM裸机1期加强版->第20课_SPI->第001节_SPI协议介绍_P.mp4
  • 配套代码:023_spi_020->01th_spi_i2c_adc_jz2440_oled_020_002
  • 配套笔记:
  • 实验环境:百问网Ubuntu16.04、Window7/Window10
  • 适用单板:JZ2440(原理适用所有Soc)

市面上的开发板很少接有SPI设备,但是SPI协议在工作中经常用到。我们开发了SPI模块,上面有SPI Flash和SPI OLED。OLED就是一块显示器。

我们裸板程序会涉及两部分:

  1. 用GPIO模拟SPI
  2. 用S3C2440的SPI控制器

我们先介绍下SPI协议,硬件框架如下: <img src="./lesson/lesson1/lesson1_001.jpg">

SCK:提供时钟
DO:作为数据输出
DI:作为数据输入
CS0/CS1:作为片选

同一时刻只能有一个SPI设备处于工作状态。

假设现在2440传输一个0x56数据给SPI Flash,时序如下: <img src="./lesson/lesson1/lesson1_002.jpg"> 首先CS0先拉低选中SPI Flash,0x56的二进制就是0b0101 0110,因此在每个SCK时钟周期,DO输出对应的电平。 SPI Flash会在每个时钟周期的上升沿读取D0上的电平。

在SPI协议中,有两个值来确定SPI的模式。 CPOL:表示SPICLK的初始电平,0为电平,1为高电平 CPHA:表示相位,即第一个还是第二个时钟沿采样数据,0为第一个时钟沿,1为第二个时钟沿

CPOL CPHA 模式 含义
0 0 0 初始电平为低电平,在第一个时钟沿采样数据
0 1 1 初始电平为低电平,在第二个时钟沿采样数据
1 0 2 初始电平为高电平,在第一个时钟沿采样数据
1 1 3 初始电平为高电平,在第二个时钟沿采样数据

我们常用的是模式0和模式3,因为它们都是在上升沿采样数据,不用去在乎时钟的初始电平是什么,只要在上升沿采集数据就行。

极性选什么?格式选什么?通常去参考外接的模块的芯片手册。比如对于OLED,查看它的芯片手册时序部分: <img src="./lesson/lesson1/lesson1_003.jpg"> SCLK的初始电平我们并不需要关心,只要保证在上升沿采样数据就行。