当前位置: 首页 > news >正文

stm32使用SPI写W25Q32

SPI.h

#ifndef __SPI_H
#define __SPI_H#include "stm32f10x.h"#define SPI_CS_H GPIO_SetBits(GPIOB, GPIO_Pin_12)
#define SPI_CS_L GPIO_ResetBits(GPIOB, GPIO_Pin_12)#define SPI_SCK_H GPIO_SetBits(GPIOB, GPIO_Pin_13)
#define SPI_SCK_L GPIO_ResetBits(GPIOB, GPIO_Pin_13)#define SPI_MISO_H GPIO_SetBits(GPIOB, GPIO_Pin_14)
#define SPI_MISO_L GPIO_ResetBits(GPIOB, GPIO_Pin_14)#define SPI_MOSI_H GPIO_SetBits(GPIOB, GPIO_Pin_15)
#define SPI_MOSI_L GPIO_ResetBits(GPIOB, GPIO_Pin_15)#define READDATALENGTH 255void SPI_GPIO_Init(void);
uint8_t SPI_WriteRead_Byte(uint8_t byte);void Write_Enable(void);
void Write_Disable(void);
uint8_t Read_StatusR1(void);
uint8_t* Read_Data(uint8_t addr2, uint8_t addr1, uint8_t addr0, uint8_t num2read);void Page_Program(uint8_t addr2, uint8_t addr1, uint8_t addr0, uint8_t *data);
void Sector_Erase(void);#endif

SPI.C

#include "spi.h"void SPI_GPIO_Init(void)
{//SPI2-NSS PB12:PIN25 --CS//SPI2-SCK PB13:PIN26//SPI2-MISO PB14:PIN27     W25Q32:DO//SPI2-MOSI PB15:PIN28     W25Q32:DI
GPIO_InitTypeDef    GPIO_InitStruct;  SPI_InitTypeDef    SPI_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStruct.GPIO_Pin =  GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStruct);SPI_CS_H;
//    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
//    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
//    
//    GPIO_Init(GPIOB, &GPIO_InitStruct);
SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge;SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low;SPI_InitStruct.SPI_CRCPolynomial = 7;SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;SPI_InitStruct.SPI_Mode = SPI_Mode_Master;SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;SPI_Init(SPI2, &SPI_InitStruct);SPI_Cmd(SPI2, ENABLE);}uint8_t SPI_WriteRead_Byte(uint8_t byte)
{SPI_I2S_SendData(SPI2, byte);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);return SPI_I2S_ReceiveData(SPI2);
}void Write_Enable(void)
{SPI_CS_L;SPI_WriteRead_Byte(0x06); //set WEL bit 1
    SPI_CS_H;}//一般不需要调用,编程或是擦除操作,WEL会自动清零
void Write_Disable(void)
{SPI_CS_L;SPI_WriteRead_Byte(0x04); //set WEL bit 0
    SPI_CS_H;
}//判断忙标志
uint8_t Read_StatusR1(void)
{uint8_t res = 0;SPI_CS_L;SPI_WriteRead_Byte(0x05); //S0 BUSY bit 1: busy ;    S0 BUSY bit 0: free ;res = SPI_WriteRead_Byte(0x05);SPI_CS_H;if((res & 0x01)== 0x01){return 1;}else{return 0;}
}//读1/2个字节数据
uint8_t* Read_Data(uint8_t addr2, uint8_t addr1, uint8_t addr0, uint8_t num2read)
{static uint8_t res[READDATALENGTH] = {0};uint8_t i = 0;SPI_CS_L;SPI_WriteRead_Byte(0x03);SPI_WriteRead_Byte(addr2);SPI_WriteRead_Byte(addr1);SPI_WriteRead_Byte(addr0);for(i = 0; i < num2read; i ++){res[i] = SPI_WriteRead_Byte(0xff);    }SPI_CS_H;return res;
}void Page_Program(uint8_t addr2, uint8_t addr1, uint8_t addr0, uint8_t *data)
{Write_Enable();SPI_CS_L;SPI_WriteRead_Byte(0x02);//02H页写
SPI_WriteRead_Byte(addr2);//设定写入数据的起始地址
      SPI_WriteRead_Byte(addr1);SPI_WriteRead_Byte(addr0);//      SPI_WriteRead_Byte(data[0]);//1个字节数据
//      SPI_WriteRead_Byte(data[1]);while(*data != '\0'){SPI_WriteRead_Byte(*data);data ++;}SPI_CS_H;
}void Sector_Erase(void)
{Write_Enable();SPI_CS_L;SPI_WriteRead_Byte(0x20);//20H扇区擦除
SPI_WriteRead_Byte(0x00);//擦除的数据的起始地址SPI_WriteRead_Byte(0x00);SPI_WriteRead_Byte(0x00);SPI_CS_H;
}

MAIN.C

#include "stm32f10x.h"
#include "spi.h"uint8_t val[4] = {0};
uint8_t *p;
//uint8_t send[4] = {0xa8, 0x8a, 0x55, 0xaa};
uint8_t *send = "hello, world";int main(void)
{SPI_GPIO_Init();SPI_CS_L;SPI_WriteRead_Byte(0X90);SPI_WriteRead_Byte(0X90);SPI_WriteRead_Byte(0X90);SPI_WriteRead_Byte(0X00);val[0] = SPI_WriteRead_Byte(0X90);val[1] = SPI_WriteRead_Byte(0X90);SPI_CS_H;    Sector_Erase();while(Read_StatusR1());Page_Program(0x0, 0x0, 0x0, send);while(Read_StatusR1());p = Read_Data(0x0, 0x0, 0x0, 12);while(1);
}

主要学习数组作为参数传递,函数返回数组

http://www.rkmt.cn/news/46794.html

相关文章:

  • docker - 1 安装
  • 最小二乘困难详解5:非线性最小二乘求解实例
  • ##题解##洛谷P1578##最大子矩形 扫描线法
  • 【Azure Developer】azd 安装最新版无法登录中国区问题二:本地Windows环境遇问题
  • Mac 下载 VMware 11.1.0-1.dmg 后如何安装?超简单教程(附安装包)
  • 在R中生成交互地图leaflet包
  • 重启 MariaDB 数据库服务
  • 重练算法(代码随想录版) day 7 -哈希表part2
  • 团队作业2——《需求规格说明书》
  • gmssl常用命令 - 需要持续更新
  • 实用指南:根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型
  • 转转客服IM聊天系统背后的技术挑战和实践分享
  • 实验 5:ViT Swin Transformer
  • chatTTS源码版本地部署踩的坑
  • 第一讲机器学习基础
  • 第二十八天
  • 102302138 林楚涵 作业2
  • PWM妙用:解锁LED亮度调节与呼吸灯的LuatOS开发之旅
  • 主子式与顺序主子式
  • JAVA 随机函数
  • CF1327F AND Segments
  • Kimi会员双11砍价成功!0.99元首月链接分享
  • 鸿蒙NEXT系列之精析NDK UI API(节点增删和属性设置) - 实践
  • 通用cursor rules总结
  • 锡林郭勒西林瓶灌装清洗耗材月成本分析?查行情享优惠
  • AI Agent OS 探索有价值的论文分析(1):Sleep-time Compute
  • 宏定义的高级应用
  • 被问性能后,我封装了这个 PHP 错误上报工具
  • 公众号中的贴纸素材有什么作用?在哪里找?
  • 公众号怎么起爆款标题?有什么好用的工具?