SPI相关知识总结

一、SPI

1.1SPI概念及通讯方式

SPI:串行外设设备接口(Serial Peripheral Interface),是一种高速的,全双工,同步的通信总线
在这里插入图片描述
在这里插入图片描述

2.1 SPI框图

在这里插入图片描述

1.3.数据发送与接收流程

#

1.4 SPI工作模式

1)时钟极性(CPOL)
没有数据传输时时钟线的空闲状态电平
0:SCK在空闲状态保持低电平
1:SCK在空闲状态保持高电平
2)时钟相位(CPHA)
时钟线在第几个时钟边沿采样数据
0:SCK的第一(奇数)边沿进行数据位采样,数据在第一个时钟边沿被锁存
1:SCK的第二(偶数)边沿进行数据位采样,数据在第二个时钟边沿被锁存
3)四种模式
在这里插入图片描述

1.5 寄存器配置

在这里插入图片描述
1)SPI_CR1
在这里插入图片描述
在这里插入图片描述
2)SPI_SR
在这里插入图片描述
3)SPI_DR
在这里插入图片描述

1.6 SPI重要结构体

SPI_HandleTypeDef
{
SPI_TypeDef *Instance
SPI_InitTypeDef Init
}

SPI_InitTypeDef
{
uint32_t Mode /* SPI模式(主机) /
uint32_t Direction /
工作方式(全双工) /
uint32_t DataSize /
帧格式(8位) /
uint32_t CLKPolarity /
时钟极性(CPOL = 0) /
uint32_t CLKPhase /
时钟相位 (CPHA = 0)/
uint32_t NSS /
SS控制方式(软件) /
uint32_t BaudRatePrescaler /
SPI波特率预分频值 /
uint32_t FirstBit /
数据传输顺序(MSB)/
uint32_t TIMode /
帧格式:Motorola / TI /
uint32_t CRCCalculation /
设置硬件CRC校验 /
uint32_t CRCPolynomial /
设置CRC校验多项式 */
}

2 NOR FLASH

2.1 FLASH

FLASH是有一个物理特性:只能写0,不能写1,写1靠擦除(按“扇区/块”擦除)
FLASH主要有NOR Flash和NAND Flash两种类型

2.2NM25Q128

属于NOR FLASH中的一种,支持模式0(CPOL = 0 , CPHA = 0)和模式3(CPOL = 1, CPHA = 1),数据长度8位大小,先发高位,再发低位.
在这里插入图片描述
在这里插入图片描述

2.3 常用指令

在这里插入图片描述

2.4 读时序 Read Data Bytes(03H)

在这里插入图片描述
代码实例
NORFLASH_CS(0);

/* 1 发送读命令 */
spi2_read_write_byte(0x03);

/* 2 发送地址 */
spi2_read_write_byte(addr >> 16);
spi2_read_write_byte(addr >> 8);
spi2_read_write_byte(addr);

/* 3 读取数据 */
rec_data = spi2_read_write_byte(0xFF);

NORFLASH_CS(1);

2.6 擦除时序 (20H)在这里插入图片描述

/* 1 写使能 */
NORFLASH_CS(0);
spi2_read_write_byte(0x06);
NORFLASH_CS(1);

/* 2 等待空闲 */
while(norflash_rd_sr1()&0x01);

/* 3 发送扇区擦除指令 */
NORFLASH_CS(0);
spi2_read_write_byte(0x20);

/* 4 发送地址 */
spi2_read_write_byte(addr >> 16);
spi2_read_write_byte(addr >> 8);
spi2_read_write_byte(addr);
NORFLASH_CS(1);

/* 5 等待空闲 */
while(norflash_rd_sr1()&0x01);

2.7 写时序(02H)

在这里插入图片描述
/* 1 擦除扇区 */
norflash_erase_sector(addr);

/* 2 写使能 */
NORFLASH_CS(0);
spi2_read_write_byte(0x06);
NORFLASH_CS(1);

/* 3 发送页写指令 */
NORFLASH_CS(0);
spi2_read_write_byte(0x02);

/* 4 发送地址 */
spi2_read_write_byte(addr >> 16);
spi2_read_write_byte(addr >> 8);
spi2_read_write_byte(addr);

/* 5 要写入的数据 */
spi2_read_write_byte(data);
NORFLASH_CS(1);

/* 6 等待写入完成(等待空闲) */
while(norflash_rd_sr1()&0x01);

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m0_libinc++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值