!!! 本文已同步到码云 - 点击此链接获取最新 - 可进入码云提交修改 !!!


附件

源码已放到码云 ! ! ! ( 请点击文首链接进入仓库 )


运行环境

  • Windows10
  • STM32CubeMX Version 5.2.0
  • Keil5(MDK5) Version 5.28.0.0

简介

本例程主要讲解如何使用硬件IIC读写24C02


STM32CubeMx基本配置

基础配置过程请参考 STM32CubeMx开发之路—配置第一个项目


使用printf功能

重定向printf的过程请参考 STM32CubeMx开发之路—3发送USART数据和printf重定向


CubeMX配置

  • SPI配置

  • 根据原理图可知需要的配置的是SPI2

  • 同时配置CS引脚, 本例CS引脚是PG13

代码修改

  • 查看W25Q64的手册(后面配置时需要用的命令都在里面)

  • 封装功能函数的代码(讲解写在代码里面)
/* W25Q64的指令 */
uint8_t w25x_read_id = 0x90;                    // 读ID
uint8_t m_addr[3]    = {0,0,0};                 // 测试地址0x000000
uint8_t check_addr   = 0x05;                    // 检查线路是否繁忙
uint8_t enable_write = 0x06;                    // 使能了才能改变芯片数据
uint8_t erase_addr   = 0x20;                    // 擦除命令
uint8_t write_addr   = 0x02;                    // 写数据命令
uint8_t read_addr    = 0x03;                    // 读数据命令/* 读ID */
void ReadID(void)
{uint8_t temp_ID[5] = {0,0,0,0,0};                        // 接收缓存HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &w25x_read_id, 1, 100);        // 读ID发送指令HAL_SPI_Receive(&hspi2, temp_ID, 5, 100);                // 读取IDHAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 测试打印 */printf("readID is %x%x\n",temp_ID[3],temp_ID[4]);
}/* 检查是否繁忙 */
void CheckBusy(void)
{uint8_t status=1;uint32_t timeCount=0;do{timeCount++;if(timeCount > 0xEFFFFFFF) //等待超时{return ;}HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &check_addr, 1, 100);            // 发送指令HAL_SPI_Receive(&hspi2, &status, 1, 100);                // 读取HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS}while((status&0x01)==0x01);
}/* 写入数据 */
void ReadData(void)
{uint8_t temp_wdata[5] = {0x99,0x88,0x77,0x66,0x55};        // 需要写入的数据/* 检查是否繁忙 */CheckBusy();/* 写使能 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &enable_write, 1, 100);        // 发送指令HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 擦除 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &erase_addr, 1, 100);            // 发送指令HAL_SPI_Transmit(&hspi2, m_addr, 3, 100);                // 发送地址HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 再次检查是否繁忙 */CheckBusy();/* 写使能 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &enable_write, 1, 100);        // 发送指令HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 写数据 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &write_addr, 1, 100);            // 发送指令HAL_SPI_Transmit(&hspi2, m_addr, 3, 100);                // 地址HAL_SPI_Transmit(&hspi2, temp_wdata, 5, 100);            // 写入数据HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS
}/* 读取数据 */
void WriteData(void)
{uint8_t temp_rdata[5] = {0,0,0,0,0};                    // 读出数据保存的buff/* 检查是否繁忙 */CheckBusy();/* 开始读数据 */HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_RESET);    // 使能CSHAL_SPI_Transmit(&hspi2, &read_addr, 1, 100);            // 读发送指令HAL_SPI_Transmit(&hspi2, m_addr, 3, 100);                // 地址HAL_SPI_Receive(&hspi2, temp_rdata, 5, 100);            // 拿到数据HAL_GPIO_WritePin(GPIOG, GPIO_PIN_13, GPIO_PIN_SET);    // 失能CS/* 测试打印 */printf("Read flash data is:%x %x %x %x %x\n",temp_rdata[0],temp_rdata[1],temp_rdata[2],temp_rdata[3],temp_rdata[4]);
}
  • main函数
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */ReadID();WriteData();ReadData();while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}

运行结果

  • 烧录进去,用串口调试助手
  • 发现输出的就是我们存进的数据,说明测试成功

小结

SPI在实际应用过程非常广泛,而且速度也是比较快的,也是嵌入式需了解的协议之一,所以一定要好好理解!


备注


