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.mzph.cn/news/946427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Avjinder Singh Kaler | 数量遗传学基础

研究对象与核心思想• 数量遗传学研究数量性状(如身高、产量等连续变异性状)的遗传规律。 • 特点:受多基因控制,且环境效应显著。单基因模型基础• 单基因模型是数量遗传理论的起点,假设一个基因位点有两个等位基…

鲁东大学提出可解释的自适应集成机器学习全基因组选择算法用于小麦产量性状关键SNPs筛选

研究背景 全基因组选择(genomic selection, GS)是现代分子育种中的一项重要技术,作为一种强大的机器学习GS方法,堆叠集成学习(stacking ensemble learning, SEL)有效地融合了不同模型(基学习器)的优势,以精确…

台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解

台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consol…

数论专题小记

我的数论以前一只因为对数字的恐惧而搁置,准备这几天补回来 /kk。 狄利克雷卷积&莫比乌斯反演我们定义 狄利克雷卷积 这种运算是把两个数轮函数 \(f,g\) 卷成另一个函数 \(t\),其中 \(t\) 满足: \(\ \ \ \ \ \ …

ReactUse 与ahook对比 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机械臂和相机的9点标定原理

9点标定到底怎么工作的? 这个问题困惑了我很久,虽然想海康VisionMaster 和Halcon 这种软件都提供了很好用的工件,但是最好懂原理,这样才不仅能做项目,还能做好项目。 最近好好研究了一下,感觉是搞清楚了,就记录…

遗传改良中的核心技术:交配设计

分享一则报告,系统总结了植物育种中常用的交配设计(Mating Designs)方法。定义与目的定义:交配设计是指为产生后代而在植物群体间有计划的杂交方案。目的:理解性状或行为的遗传控制机制;为作物品种开发提供基础群…

语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来 - 教程

语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: &quo…

书籍推荐 | 《数量遗传学》(王建康)

数量遗传学是智能育种必学课程,这里推荐一本由中国农科院作物科学研究所王建康老师主编的教材。本书系统介绍群体遗传与数量遗传的基本理论及其在动植物育种中的应用。全书分群体遗传、数量遗传、育种应用和基因定位四…

Plant Com | 一种新的多源数据(基因组、表型和跨环境)融合的基因组预测框架-GPS

基因组选择(GS)和表型选择(PS)被广泛用于加速植物育种。然而,在处理处理复杂性状时,这两种选择方法的准确性、稳健性和可转移性尚未得到充分探索。近日,南京农业大学丁艳锋团队在Plant Communications发表题为G…

分享二个实用正则

正则表达式是一种用于匹配和操作文本的强大工具。它由一系列字符和特殊字符组成,用于描述要匹配的文本模式。最近看到二个我觉得很实用的正则使用方式,一起来看看吧前言 正则表达式(Regular Expression,简称regex或…

国际水稻研究所推出 AI 驱动的全球杂交水稻育种与亲本筛选数字平台

菲律宾洛斯巴诺斯(2025 年 2 月 26 日)——国际水稻研究所(IRRI)正式发布全新 AI 驱动数字平台,可显著加速全球杂交水稻育种与亲本筛选工作,通过推广高产且气候智能型杂交水稻,为粮食安全与可持续农业作出贡献。…

《程序员修炼之道:从小工到专家》笔记1

1核心身份认同:本书开篇即定义了“注重实效的程序员”的形象。我们不仅是代码的搬运工,更是项目的看护人和利益的守护者。我们勇于承担责任,而不是找借口。 2两大核心哲学: “我的源码让猫给吃了”:这是一种反讽。…

深入解析:UNIX下C语言编程与实践3-Vi 编辑器从入门到精通:快捷键使用与高效编辑技巧

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

科普报告:分子标记辅助选择(MAS)育种

分享一则由埃及农业基因工程研究所(AGERI)的Dina El-Khishin教授撰写《Marker Assisted Selection(MAS,标记辅助选择)》的报告,系统介绍了分子标记在植物育种中的应用,特别是如何利用MAS技术应对气候变化背景下…

实用指南:【ansible/K8s】K8s的自动化部署源码分享

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF1896F

题目大意: 有一个长度为 \(2n\) 的 \(01\) 序列 \(a\),你可以对他进行一下操作(不超过10步)。 输出一个长度为 \(2n\) 的括号匹配字符串 \(s\),假设每个左括号 \(i\) 与右括号 \(p_{i}\) 匹配,那么将 \(a\) 中 \…

作物遗传育种中的多亲本互交群体(MAGIC)

MAGIC群体简介 植物遗传研究的重要优势是遗传群体构建的便利。传统上用于遗传作图的主要有基于连锁分析的双亲群体和基于关联分析的自然群体和多亲群体。但由于双亲群体的遗传背景狭窄,可定位的 QTL 有限,自然群体存…

联邦大型语言模型、多智能体大型语言模型是什么? - 详解

联邦大型语言模型、多智能体大型语言模型是什么? - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas…

一个用于自动化基因表达分析的多智能体框架GenoMAS

2025年7月,伊利诺伊大学香槟分校和加州大学圣地亚哥分校的研究团队在预印本平台arXiv发表了题为GenoMAS: A Multi-Agent Framework for Scientific Discovery via Code-Driven Gene Expression Analysis的论文。该研究…