本帖最后由 suncat0504 于 2022-5-24 18:46 编辑
#申请原创#
极海APM32E103ZE处理器拥有SPI设备,其中的SPI1设备使用 SPI MOSI (PA7) 、SPI MISO (PA6)、SPI SCK (PA5)这三个信号。今天我就以这个设备作为测试目标,看看在设置时钟信号为不同相位和极性时,设备输出的SPI信号有何不同。根据资料,时钟极性和时钟相位是 由SPI_CTRL1 寄存器的 CPOL 和 CPHA 位设置。 1、时钟极性 CPOL 是指 SPI 处于空闲状态时,SCK 信号线的电平信号。 l CPOL=0 时,SCK 信号线在空闲状态为低电平 l CPOL=1 时,SCK 信号线在空闲状态为高电平 2、时钟相位 CPHA 是指数据的采样时刻 l a、CPHA=0 时,MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿”被采样。 l b、CPHA=1 时,MOSI 或 MISO 数据线上的信号将会在 SCK 时钟线的“偶数边沿”被采样。 这样,根据时钟相位 CPHA 和时钟极性 CPOL 的不同状态,可以将 SPI 分成四种模式。 SPI的数据帧格式中: 1、通过配置 SPI_CTRL1 寄存器中的 LSBSEL 位,设定是 MSB 在先还是 LSB 在先。 2、通过配置 SPI_CTRL1 寄存器的 DFLSEL 位,选择是 8/16 位数据帧格式进行发送/接收。 测试程序中,以单工、主机只发、从机只收模式运行,并在测试过程中通过示波器取得实时信号。
在主程序中,为了方便捕捉SPI信号,在循环中以一定间隔周期通过SPI发送特征0xCA数据。 以下是不同时钟相位、时钟极性设置的组合产生的测试对比图(黄色为SCK,粉色为SDA):
| 模式0:测试CPHA=0,CPOL=0 ,数据低位先发,奇数边沿采样,SCK平时为低 1、在SCK上升沿采集到的数据是01010011,是0xCA的低位开始发送的顺序 2、发送时间外,SCK=0 |
| 模式1:测试CPHA=0,CPOL=1 ,数据低位先发,奇数边沿采样,SCK平时为高 1、在SCK上升沿采集到的数据是01010011,是0xCA的低位开始发送的顺序 2、发送时间外,SCK=1 |
| 模式2:测试CPHA=1,CPOL=0 ,数据低位先发,偶数边沿采样,SCK平时为低 1、在SCK下降沿采集到的数据是01010011,是0xCA的低位开始发送的顺序 2、发送时间外,SCK=0 |
| 模式3:测试CPHA=1,CPOL=1 ,数据低位先发,偶数边沿采样,SCK平时为高 1、在SCK下降沿采集到的数据是01010011,是0xCA的低位开始发送的顺序 2、发送时间外,SCK=1 |
上面的测试结果中,模式2和模式3中脉冲延下降沿对应的SDA数据输出不是那么漂亮,粗看起来容易产生错误的理解,不排除我的示波器存在一定误差的可能,导致出现这个结果。上升沿采集数据的图形就很明显,很容易看出时序。 下面是低高位先后发的测试对比图(黄色为SCK,粉色为SDA): | 模式0:测试CPHA=0,CPOL=0 ,数据低位先发,奇数边沿采样,SCK平时为低 1、在SCK上升沿采集到的数据是01010011,是0xCA的低位开始发送的顺序 2、发送时间外,SCK=0 |
| 模式0:测试CPHA=0,CPOL=0 ,数据高位先发,奇数边沿采样,SCK平时为低 1、在SCK上升沿采集到的数据是11001010,是0xCA的高位开始发送的顺序 2、发送时间外,SCK=0 |
低高位发送顺序的设置,也很容易得到了体现。 总体说来,SPI1这个外设的输出与设置的对应能正常得到了体现。
|