学习目标

  1. 掌握SPI配置方式
  2. 掌握SPI读写操作

    学习内容

    需求

    240.png241.png

    SPI配置

    打开SPI1,选中全双工模式。观察下方自动生成的引脚,是否和自己开发板引脚对应。
    058.png
    修改引脚,来动右侧芯片引脚视图,找到开发板对应引脚,进行修改。
    060.png
    061.png
    062.png
    观察修改后的引脚,是否和开发板对应:
    063.png
    修改SPI参数,目前当前业务只需要修改速率,通过修改分频得到。
    064.png

    SPI编码

    OLED驱动拷贝

    将原有OLED驱动拷贝到项目中

    OLED的GPIO初始化修改

    ```c GPIO_InitTypeDef GPIO_InitStruct = {0};
    //cs1: 屏幕的片选 CS1_PORT_RCC(); GPIO_InitStruct.Pin = CS1_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; HAL_GPIO_Init(CS1_PORT, &GPIO_InitStruct); //
    //cs2: 字库的片选 CS2_PORT_RCC(); GPIO_InitStruct.Pin = CS2_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(CS2_PORT, &GPIO_InitStruct);

//dc: 是屏幕自己独有的命名控制引脚,和spi无关 DC_PORT_RCC(); GPIO_InitStruct.Pin = DC_PIN; HAL_GPIO_Init(DC_PORT, &GPIO_InitStruct);

  1. ```c
  2. #include "stm32f4xx_hal.h"
  3. #include "spi.h"
  4. #ifndef u8
  5. #define u8 uint8_t
  6. #endif
  7. #ifndef u16
  8. #define u16 uint16_t
  9. #endif
  10. #ifndef u32
  11. #define u32 uint32_t
  12. #endif
  13. /////// CS1
  14. #define CS1_PORT_RCC() __HAL_RCC_GPIOA_CLK_ENABLE()
  15. #define CS1_PORT GPIOA
  16. #define CS1_PIN GPIO_PIN_15
  17. /////// CS2
  18. #define CS2_PORT_RCC() __HAL_RCC_GPIOA_CLK_ENABLE()
  19. #define CS2_PORT GPIOA
  20. #define CS2_PIN GPIO_PIN_4
  21. /////// DC
  22. #define DC_PORT_RCC() __HAL_RCC_GPIOB_CLK_ENABLE()
  23. #define DC_PORT GPIOB
  24. #define DC_PIN GPIO_PIN_8
  25. //-----------------OLED端口定义----------------
  26. #define OLED_DC_Clr() HAL_GPIO_WritePin(DC_PORT,DC_PIN, GPIO_PIN_RESET)//DC
  27. #define OLED_DC_Set() HAL_GPIO_WritePin(DC_PORT,DC_PIN, GPIO_PIN_SET)
  28. #define OLED_CS_Clr() HAL_GPIO_WritePin(CS1_PORT,CS1_PIN, GPIO_PIN_RESET)//CS1
  29. #define OLED_CS_Set() HAL_GPIO_WritePin(CS1_PORT,CS1_PIN, GPIO_PIN_SET)
  30. #define OLED_ROM_CS_Clr() HAL_GPIO_WritePin(CS2_PORT,CS2_PIN, GPIO_PIN_RESET)//CS2
  31. #define OLED_ROM_CS_Set() HAL_GPIO_WritePin(CS2_PORT,CS2_PIN, GPIO_PIN_SET)
  • 将引入改为#include "stm32f4xx_hal.h"
  • 引入生成的spi.h

    实现SPI的读写

    定义头
    1. /* USER CODE BEGIN Prototypes */
    2. void SPI1_write(uint8_t data);
    3. uint8_t SPI1_read();
    4. /* USER CODE END Prototypes */
    实现spi读写
    1. /* USER CODE BEGIN 1 */
    2. void SPI1_write(uint8_t data) {
    3. HAL_SPI_Transmit(&hspi1, &data, 1, HAL_MAX_DELAY);
    4. }
    5. uint8_t SPI1_read() {
    6. uint8_t data;
    7. HAL_SPI_Receive(&hspi1, &data, 1, HAL_MAX_DELAY);
    8. return data;
    9. }
    10. /* USER CODE END 1 */

练习

  1. 使用HAL库点亮屏幕