找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STM32F407读写SPI接口的flash W25Q128存储芯片驱动程序

[复制链接]
路漫漫 发表于 2020-6-4 16:59:40 | 显示全部楼层 |阅读模式
完整源码.rar (1.4 MB, 售价: 2 E币)
使用了固件库,附件中用windows画图工具画了几幅示意图帮助理解,图画得比较丑,希望能帮助到其他人
220013bw4mp4665541ljp5.png 220027kgsazoyysra5bos6.png
部分源程序如下:完整源码请参考本文附件
  1. #include "stm32f4xx.h"
  2. #include "spi.h"


  3. void spi1_init(void)
  4. {
  5.     GPIO_InitTypeDef  GPIO_InitStruct;
  6.     SPI_InitTypeDef SPI_InitStruct;
  7.    
  8.     //开启SPI1 和 GPIOB的时钟
  9.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  10.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
  11.    
  12.    
  13.     //设置引脚 PB3--SPI1_SCK PB4--SPI1_MISO PB5--SPI1_MOSI
  14.     //模式、推挽、是否上拉等等
  15.         
  16.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//复用模式
  17.     GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
  18.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5;    //3 4 5号引脚
  19.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//内部上拉电阻
  20.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//快速

  21.     GPIO_Init(GPIOB, &GPIO_InitStruct);
  22.    
  23.     //复用为SPI1
  24.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
  25.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);
  26.     GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);
  27.    
  28.     //PB14---作为 W25Q128的片选
  29.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//输出模式
  30.     //GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
  31.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;    //14号引脚
  32.     //GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//内部上拉电阻
  33.     //GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;//快速

  34.     GPIO_Init(GPIOB, &GPIO_InitStruct);
  35.    
  36.     //默认先不选中W25Q128
  37.     CS = 1;

  38.     //关于主从模式 高低位那个先发 8或16bits 时钟的频率 极性和相位
  39.     SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
  40.     //W25Q128 MODE 3
  41.     SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;//从机mode 3的需求
  42.     SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//从机mode 3的需求
  43.     SPI_InitStruct.SPI_CRCPolynomial = 7;//校验和多项式有几项
  44.     SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//从机的需求
  45.     SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//两线全双工
  46.     SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//从机的需要
  47.     SPI_InitStruct.SPI_Mode = SPI_Mode_Master;
  48.     SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//软件管理片选引脚
  49.     SPI_Init(SPI1, &SPI_InitStruct);

  50.     //使能SPI1
  51.     SPI_Cmd(SPI1, ENABLE);
  52.    
  53. }


  54. unsigned char spi1_write_read_byte(unsigned char data)
  55. {
  56.     //等上一次发送完成
  57.     while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) != SET);
  58.    
  59.     SPI_I2S_SendData(SPI1, data);
  60.    
  61.     //等接收缓冲非空
  62.     while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) != SET);
  63.    
  64.     return SPI_I2S_ReceiveData(SPI1);

  65. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-22 10:16

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表