suncat0504 发表于 2022-5-24 13:39

【APM32E103xE测评】+ 不同相位、极性设置下SPI输出的对比

本帖最后由 suncat0504 于 2022-5-24 18:46 编辑

#申请原创# @21小跑堂
极海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这个外设的输出与设置的对应能正常得到了体现。工程代码:

averyleigh 发表于 2022-9-7 15:52

软件中如何设置SPI的极性和相位

digit0 发表于 2022-9-7 16:11

APM32E103xE最快SPI通信速率能达到多少?

plsbackup 发表于 2022-9-7 18:39

SPI时钟极性、相位设置

cemaj 发表于 2022-9-7 19:19

怎样理解SPI总线时钟的极性

wengh2016 发表于 2022-9-7 20:18

SPI中的极性CPOL和相位CPHA是什么

uiint 发表于 2022-9-7 21:04

这个测评的非常详细了。

kmzuaz 发表于 2022-9-8 10:22

不同相位、极性有什么影响呢

suncat0504 发表于 2022-9-8 11:13

本帖最后由 suncat0504 于 2022-9-8 11:15 编辑

统一回复关于极性和相位的问题,以下资料来自用户手册:
我的理解是:极性和相位的自由组合,是为了适应连接的外部SPI设备。根据外部设备的SPI通讯要求而正确设置极性和相位,保证正常的通信和数据的正确收发
程序中设置极性和相位的代码:    // 数据位长    spiConfig.length = SPI_DATA_LENGTH_8B;    // 设置波特率    spiConfig.baudrateDiv = SPI_BAUDRATE_DIV_32;    /**工作方式*/    spiConfig.direction = SPI_DIRECTION_1LINE_TX;    // 单工模式,主机只发、从机只收    /**设置数据高低位那个先发*/    spiConfig.firstBit = SPI_FIRSTBIT_LSB; // 先发低位    /**主机模式*/    spiConfig.mode = SPI_MODE_MASTER;    /**极性为CPOL=1 ,SCK 信号线在空闲状态为高电平*/    spiConfig.polarity = SPI_CLKPOL_HIGH;    /**时钟的相位CPHA=0:设置奇数脉冲沿有效*/    spiConfig.phase = SPI_CLKPHA_1EDGE;    /**NSS设为硬件模式*/    spiConfig.nss = SPI_NSS_HARD;

zerorobert 发表于 2022-9-8 12:39

SPI信号有何不同

Stahan 发表于 2022-10-4 20:27

SPI中的极性CPOL和相位CPHA是什么

adolphcocker 发表于 2022-10-9 20:32

这个非常给力,谢谢分享的。      
页: [1]
查看完整版本: 【APM32E103xE测评】+ 不同相位、极性设置下SPI输出的对比