当前位置: 首页 > 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.jsqmd.com/news/22348/

相关文章:

  • Avjinder Singh Kaler | 数量遗传学基础
  • 鲁东大学提出可解释的自适应集成机器学习全基因组选择算法用于小麦产量性状关键SNPs筛选
  • 台球厅收银台押金原路退回系统押金预授权—东方仙盟 - 详解
  • 数论专题小记
  • ReactUse 与ahook对比 - 实践
  • 机械臂和相机的9点标定原理
  • 遗传改良中的核心技术:交配设计
  • 语言是火,视觉是光:论两种智能信号的宿命与人机交互的未来 - 教程
  • 书籍推荐 | 《数量遗传学》(王建康)
  • Plant Com | 一种新的多源数据(基因组、表型和跨环境)融合的基因组预测框架-GPS
  • 分享二个实用正则
  • 国际水稻研究所推出 AI 驱动的全球杂交水稻育种与亲本筛选数字平台
  • 《程序员修炼之道:从小工到专家》笔记1
  • 深入解析:UNIX下C语言编程与实践3-Vi 编辑器从入门到精通:快捷键使用与高效编辑技巧
  • 科普报告:分子标记辅助选择(MAS)育种
  • 实用指南:【ansible/K8s】K8s的自动化部署源码分享
  • CF1896F
  • 作物遗传育种中的多亲本互交群体(MAGIC)
  • 联邦大型语言模型、多智能体大型语言模型是什么? - 详解
  • 50年的玉米育种改良,是如何应对气候变化的?
  • 刷题日记—洛谷数组题单—幻方
  • python爬虫进阶版练习(只说重点,selenium) - 指南
  • 基因组选择(GS)如何加速作物遗传增益?
  • AI巨头动态:从OpenAI收购到Meta裁员,我们看到了什么?
  • Nature Plants | 植物转录因子结合图谱,360个转录因子的近3000个全基因组结合位点图谱
  • 【大数据】水质数据可视化分析实用的系统 计算机工程 Hadoop+Spark环境配置 数据科学与大信息技术 附源码+文档+讲解
  • 【MyBatis】MyBatis 报错:Parameter ‘xxx‘ not found - 实践
  • xyd 2025 S 模拟赛
  • 标题:AI巨头动态:从OpenAI的野心到Meta的裁员潮
  • Plant Com | 将基因编辑与组学、人工智能和先进农业技术相结合以提高作物产量