STM32CubeMx开发之路—13使用SPI读写W25Q64相关推荐

  1. STM32CubeMx开发之路—在线升级OTA

    文章目录 运行环境 简介 基础知识(1/4) STM32中的程序在哪儿? 进行分区 总体流程图 BootLoader程序 流程图分析 程序编写和分析 App程序 流程图分析 程序编写和分析 Ymode ...

  2. STM32CubeMx开发之路—使用SysTick实现微妙延时函数delay_us()

    运行环境 Windows10 STM32CubeMX Version 5.4.0 Keil5(MDK5) Version 5.28.0.0 硬件开发板 F103RB-NUCLEO 简介 本例程主要讲解 ...

  3. STM-32:SPI通信协议/W25Q64简介—软件SPI读写W25Q64

    目录 一.SPI简介 1.1电路模式 1.2通信原理 1.3SPI时序基本单元 1.3.1起始和终止 1.3.2交换字节 二.W25Q64 2.1W25Q64简介 2.2W25Q64硬件电路 2.3W ...

  4. PCM开发板模块实验指导--SPI读写PSRAM64实验

    模块推荐:https://item.taobao.com/item.htm?ft=t&id=671629736762         32---SPI读写PSRAM64实验实验:        ...

  5. STM32CubeMx开发之路—LTDC驱动STM32F429I-Discover上的显示屏

    附件 源码已放到码云 ! ! ! ( 请点击文首链接进入仓库 ) 运行环境 Windows10 STM32CubeMX Version 5.4.0 Keil5(MDK5) Version 5.28.0 ...

  6. STM32CubeMx开发之路—在线升级OTA—(进阶)

    运行环境 Windows10 STM32CubeMX Version 5.4.0 Keil5(MDK5) Version 5.28.0.0 硬件开发板 F103RB-NUCLEO 简介 之前的教程很多 ...

  7. 问题贴 STM32 SPI 读写 W25Q64 接上逻辑分析仪后读取失败

    问题描述: 使用STM32野火指南者(F103VET6),对板载外设 W25Q64 读写时候,数据正常如下: 但是使用逻辑分析仪连接 GND CS MOSI MISO四个引脚后,STM32发送数据还正 ...

  8. STM32CUBEMX开发GD32F303(14)----IIC之配置OLED

    STM32CUBEMX开发GD32F303.14----IIC之配置OLED 概述 视频教学 csdn课程 样品申请 生成例程 配置时钟树 IIC配置 OLED 参考程序 HAL_I2C_Mem_Wr ...

  9. STM32CUBEMX开发GD32F303(16)----移植兆易创新SPI Nor Flash之GD25Q64Flash

    spi概述 SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的 ...

  10. STM32F103配合STM32CubeMX实现SPI读写flash

    本人采用的是正点原子的精英STM32F103开发板,其包含一块W25Q128型号的flash芯片.该flash与STM32F103的SPI2相连. 下面根据正点原子提供的开发指南文档,实现FreeRT ...

最新文章

  1. PHP气缸种类,气缸分类方法有哪些及气缸的种类
  2. android技术内幕心得
  3. 单片机联网,UIP实现tcp/udp协议
  4. np.c_与np.r_
  5. 打不死的redis集群
  6. iOS实战:第一次在iTunesConnect上建立应用时注意公司名称
  7. hadoop将消亡_数据科学家:适应还是消亡!
  8. oracle将字符串的日期格式化,oracle格式化字符串 oracle 怎么把字符串转换成日期...
  9. 无人机可能又闯祸了:这次导致美国一架直升机坠毁
  10. MUI框架开发HTML5手机APP(一)--搭建第一个手机APP
  11. java继承,final,super,Object类,toString,equals,
  12. BUG--tomcat更改目录失败
  13. Java小题,通过JNI调用本地C++共享库中的对应方法实现杨辉三角的绘制
  14. paip.提升效率----几款任务栏软件
  15. 计算机网络基础应用课程标准,王建波《计算机网络基础》课程标准.doc
  16. 强化学习实战——Q learning 实现倒立摆
  17. 2-常见机器学习模型总结
  18. python编程工具pycharm
  19. lgv30刷android10,记一次LG V30系列手机完美刷入MIUI12系统和Flyme刷机教程
  20. ORA-12514 错误的处理

热门文章

  1. 《编程珠玑》读解 一
  2. Python 资源索引[绝对适合PYTHON人]
  3. Java多线程编程核心技术 (pdf完整版)
  4. 地图上制作线路的动画_航线地图上的动画飞行效果怎么实现?只要五步轻松上手...
  5. Windows屏幕保护程序的制作
  6. 【Android】ListView刷新、加载
  7. 移动硬盘不认盘还能数据恢复吗?
  8. 静态HTML网页模板源码——仿男装女装购物商城(40页功能齐全)
  9. webpack + vue 学习看过的文章 网址
  10. 树莓派搭建transmission下载机