Stm32(CubeMx)通过SPI向flash写入和输出

这是一个卑微电子信息学员的开始

学习stm32

寒假开始了,卑微电子信息学员开始了stm32的学习过程。

stm32(CubeMx)通过SPI向flash写入和输出

一. SPI

  1. SPI只是是一种高速的,全双工,同步的通信总线,在芯片的管脚上只占用四根线,节约了芯片的管脚,以stm32为例,当 、想通过SPI向flash写入数据的时候,就需要用到SPI。SPI有4个引脚可以供我们使用,分别是:/CS;CLK;DIO;DO脚,其中,当使用CubeMx时,在SPI1中将Mode选为Full-Duplex-Master,CLK;DIO;DO脚会自动初始化,而/CS脚需要自己定义,在Stm32107中选用的flash是W25X16,对应的管脚号是PB9,不同的开发板可能会有差异,引脚定义如下图:

在这里插入图片描述

  1. 在Cube的stm32f1xx_hal_spi.c函数库中,其实只有两个操作——HAL_SPI_Transmit()和HAL_SPI_TransmitReceive(),在很多别的网站上都有很多人将另一个函数HAL_SPI_Receive()放了出来,但是,仔细分析HAL_SPI_Receive(),在读写flash的操作中,它可以说没有任何单独列出的价值,在库函数的943行return HAL_SPI_TransmitReceive(hspi, pData, pData, Size, Timeout);你会发现这个函数在基础的应用阶段没有什么价值,它最终调用了先前给出的函数,只需要前两个就够了;

  2. 在开始的时候,我一直很迷茫,HAL_SPI_Transmit()函数传送了一个数组的指针和长度,至于这个数组应该是什么内容完全没有一点头绪,在网上搜索了很久也没有找到答案,后来终于明白,这个函数之负责将你给的uint8_t类型的指针以及长度给到SPI,至于SPI应该进行什么操作,和这个函数就没有任何关系了(我曾经错误的以为HAL_SPI_Transmit()就将数据写入flash,而HAL_SPI_Receive()可以将flash的数据直接读出来);

  3. HAL_SPI_Transmit()函数只传达你要求长度的数据,接下来,SPI根据你传递的内容控制flash进行你最终想进行的flash读写操作,而SPI要求的数据具有一定的格式,你必须按照SPI要求的格式传递相应的数据,不然SPI不会进行你要求的任务,附SPI的数据格式如下:
    在这里插入图片描述

  4. SPI在进行任何操作前必须在/CS(PB9)给一个低电压,结束操作后给一个高电压,这很关键,CubeMx的SPI库中没有进行这一操作,需要自己完成,传输数据可以分段完成,比如我自己喜欢先传输instruction name,再传输地址,最后是接收数据或者传输数据;

  5. 我个人是为每一个操作写了一个函数,(我不知道怎么在这里插入代码,如果你有需要,可以留言告诉我)
    在这里插入图片描述
    这是我自己定义的,个人认为这样会比纯写数字要好区分和使用,同时代码更加具有观赏性。
    在这里插入图片描述
    这是定义的数组
    在这里插入图片描述
    我个人喜欢将函数定义的比较细分化,也不是很喜欢打注释,但是我觉得总体可读性比较强,函数名称也就是的它的功能,就不再打注释了
    在这里插入图片描述
    代码比较长,需要电子版和我留言
    在这里插入图片描述
    这是最重要的两个函数,比较重要,放在后面。第一个函数向flash写入数据,先发送命令代号,紧接着发送要写入的地址,最后将要写的数据发送。第二个是读数据函数,大体相似,最后是发送接收数据的指针(地址)。

  6. 我的STM32接了一块LED屏作为显示,所以最后有一个LED显示函数;

  7. 在进行擦除操作后,SPI会自动进行write disable,这个需要注意,还有就是进行擦除或者写入操作后,它需要时间,如果直接进行后续操作会发生读写失败;

  8. 在进行写入操作前先检查该区域是否已经被写入过,如果被写入过需要先进行擦除操作,不然会发生写入失败;

本文仅供学习使用,拒绝转载,抄袭,最终解释权由作者本人享有,希望可以对你的stm32学习有帮助

发布了4 篇原创文章 · 获赞 0 · 访问量 166

猜你喜欢

转载自blog.csdn.net/mohaoyuan/article/details/104044549