SPI协议详解( 二 )
3.2 Timing
文章插图
上图通过 Master 设备与 Slave 设备之间交换1 Byte 数据来说明 SPI 协议的工作机制.
首先, 在这里解释一下相位和极性的概念
3.2.1 SPI相关的缩写或说法
SPI的极性Polarity和相位Phase , 最常见的写法是CPOL和CPHA , 不过也有一些其他写法 , 简单总结如下:
CKPOL (Clock Polarity) = CPOL = POL = Polarity = (时钟)极性
CKPHA (Clock Phase) = CPHA = PHA = Phase = (时钟)相位
SCK=SCLK=SPI的时钟
Edge=边沿 , 即时钟电平变化的时刻 , 即上升沿(rising edge)或者下降沿(falling edge)
对于一个时钟周期内 , 有两个edge , 分别称为:
Leading edge=前一个边沿=第一个边沿 , 对于开始电压是1 , 那么就是1变成0的时候 , 对于开始电压是0 , 那么就是0变成1的时候;
Trailing edge=后一个边沿=第二个边沿 , 对于开始电压是1 , 那么就是0变成1的时候(即在第一次1变成0之后 , 才可能有后面的0变成1) , 对于开始电压是0 , 那么就是1变成0的时候;
3.2.2 SPI的相位和极性
CPOL和CPHA , 分别都可以是0或时1 , 对应的四种组合就是:
Mode 0 CPOL=0, CPHA=0
Mode 1 CPOL=0, CPHA=1
Mode 2 CPOL=1, CPHA=0
Mode 3 CPOL=1, CPHA=1
文章插图
3.2.3 CPOL极性
先说什么是SCLK时钟的空闲时刻 , 其就是当SCLK在数发送8个bit比特数据之前和之后的状态 , 于此对应的 , SCLK在发送数据的时候 , 就是正常的工作的时候 , 有效active的时刻了 。
先说英文 , 其精简解释为:Clock Polarity = IDLE state of SCK 。
再用中文详解:
SPI的CPOL , 表示当SCLK空闲idle的时候 , 其电平的值是低电平0还是高电平1:
CPOL=0 , 时钟空闲idle时候的电平是低电平 , 所以当SCLK有效的时候 , 就是高电平 , 就是所谓的active-high;
CPOL=1 , 时钟空闲idle时候的电平是高电平 , 所以当SCLK有效的时候 , 就是低电平 , 就是所谓的active-low;
3.2.4 CPHA相位
首先说明一点 , capture strobe = latch = read = sample , 都是表示数据采样 , 数据有效的时刻 。 相位 , 对应着数据采样是在第几个边沿(edge) , 是第一个边沿还是第二个边沿 , 0对应着第一个边沿 , 1对应着第二个边沿 。
对于:
CPHA=0 , 表示第一个边沿:
对于CPOL=0 , idle时候的是低电平 , 第一个边沿就是从低变到高 , 所以是上升沿;
对于CPOL=1 , idle时候的是高电平 , 第一个边沿就是从高变到低 , 所以是下降沿;
CPHA=1 , 表示第二个边沿:
对于CPOL=0 , idle时候的是低电平 , 第二个边沿就是从高变到低 , 所以是下降沿;
对于CPOL=1 , idle时候的是高电平 , 第一个边沿就是从低变到高 , 所以是上升沿;
还是上图大家更容易看懂
文章插图
3.2.5 软件中如何设置SPI的极性和相位
SPI分主设备和从设备 , 两者通过SPI协议通讯 。
而设置SPI的模式 , 是从设备的模式 , 决定了主设备的模式 。
所以要先去搞懂从设备的SPI是何种模式 , 然后再将主设备的SPI的模式 , 设置和从设备相同的模式 , 即可正常通讯 。
对于从设备的SPI是什么模式 , 有两种:
3.2.5.1固定的 , 有SPI从设备硬件决定的
SPI从设备 , 具体是什么模式 , 相关的datasheet中会有描述 , 需要自己去datasheet中找到相关的描述 , 即:
关于SPI从设备 , 在空闲的时候 , 是高电平还是低电平 , 即决定了CPOL是0还是1;
然后再找到关于设备是在上升沿还是下降沿去采样数据 , 这样就是 , 在定了CPOL的值的前提下 , 对应着可以推算出CPHA是0还是1了 。
3.2.5.2 可配置的 , 由软件自己设定
从设备也是一个SPI控制器 , 4种模式都支持 , 此时只要自己设置为某种模式即可 。
然后知道了从设备的模式后 , 再去将SPI主设备的模式 , 设置为和从设备模式一样 , 即可 。
对于如何配置SPI的CPOL和CPHA的话 , 不多细说 , 多数都是直接去写对应的SPI控制器中对应寄存器中的CPOL和CPHA那两位 , 写0或写1即可 。
3.3 SSPSR
文章插图
SSPSR 是 SPI 设备内部的移位寄存器(Shift Register). 它的主要作用是根据 SPI 时钟信号状态, 往 SSPBUF 里移入或者移出数据, 每次移动的数据大小由 Bus-Width 以及 Channel-Width 所决定 。
- 协议|喜讯丨热烈祝贺众科联与顺笑拍、喜到家签订合作协议
- 中国|中国软件国际与深圳市政府达成战略合作协议 助力打造“创新之都“
- 美通社|Semiconlight与华灿光电签署倒装芯片专利授权协议 | 倒装
- 芯片|韩国Semiconlight与华灿光电签署倒装芯片专利授权协议
- 编程猫领衔,9家编程app测评一览详解
- 详解m3u8协议
- “5G+智慧文旅”来啦!青岛市文化和旅游局与青岛移动签署“5G+智慧文旅”战略合作协议
- Django实战016:django中使用redis详解
- 简单介绍Protobuf协议
- redis 数据类型详解 以及 redis适用场景场合
