STM32F030软件SPI控制74HC165

仅仅作为一个调试记录,供硬件设计使用。

环境

硬件:NUCLEO-F030R8。某宝购买的74HC165模组,接了 8 8 8 路按键。
开发环境:Win10+IAR EWARM 8.22.1

原理图

只是一个示意性的原理图,我自己不想画了,虽然图片的IO脚和主芯片不同。
在这里插入图片描述
在这里插入图片描述
我用的芯片型号为STM32F030R8。对应的实际IO接线如下:

    165侧    芯片侧
1  PL      -> PA4  SPI1_NSS
2  CP  CLK -> PB3  SPI1_SCK
9  QH  DS  -> PA6  SPI1_MISO
15 CE      -> GND

STM32CubmeMX 配置

本次使用软件模拟时序实现。

GPIO 配置

在这里插入图片描述

代码

利用 Cube 生成代码后,添加一下代码。

/*
1 PL ->      PA4  SPI1_NSS
2 CP  CLK -> PB3  SPI1_SCK
9 QH  DS  -> PA6  SPI1_MISO
*/
uint8_t HC165ReadData(void)
{
  uint8_t dat=0;
  
  HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOA, PL_Pin, GPIO_PIN_RESET);
  HAL_Delay(1);
  HAL_GPIO_WritePin(GPIOA, PL_Pin, GPIO_PIN_SET);

  for(uint8_t i=0;i<8;i++)
  {
    dat=dat<<1;
    if (HAL_GPIO_ReadPin(GPIOA, DS_Pin)==1)
      dat=dat+1;
    
    HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_SET);
  }
  HAL_GPIO_WritePin(CLK_GPIO_Port, CLK_Pin, GPIO_PIN_RESET);
  return ~dat;
}

我在主循环中不断读取按键信息。主循环代码如下:

  while (1)
  {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5);
    //HAL_SPI_Receive(&hspi1, &cmd, 1, 1000);
    key1=HC165ReadData();
    if (key1!=0x00 && key1!=key2) {
      //有按键
      sprintf(RxBuffer, "Key is %d\n", key1);
      printf(RxBuffer);
      key2=key1;
    }
    HAL_Delay(500);
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

其中变量 key1 和 key2 用来保存按键数据。下面是运行串口输出。
在这里插入图片描述
注意:以上只是测试代码。工程中绝对不会这样书写。

系统完整照片

用的是杜邦线连接,有点丑。测试系统将就用一下。
在这里插入图片描述

您好!要使用STM32F407控制74HC595芯片的SPI通信,您需要按照以下步骤进行操作: 1. 配置SPI接口:首先,使用CubeMX或手动配置SPI接口的引脚和时钟。确保将STM32F407的SPI引脚连接到74HC595芯片的相应引脚。 2. 初始化SPI:在代码中初始化SPI接口,并设置SPI的工作模式、数据大小、时钟极性和相位等参数。 3. 发送数据:使用SPI的发送函数将数据发送给74HC595芯片。您可以一次发送8位数据(一个字节),或者将多个字节组合成一个数据包发送。 4. 控制74HC595芯片:发送数据时,先发送控制字节(例如写入寄存器地址),然后发送实际的数据字节。 5. 关闭SPI:在完成SPI通信后,记得关闭SPI接口。 以下是一个示例代码片段,演示如何使用STM32F407的SPI控制74HC595芯片: ```c #include "stm32f4xx.h" SPI_HandleTypeDef hspi; void SPI_Init(void) { hspi.Instance = SPI1; hspi.Init.Mode = SPI_MODE_MASTER; hspi.Init.Direction = SPI_DIRECTION_2LINES; hspi.Init.DataSize = SPI_DATASIZE_8BIT; hspi.Init.CLKPolarity = SPI_POLARITY_LOW; hspi.Init.CLKPhase = SPI_PHASE_1EDGE; hspi.Init.NSS = SPI_NSS_SOFT; hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi.Init.TIMode = SPI_TIMODE_DISABLE; hspi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi.Init.CRCPolynomial = 7; if (HAL_SPI_Init(&hspi) != HAL_OK) { // 初始化失败处理 while (1); } } void SPI_SendData(uint8_t data) { HAL_SPI_Transmit(&hspi, &data, 1, HAL_MAX_DELAY); } void Control_74HC595(uint8_t controlByte, uint8_t dataByte) { // 发送控制字节 SPI_SendData(controlByte); // 发送数据字节 SPI_SendData(dataByte); } int main(void) { // 初始化SPI HAL_Init(); SPI_Init(); // 控制74HC595芯片 Control_74HC595(0x00, 0xFF); // 写入寄存器地址0x00,数据为0xFF while (1) { // 主程序循环 } } ``` 请根据您的具体需求对代码进行适当修改,并确保正确连接电路。希望以上信息对您有帮助!如有任何疑问,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值