利用STM32F030软件SPI和硬件SPI控制74HC595

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

环境

硬件:NUCLEO-F030R8。某宝购买的74HC595模组,包括8路继电器。
开发环境:Win10+IAR EWARM 8.22.1

原理图

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

              595侧                                 芯片侧
11  SCK   数据输入时钟线           SHCP     Clock    SPI2_SCK         PB13
12  RCK   输出存储锁存时钟线       STCP     Latch    SPI2_NSS         PB12
13  OE    输出使能     接地        OE                GND
14   SI   数据线                  DS1      DATA     SPI2_MOSI        PB15

STM32CubmeMX 配置

时钟配置

由于板子没有焊接晶振。配置方法如下:
在这里插入图片描述
配置 RCC 只是为了调试测试主频是否正确。时钟配置如下图:
在这里插入图片描述

硬件SPI配置

STM32F030有两路硬件SPI,都可以使用。这里我配置了SPI2。详细配置如下图:
在这里插入图片描述
注意:由于 595 只收不发,MISO 引脚是没有使用的。SPI 的模式可以配置为 Transmit Only Master,这样可以节约一个 IO。

代码

使用硬件 SPI 控制 74HC595 非常简单,上述配置完成后,只需要点击生成代码即可。然后在 main() 函数中添加 SPI 发送指令即可。如下:

  /* USER CODE BEGIN 1 */
  uint8_t cmd=0xAA;

  /* USER CODE END 1 */
  ...
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  HAL_SPI_Transmit(&hspi2, &cmd, 1, 1000);

也就是向 74HC595 发送数据 0xAA,595 后级接继电器,就可以看到对应继电器的动作。

小结

个人以为,有硬件 SPI 支持,可以充分发挥硬件的强大作用。

软件SPI配置

软件 SPI 配置如下图:
在这里插入图片描述

代码

我们需要自己实现 595 发送代码。对应的代码如下:

/*
软件SPI调试正常
SHCP -> PB13
STCP -> PB12
DS1  -> PB15
//Configure GPIO pins : PB12 PB13 PB14 PB15
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
*/
void HC595SendData(uint8_t SendVal)  
{  
  uint8_t i;  
  for (i=0; i<8; i++) {  
    /*--step1、串行输入引脚,所谓串行就是使数据在一根信号线上按顺序一位一位地传输*/  
    if (((SendVal << i) & 0x01) != 0 )   
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_SET);
    else   
      HAL_GPIO_WritePin(GPIOB, GPIO_PIN_15, GPIO_PIN_RESET);

    /*--step2、SHCP发生一次上升沿的时候,74HC595才会从DS引脚上取得当前的数据*/  
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_RESET);
    HAL_Delay(100);
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_13, GPIO_PIN_SET);
  }  

  /*--step3、当移位寄存器的8位数据全部传输完毕后,制造一次锁存器时钟引脚的上升沿(先拉低电平再拉高电平)*/    
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
  HAL_Delay(100);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
}  

注意,代码是将 PB14 配置为输出的。这个没什么影响,因为没有使用到 PB14。正确应该将 PB14 配置为输入。我懒得重新生成代码了。

系统完整照片

用的是杜邦线连接,有点丑。测试系统将就用一下。
在这里插入图片描述
如上图所示,继电器对应的灯已经点亮。

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!要使用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) { // 主程序循环 } } ``` 请根据您的具体需求对代码进行适当修改,并确保正确连接电路。希望以上信息对您有帮助!如有任何疑问,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

努力的老周

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

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

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

打赏作者

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

抵扣说明:

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

余额充值