SPI调试&&SPI基础知识&&SPI实际波形&&实际Demo

一、问题出现场景:

 原理可以参考链接:SPI协议详解(图文并茂+超详细) - 知乎 (zhihu.com)

1.SPI的引脚变动

二、程序内部移植注意

移植已有项目的SPI程序架构

以上引脚变动需要注意的点:

1.引脚使用的变动,比如从PA3变为PB4

2.SPI编号的变动,有的MCU可能会有三组SPI【SPI1 SPI2 SPI3】

3.SPI的时钟源是否变化,这个决定SPI 的时钟频率,正常频率设置应该为 总线/2

【原来SPI1 SPI_PSC_8】

    /* SPI2 parameter config */
    spi_init_struct.trans_mode           = SPI_TRANSMODE_FULLDUPLEX;
    spi_init_struct.device_mode          = SPI_MASTER;
    spi_init_struct.frame_size           = SPI_FRAMESIZE_8BIT;
    spi_init_struct.clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE;
    spi_init_struct.nss                  = SPI_NSS_SOFT;
    spi_init_struct.prescale             = SPI_PSC_16 ;
    spi_init_struct.endian               = SPI_ENDIAN_MSB;
    spi_init(SPI2, &spi_init_struct);

4.引脚变动时需要查看芯片手册,确认变动的引脚是否是特殊引脚

PA15为特殊引脚需要做重映射

void gpio_config(void) 
{ /* GPIO output */ 
  gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE); 
  gpio_pin_remap_config(GPIO_SPI2_REMAP, ENABLE); 
}

三、波形分析问题点

波形分析思路

1.CS引脚是否可以顺利的拉高拉低

2.主机发送数据时波形是否正确

3.从机发送数据时波形是否正确

  • 连接SPI的引脚到示波器对应的通道
  • 使用示波器抓捕波形
  • 进入程序进行DEG

实际波形可以参考下图:

参考链接:SPI协议详解(图文并茂+超详细) - 知乎 (zhihu.com)

【SPI有四种模式,由极性和相序决定】


四、出现该问题的反思

1.对于芯片底层配置不熟悉

主要时芯片手册的了解和引脚配置的知识存在盲区

很多引脚配置最好参考原厂配置,【这里上传了GD的资料】

2.对于SPI出现问题解决思路不清晰

检查引脚配置

检查时钟源

检查波形

3.对于时钟的概念和意义未深刻理解

【待补充,这里就总结一下SPI调试过程中的收获】

### 硬件 SPI 通信中的波形占空比解释 在硬件 SPI (Serial Peripheral Interface) 通信中,时钟信号(SCK)的占空比对于正确传输数据至关重要。通常情况下,SPI 的时钟可以配置为不同的占空比,但最常见的是50%的占空比。 #### 占空比定义 占空比是指在一个完整的时钟周期内高电平所占的时间比例。如果一个时钟周期内的高电平时间等于低电平时间,则该时钟具有50%的占空比[^1]。 #### 数据传输与时钟边沿的关系 SPI 接口的数据传输依赖于 SCK 时钟信号的上升沿和下降沿来同步 MOSI 和 MISO 上的数据位。具体来说,在某些模式下,数据会在时钟的上升沿被采样并写入;而在其他模式下则是在下降沿完成这些操作。例如,在给定的例子中提到的数据 `1 0 0 1 0 0 0 0` 转换成十六进制表示形式即为 `0x90`,这组数据就是在 CLK 的上升沿被捕获到的。 #### 不同占空比的影响 虽然标准做法是采用接近50%的占空比以确保足够的建立时间和保持时间用于稳定的数据捕获,但在实际应用中也可以调整这个比率以便适应特定需求或优化性能: - **小于50%**:此时高电平持续时间较短,可能会影响一些设备对信号变化速度的要求; - **大于50%**:意味着更多的高电平时段,可能会减少接收端处理新输入所需的时间窗口。 为了保证可靠性和兼容性,建议遵循目标器件手册推荐的最佳实践设置相应的参数值。 ```python # Python伪代码展示如何计算占空比 def calculate_duty_cycle(high_time, low_time): total_period = high_time + low_time duty_cycle_percentage = (high_time / total_period) * 100 return duty_cycle_percentage ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值