STM32硬件SPI驱动OLED中CS过早跳变问题记录

前提:STM32f103RC (72M),oled接SPI1,MOSI一次传8bit数据

正确波形

软件SPI下,波形很好,CLK8个时钟,MOSI发送完数据,CS再置高
软件SPI

CS过早跳变波形

Q:初期测试时屏幕总点不亮,逻辑分析仪中CS左侧方波是进入SPI写的标志(自定义),但CS在LOW的时间太短,DATA明明没发送完CS就置HIGH

A:个人认为是SPI速度慢,GPIO速度过快导致的?将SPI1 改为2分频,GPIO速度维持2Mhz有后面的修正波形。实测GPIO 50Mhz配2分频SPI1也是可行的,只是SPI1频率不能再低。

128分频下SPI

修正后波形

注:由于逻辑分析仪带宽限制,部分波形不完整,但不妨碍观察此时CS是等MOSI传完8位数据后再置高
修正后

小结

神奇的bug,不知道我分析的对不对,反正能跑就行XD
以及,被吃灰3年的逻辑细分析仪救了一命,感谢当年毕业季淘旧物时强塞给我的学长

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种基于ARM Cortex-M处理器的微控制器系列,拥有丰富的硬件资源和强大的性能。硬件SPI(串行外围接口)是STM32微控制器上常用的外设之一,用于与其他设备进行快速和可靠的通信。 CS1237是一种数字式温度传感器,它可以通过SPI接口与STM32微控制器进行通信和控制。下面是一个简单的硬件SPI驱动CS1237的代码示例: 1. 配置SPI外设: ```c SPI_HandleTypeDef hspi; hspi.Instance = SPIx; // 设置SPIx(x为SPI号,如SPI1) hspi.Init.Mode = SPI_MODE_MASTER; // 设置为主模式 hspi.Init.Direction = SPI_DIRECTION_2LINES; // 设置为双线模式 hspi.Init.DataSize = SPI_DATASIZE_16BIT; // 数据大小为16位 hspi.Init.CLKPolarity = SPI_POLARITY_LOW; // 时钟极性为低电平时有效 hspi.Init.CLKPhase = SPI_PHASE_1EDGE; // 第一边沿采样 hspi.Init.NSS = SPI_NSS_SOFT; // 使用软件片选信号 hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; // 波特率预分频为4 hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB优先模式 hspi.Init.TIMode = SPI_TIMODE_DISABLE; // 禁用TI模式 hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 禁用CRC校验 hspi.Init.CRCPolynomial = 10; // CRC多项式设置为10 HAL_SPI_Init(&hspi); // 初始化SPI外设 ``` 2. 启动SPI外设: ```c HAL_SPI_MspInit(&hspi); // 初始化SPI外设的GPIO引脚 __HAL_SPI_ENABLE(&hspi); // 使能SPI外设 ``` 3. 传输数据: ```c uint16_t txData = 0x1234; // 发送的数据 uint16_t rxData = 0; // 接收的数据 __HAL_SPI_ENABLE(&hspi); // 使能SPI外设 // 发送并接收数据 HAL_SPI_TransmitReceive(&hspi, (uint8_t*)&txData, (uint8_t*)&rxData, 1, HAL_MAX_DELAY); __HAL_SPI_DISABLE(&hspi); // 禁用SPI外设 ``` 4. 停止SPI外设: ```c HAL_SPI_MspDeInit(&hspi); // 反初始化SPI外设的GPIO引脚 __HAL_SPI_DISABLE(&hspi); // 禁用SPI外设 ``` 通过以上代码示例,我们可以利用STM32硬件SPI驱动CS1237传感器,实现与其进行数据通信和控制。当然,具体的寄存器配置和传输协议根据CS1237的数据手册和要求进行相应的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值