• 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
  • 相关阅读:
    BZOJ 3132: 上帝造题的七分钟 树状数组+差分
    PAT Advanced 1006 Sign In and Sign Out (25 分)
    PAT Advanced 1011 World Cup Betting (20 分)
    PAT Basic 1032 挖掘机技术哪家强 (20 分)
    PAT Basic 1028 人口普查 (20 分)
    PAT Basic 1004 成绩排名 (20 分)
    大数据数据库HBase(二)——搭建与JavaAPI
    PAT Advanced 1009 Product of Polynomials (25 分)(vector删除元素用的是erase)
    PAT Advanced 1002 A+B for Polynomials (25 分)(隐藏条件,多项式的系数不能为0)
    PAT Basic 1041 考试座位号 (15 分)
  • 原文地址:https://www.cnblogs.com/jieruishu/p/10862126.html
Copyright © 2020-2023  润新知