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

stm32使用SPI外设读取W25Q32芯片

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);//时钟也无需开启AFIO时钟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);}

使用SPI标准接口SPI-NSS引脚对应芯片的CS引脚;

使用SPI标准接口SPI-SCK引脚对应芯片的CLK引脚;

使用SPI标准接口SPI-MISO引脚对应芯片的DO引脚;

使用SPI标准接口SPI-MOSI引脚对应芯片的DI引脚;

注意SPI-NSS引脚IO口配置为普通推挽输出,SPI-MISO配置为复用推挽输出,而不是配置为输入

int main(void)
{SPI_GPIO_Init();SPI_CS_L;//    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI2, 0xAB);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);val[0] = SPI_I2S_ReceiveData(SPI2);//    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI2, 0xAB);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);val[0] = SPI_I2S_ReceiveData(SPI2);//    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI2, 0xAB);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);val[0] = SPI_I2S_ReceiveData(SPI2);//    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI2, 0xAB);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);val[0] = SPI_I2S_ReceiveData(SPI2);//    while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);SPI_I2S_SendData(SPI2, 0xAB);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);val[0] = SPI_I2S_ReceiveData(SPI2);SPI_CS_H;    while(1);
}

主函数中,主机发送一个数据时,要等待发送数据寄存器为空,才算把数据发送到从机;主机接收数据寄存器不为空时,才可以读取主机收到的数据。

若是主机发送一个数据,判断发送数据寄存器为空时就认为从机数据已经发送到主机,在主机读取数据,这个数据是错误的。

SPI_I2S_SendData(SPI2, 0xAB);while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);val[0] = SPI_I2S_ReceiveData(SPI2);
这样判断,主机读取的数据是错误的,需要注意。

aaaa

 

读取ID7-ID0数据时,需要注意前面发送了4个数据,分别为ABh,any, any, any,之后若要读取数据,需要额外再发送一个数据给从机,才能将从机的数据移位到主机接收数据寄存器中。

 

http://www.gsyq.cn/news/30465.html

相关文章:

  • Avjinder Singh Kaler | 数量遗传学基础
  • 鲁东大学提出可解释的自适应集成机器学习全基因组选择算法用于小麦产量性状关键SNPs筛选
  • 台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解
  • 数论专题小记
  • 《程序员修炼之道:从小工到专家》笔记1
  • 科普报告:分子标记辅助选择(MAS)育种
  • 实用指南:【ansible/K8s】K8s的自动化部署源码分享
  • 作物遗传育种中的多亲本互交群体(MAGIC)
  • 联邦大型语言模型、多智能体大型语言模型是什么? - 详解
  • 一个用于自动化基因表达分析的多智能体框架GenoMAS
  • 50年的玉米育种改良,是如何应对气候变化的?
  • 刷题日记—洛谷数组题单—幻方
  • python爬虫进阶版练习(只说重点,selenium) - 指南
  • 基因组选择(GS)如何加速作物遗传增益?
  • OpenAI推出内置ChatGPT的Atlas浏览器:重新定义网页浏览体验
  • 数据清洗
  • 102302110高悦作业1
  • 2025.10.23 模拟赛
  • Day23-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\InOut
  • LLM学习记录DAY12
  • 深入解析:Zark Lab 与 Walrus 合作,建立内容发现、可访问性与实用性的基础 AI 智能层
  • 前后端分离毕设课题:基于React.js+Java+Springboot框架+Mysql数据库在线买菜商城专业的系统设计与实现
  • 2025 年 Python 数据分析全栈学习路线:从入门到精通的进阶指南 - 实践
  • Windows 11 家庭版关闭自动更新
  • 权威调研榜单:石英砂生产线厂家TOP3榜单好评深度解析
  • FSEventsParser脚本升级与macOS取证技术解析
  • redis食用方法
  • cnbook主题风格美化 —— 01(未完成)
  • 【嵌入式】IIC和SPI的比较
  • SpringBoot 的配置文件与日志 - 实践