zoukankan      html  css  js  c++  java
  • SPI接口的FLASH

    SPI flash W25Qxx:

    W25Q系列的spiflash。每页(Page)256B,每16个page为一个sector(扇区=4KB),每16个扇区为一个block(块=64KB)

     W25Q16=16Mb=2MB=2048KB=32block=512sector=8192page;

    操作:SPI flash写操作必须确保为0XFF才能写入,否则需要檫除操作,檫除的最小单位为Sector即4KB,所以有的会在单片机内部开一个4K的缓存(有点奢侈),写之前先读出来,檫除数据,合并数据(在檫除数据的同时进行操作,合并完了在检查檫除是否完成,不闲着;操作系统级的 将因此进入挂起。要么设定一个合适的超时时间,要么有一个专门的轮训这些标志完成则发信号量),再写入。

    驱动程序:https://blog.csdn.net/weixin_42381351/article/details/80813104

    SPI SPI flash驱动规范:

    1 硬件SPI/软件SPI涉及的MOSI/MISO/SCK的IO设置、SPI设置读写一个字节。

    2 存储器件IC涉及的片选、调用SPI读写一个字节操作在某个指定地址读写一个字节/多个字节,檫除等操作。

    3业务层次的读写记录,APP升级等。

    一主多从可以通过不同片选来发送(都片选则都会收到),但对接收,如果关闭某个片选则可能得不到及时相应;如果都打开则同时来时的处理。IO模拟SPI一主多从如右图,先操作译码器(速度要快)再操作SPI的其它三根口线即可。

    GPIO模拟的SPI操作灵活,但效率不高。同时这种方法不适用于SPI的DMA传输,仅适合数据量少、对传输速度要求不同的场合。

    硬件SPI的片选可以软件控制也能硬件控制(DMA传输时必须)

    关于IO模拟SPI驱动的另一种编程方法:SCLK用PWM输出方波(脉宽周期按手册),其它的4线配置SCLK进行操作,通过读SCLK引脚

     GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)来配合时序,不满足就等,满足就进行其它IO的置高置低(配置SYSTICK或NOP进行延时)

    关于如何根据时序图用IO模拟写驱动/上升沿采样下降沿发送数据的含义,哪TM7705为例:

    上图表示对主机MCU而言:

    写的时候:MOSI上上升沿采样,上升沿前低电平时就要发送bit数据即:SCLK=0延时一小段时间就将send_data的MSB发出,然后SCLK=1再延时一段时间,接着进行下一个bit的操作。

    读的时候:再MISO上也是上升沿采样,高电平期间读bit.SCLK=0;delay(4),SCLK=1,delay(2),读MISO引脚电平,delay(1),接着进行下一个bit的操作。

     1 /*
     2 *********************************************************************************************************
     3 *    函 数 名: TM7705_Send8Bit
     4 *    功能说明: 向SPI总线发送8个bit数据。 不带CS控制。
     5 *    形 参: _data : 数据
     6 *    返 回 值: 无
     7 *********************************************************************************************************
     8 */
     9 static void TM7705_Send8Bit(uint8_t _data)
    10 {
    11     uint8_t i;
    12 
    13     for(i = 0; i < 8; i++)
    14     {    
    15         SCK_0();
    16         TM7705_Delay();
    17         if (_data & 0x80)
    18         {
    19             DI_1();
    20         }
    21         else
    22         {
    23             DI_0();
    24         }
    25         SCK_1();
    26         TM7705_Delay();
    27         _data <<= 1;
    28         TM7705_Delay();    
    29     }
    30 }
    31 /*
    32 *********************************************************************************************************
    33 *    函 数 名: TM7705_Recive8Bit
    34 *    功能说明: 从SPI总线接收8个bit数据。 不带CS控制。
    35 *    形 参: 无
    36 *    返 回 值: 无
    37 *********************************************************************************************************
    38 */
    39 static uint8_t TM7705_Recive8Bit(void)
    40 {
    41 uint8_t i;
    42 uint8_t read = 0;
    43 
    44 SCK_0();
    45 TM7705_Delay();
    46 for (i = 0; i < 8; i++)
    47 {
    48   SCK_0();
    49   TM7705_Delay();    
    50 
    51   SCK_1();
    52   TM7705_Delay();
    53   TM7705_Delay();
    54   if (DO_IS_HIGH())
    55   {
    56     read++;
    57   }
    58   read = read<<1;
    59 }
    60 return read;
    61 }                                                
    View Code
  • 相关阅读:
    Android开发教程
    Java基础——多线程
    Android基础总结(10)——手机多媒体的运用:通知、短信、相机、视频播放
    Android基础总结(9)——网络技术
    Android基础总结(7)——异步消息处理
    Android基础总结(6)——内容提供器
    《App研发录》知识点汇总
    Android基础总结(5)——数据存储,持久化技术
    Android基础总结(4)——广播接收器
    Android基础总结(3)——UI界面布局
  • 原文地址:https://www.cnblogs.com/jieruishu/p/10862126.html
Copyright © 2011-2022 走看看