一、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);