打印
[APM32E1]

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

[复制链接]
1516|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 aCPHA=0 时,MOSI MISO 数据线上的信号将会在 SCK 时钟线的“奇数边沿”被采样。
l bCPHA=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=0CPOL=0 ,数据低位先发,奇数边沿采样,SCK平时为低
1、在SCK上升沿采集到的数据是01010011,是0xCA的低位开始发送的顺序
2、发送时间外,SCK=0
模式1:测试CPHA=0CPOL=1 ,数据低位先发,奇数边沿采样,SCK平时为高
1、在SCK上升沿采集到的数据是01010011,是0xCA的低位开始发送的顺序
2、发送时间外,SCK=1
模式2:测试CPHA=1CPOL=0 ,数据低位先发,偶数边沿采样,SCK平时为低
1、在SCK下降沿采集到的数据是01010011,是0xCA的低位开始发送的顺序
2、发送时间外,SCK=0
模式3:测试CPHA=1CPOL=1 ,数据低位先发,偶数边沿采样,SCK平时为高
1、在SCK下降沿采集到的数据是01010011,是0xCA的低位开始发送的顺序
2、发送时间外,SCK=1
上面的测试结果中,模式2和模式3中脉冲延下降沿对应的SDA数据输出不是那么漂亮,粗看起来容易产生错误的理解,不排除我的示波器存在一定误差的可能,导致出现这个结果。上升沿采集数据的图形就很明显,很容易看出时序。
下面是低高位先后发的测试对比图(黄色为SCK,粉色为SDA):
模式0:测试CPHA=0CPOL=0 ,数据低位先发,奇数边沿采样,SCK平时为低
1、在SCK上升沿采集到的数据是01010011,是0xCA的低位开始发送的顺序
2、发送时间外,SCK=0
模式0:测试CPHA=0CPOL=0 ,数据高位先发,奇数边沿采样,SCK平时为低
1、在SCK上升沿采集到的数据是11001010,是0xCA的高位开始发送的顺序
2、发送时间外,SCK=0
低高位发送顺序的设置,也很容易得到了体现。
总体说来,SPI1这个外设的输出与设置的对应能正常得到了体现。
工程代码: SPI测试相位极性.zip (64.66 KB)

使用特权

评论回复
沙发
averyleigh| | 2022-9-7 15:52 | 只看该作者
软件中如何设置SPI的极性和相位  

使用特权

评论回复
评论
suncat0504 2022-9-8 11:05 回复TA
设置CPHA和CPOL啊 /** 极性为CPOL=1 ,SCK 信号线在空闲状态为高电平 */ spiConfig.polarity = SPI_CLKPOL_HIGH; /** 时钟的相位CPHA=0:设置奇数脉冲沿有效 */ spiConfig.phase = SPI_CLKPHA_1EDGE; 
板凳
digit0| | 2022-9-7 16:11 | 只看该作者
APM32E103xE最快SPI通信速率能达到多少?

使用特权

评论回复
评论
suncat0504 2022-9-8 11:07 回复TA
主从模式的快速通信,最高可达 18MHz 
地板
plsbackup| | 2022-9-7 18:39 | 只看该作者
SPI时钟极性、相位设置

使用特权

评论回复
评论
suncat0504 2022-9-8 11:08 回复TA
/** 极性为CPOL=1 ,SCK 信号线在空闲状态为高电平 */ spiConfig.polarity = SPI_CLKPOL_HIGH; /** 时钟的相位CPHA=0:设置奇数脉冲沿有效 */ spiConfig.phase = SPI_CLKPHA_1EDGE; 
5
cemaj| | 2022-9-7 19:19 | 只看该作者
怎样理解SPI总线时钟的极性  

使用特权

评论回复
6
wengh2016| | 2022-9-7 20:18 | 只看该作者
SPI中的极性CPOL和相位CPHA是什么

使用特权

评论回复
7
uiint| | 2022-9-7 21:04 | 只看该作者
这个测评的非常详细了。

使用特权

评论回复
8
kmzuaz| | 2022-9-8 10:22 | 只看该作者
不同相位、极性有什么影响呢

使用特权

评论回复
9
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;


使用特权

评论回复
10
zerorobert| | 2022-9-8 12:39 | 只看该作者
SPI信号有何不同  

使用特权

评论回复
11
Stahan| | 2022-10-4 20:27 | 只看该作者
SPI中的极性CPOL和相位CPHA是什么

使用特权

评论回复
12
adolphcocker| | 2022-10-9 20:32 | 只看该作者
这个非常给力,谢谢分享的。      

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

130

主题

3944

帖子

5

粉丝