基于ART-PI SPI驱动W25Q128

吐槽和避坑

  1. 弄spi弄了一天,使用的开发板是art-pi家的h750,本来准备直接用rt-thread studio生成的,但是不知道怎么回事配置出的工程文件都有问题,不是线程运行不了就是缺少定义,所以最近在一个一个测试外设
  2. 使用spi驱动w25q128参考了正点原子和野火的程序,不过由于没有在h7平台上的代码,所以移植起来还要花点时间,很多api也不一样,所以有的要一个一个看,这里说一下正点原子和野火代码的区别,原子家的比较偏寄存器,野火家的封装做的很多,好多自定义的变量我都以为是系统变量找了好久。
  3. 再说一下几个坑,主要是关于为什么读出的数据的0xFF的问题
    • 芯片片选引脚没有设置成输出模式而是选择复用模式感谢这个博主,我就是这个问题
    • 输出极性问题,正点原子使用的是如下极性
        SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH;    //串行同步时钟的空闲状态为高电平
        SPI1_Handler.Init.CLKPhase=SPI_PHASE_2EDGE;         //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
    
    经过测试下面这种也是可以的(也就是我选择的极性)
      hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
      hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
    
    • STLINK频率问题,网上有的说要把这个数值设置为8MHz,但是我设置为10MHz也可以用
      基于ART-PI SPI驱动W25Q128_第1张图片
    • FLASH时钟频率的问题,我设置的是8MHz,其他的就没有测试了
      基于ART-PI SPI驱动W25Q128_第2张图片

移植(将正点原子F1的移植到H7)

  1. 首先将所有的功能函数全部移植到spi.c里(由于我是使用cubemx生成的初始化代码,所以就直接放到了注释用户代码段里面,这样之后cubemx重新生成的时候代码就不会被覆盖)
  2. 修改诸如u8 u16 这样的定义为 uint8_t 和 uint16_t 等
  3. 替换位带操作,比如我将 W25QXX_CS=0; 替换成函数宏W25QXX_CS_L();
  4. 替换延时函数为你自己的延时函数,我直接使用HAL库的函数HAL_Delay()
  5. 删除无用的GPIO初始化代码
  6. 改变 uint32_t FLASH_SIZE;名为 uint32_t flash_size;大写的应该和系统变量名有冲突
  7. 修改一些参量以适配当前芯片,比如我使用的是W25Q128,所以内存大小就是128Mbits=16MB
    • 修改flash_size = 16* 1024* 1024
    • 如果W25Q64指令集不同就要修改指令表
    • 修改扇区数量和页大小等(引用此博客部分内容)
      基于ART-PI SPI驱动W25Q128_第3张图片可以看到对于Q128,有256个块,块容量64k(不用修改),有2048个扇区,每个扇区4K字节(不用修改),有65536页

驱动详解

以后有时间再写吧

代码

你可能感兴趣的:(单片机,嵌入式硬件)