背景:

使用STM32H743主控,通过SPI读取74HC165的数据,74HC165接了7个按键。

现象:

在所有按键都没按下的时候读取到的数据应该为0x00,按下某个按键对应的bit应该变成1。实际测试发现不按任何按键的时候数据是0x01,按第一个按键的时候读取到0x03,依次类推。按键对应的bit错了一位。

原因:

SPI的初始化代码如下:

void MX_SPI5_Init(void)
{hspi5.Instance = SPI5;hspi5.Init.Mode = SPI_MODE_MASTER;hspi5.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;hspi5.Init.DataSize = SPI_DATASIZE_8BIT;hspi5.Init.CLKPolarity = SPI_POLARITY_HIGH;hspi5.Init.CLKPhase = SPI_PHASE_2EDGE;hspi5.Init.NSS = SPI_NSS_SOFT;hspi5.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB;hspi5.Init.TIMode = SPI_TIMODE_DISABLE;hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;hspi5.Init.CRCPolynomial = 0x0;hspi5.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;hspi5.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;hspi5.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;hspi5.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;hspi5.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;hspi5.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;hspi5.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;hspi5.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;hspi5.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;hspi5.Init.IOSwap = SPI_IO_SWAP_DISABLE;if (HAL_SPI_Init(&hspi5) != HAL_OK){Error_Handler();}}void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if(spiHandle->Instance==SPI2){/* USER CODE BEGIN SPI2_MspInit 0 *//* USER CODE END SPI2_MspInit 0 *//* SPI2 clock enable */__HAL_RCC_SPI2_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/**SPI2 GPIO ConfigurationPB10     ------> SPI2_SCKPB15     ------> SPI2_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_15;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/* USER CODE BEGIN SPI2_MspInit 1 *//* USER CODE END SPI2_MspInit 1 */}else if(spiHandle->Instance==SPI3){/* USER CODE BEGIN SPI3_MspInit 0 *//* USER CODE END SPI3_MspInit 0 *//* SPI3 clock enable */__HAL_RCC_SPI3_CLK_ENABLE();__HAL_RCC_GPIOC_CLK_ENABLE();/**SPI3 GPIO ConfigurationPC10     ------> SPI3_SCKPC11     ------> SPI3_MISOPC12     ------> SPI3_MOSI*/GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;GPIO_InitStruct.Alternate = GPIO_AF6_SPI3;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/* USER CODE BEGIN SPI3_MspInit 1 *//* USER CODE END SPI3_MspInit 1 */}else if(spiHandle->Instance==SPI5){/* USER CODE BEGIN SPI5_MspInit 0 *//* USER CODE END SPI5_MspInit 0 *//* SPI5 clock enable */__HAL_RCC_SPI5_CLK_ENABLE();__HAL_RCC_GPIOF_CLK_ENABLE();/**SPI5 GPIO ConfigurationPF7     ------> SPI5_SCKPF8     ------> SPI5_MISO*/GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_PULLDOWN;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;GPIO_InitStruct.Alternate = GPIO_AF5_SPI5;HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);/* USER CODE BEGIN SPI5_MspInit 1 *//*Configure GPIO pins : PCPin PCPin */GPIO_InitStruct.Pin = _165_PL_Pin;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);/* USER CODE END SPI5_MspInit 1 */}
}

由hspi5.Init.CLKPolarity = SPI_POLARITY_HIGH;可知总线时钟在空闲状态应该处于高电平的,但是在初始化时钟的GPIO的时候用的下拉,导致中线空闲的时候无法处于低电平。所以当SPI去读取数据的时候,时钟上多了一个上升沿,导致采集的第一个数据不对,并且数据都向后移了一位。

SPI配置的时候需要注意:GPIO可以不用上下拉的,如果要上下拉,也需要与CLKPolarity一致。

关于使用SPI总线读取并转串(74HC165)发生数据移位的问题相关推荐

  1. SPI总线的原理与Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...

  2. 【程序】STM32使用SPI接口读取93C46存储器上的数据(非软件模拟SPI时序)

    /* 93C46选默认的16位模式,但SPI总线上每次发送/接收8位数据 */ #include <stm32f10x.h>#define _BV(n) (1 << (n))u ...

  3. 【STM32H7教程】第94章 STM32H7的SPI总线应用之双机通信(DMA方式)

    完整教程下载地址:链接 第94章       STM32H7的SPI总线应用之双机通信(DMA方式) 本章节为大家讲解SPI DMA方式双机通信. 目录 94.1 初学者重要提示 94.2 SPI D ...

  4. linux内核SPI总线驱动分析(一)

    下面有两个大的模块: 一个是SPI总线驱动的分析            (研究了具体实现的过程) 另一个是SPI总线驱动的编写(不用研究具体的实现过程) SPI总线驱动分析   1 SPI概述     ...

  5. I2C总线和SPI总线的异同点

    文章目录 1.内部总线.系统总线.外部总线的概念 2.总线通信的基本概念 3.I2C和SPI的经典物理层结构 4.I2C总线与SPI总线的区别 5.I2C总线和SPI总线的共同点 1.内部总线.系统总 ...

  6. SPI总线-串行协议解码

    目录 SPI总线-串行协议解码 接线 发信号 SPI总线-串行协议解码 SPI(串行外围接口)总线最初是由摩托罗拉开发的,用于其微控制器.由于总线的简单性,其他制造商采用了它,并且它已广泛用于嵌入式系 ...

  7. 树莓派 SPI,I2C,UART串行总线介绍

    很多人对总线,串行等概念不熟悉特别是SPI,I2C,UART,GPIO等概念. 因此我收集了一些资料,用于总结.希望对大家有所帮助. 首先看一下树莓派上的接口: GPIO引脚 x 26 UART总线 ...

  8. I2C与SPI总线对比

    最近2周一直在调试IIC和SPI总线设备,这里记录一下2种总线,以备后忘. 一 IIC总线 I2C--INTER-IC串行总线的缩写,是PHILIPS公司推出的芯片间串行传输总线.它以1根串行数据线( ...

  9. spi总线 上层调用_spi总线设备驱动分析

    今天折腾了一天的SPI设备的驱动加载,甚至动用了逻辑分析仪来查看spi总线的波形,主要包括两个SPI设备,at45db321d和mcp2515,一个是串行的dataflash,一个是can总线设备芯片 ...

最新文章

  1. 摄像头ISP系统原理(下)
  2. 如何用 Python 和 Flask 建立部署一个 Facebook Messenger 机器人
  3. 再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
  4. python3连接mysql数据库_python3.4连接mysql数据库
  5. ORACLE8的分区管理
  6. amd为什么还用针脚_为什么intel处理器不用针脚,AMD还一直使用针脚呢?
  7. Vue项目启动webpack报错Module build failed: Error: No PostCSS Config found in......
  8. eclipse中文乱码解决_解决git status显示中文文件名乱码问题
  9. 深入理解JavaScript之Event Loop
  10. HEVC/H265 主要设计者谈HEVC/H265
  11. [转]在Windows server 2012上部署DPM 2012 SP1 RTM之安装配置
  12. django进阶02websocket
  13. popen和pclose
  14. 河南初中信息技术测试软件,中学信息技术考试练习系统——河南省版
  15. 干货丨爱奇艺CDN IPv6系统配置
  16. mysql认证 成都考点_CKA概述、考试形式、考试地址、考纲占比等
  17. it人才外包公司招人真的很难吗?
  18. HashMap底层原理(当你put,get时内部会发生什么呢?)
  19. 项目人生:成长与感悟
  20. 字符串变量string

热门文章

  1. 生成二维码。且可调颜色
  2. android 定时发送短信实现
  3. 《safe-area-inset-bottom之兼容问题》
  4. 夜神模拟器和mitmproxy抓包
  5. 【一起学习输入法】华宇拼音输入法开源版本解析(3)
  6. 今天遇到的栈溢出问题
  7. vmware漏洞之三——Vmware虚拟机逃逸漏洞(CVE-2017-4901)Exploit代码分析与利用
  8. SuperMap GIS 倾斜摄影数据处理 QA
  9. DOS命令:call
  10. R语言-如何比较两个回归方程中系数的显著差异?