首页 > 代码库 > SPI

SPI

1. 初始化 spi端口和spi结构体 配置

CS(输出) MISOAF_PP) 
MOSI(AF_PP或者IN_FLOATING)  
CLK(AF_PP)这几根引脚

注意:开发板上的SD卡和W25X16共用SPI1 又因为SPI

总线没有仲裁所以要把不用的SPI设备的CS拉高

2.SPI_InitTypeDef   SPI_Struct

SPI_Struct.SPI_Direction   =  SPI_Direction_2Lines_FullDuplex; //两线全双工模式

SPI_Struct.SPI_Mode        =  SPI_Mode_Master;  //主模式

SPI_Struct.SPI_DataSize   =  SPI_DataSize_8b;  //数据宽度为8

SPI_Struct.SPI_CPOL       =  SPI_CPOL_High;  //空闲时电平为搞

SPI_Struct.SPI_CPHA  =  SPI_CPHA_2Edge;  //第二个下降沿开始采数据

SPI_Struct.SPI_NSS    =  SPI_NSS_Soft;  //NSS引脚为软件管理模式

SPI_Struct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;  //波特率分频值为四

SPI_Struct.SPI_FirstBit  =  SPI_FirstBit_MSB;  //高位在前

SPI_Struct.SPI_CRCPolynomial   =  7;  //校验值

SPI_Init(SPI1,&SPI_Struct);  //初始化结构体SPI1

SPI_Cmd(SPI1,ENABLE);  //使能SPI1

3.SPI8个函数

1. u8 SPI_FLASH_SendByte(u8 dat) //发送一个字节

2. u8 SPI_FLASH_ReadByte(void)   //读取一个字节

3. void SPI_FLASH_WriteEnable(void) //写使能

4. void SPI_FLASH_WaitForWriteEnd(void)//等待写完

5. void SPI_FLASH_PageWrite(u8 *pBuffer,u32 write_addr,u16 NumByteToWrite)//页器写

6. void SPI_FLASH_BufferWrite(u8 *pBuffer,u32 write_addr,u16 NumByteToWrite)//缓冲器写

7. void SPI_FLASH_BufferRead(u8 *pBuffer,u32 Read_addr,u16 NumByteToRead)//缓冲读

8. void SPI_FLASH_SectorErase(u32 Addr)

W25x16每次只能写一页 每页256个字节 擦除每次只能擦除16

W25x16中写程序的过程为

擦除要写入的扇区

把数据写入缓冲器

3在缓冲器中读数据

 

S7

 

 

S6

 

 

S5

 

 

S4

 

 

S3

 

 

S2

 

 

S1

 

 

S0

 

 

SRP

 

 

(Reservd)  

 

 

TB

 

 

BP2

 

 

BP1

 

 

BP0

 

 

WEL

 

 

BUSY

 

注意:写数据、擦除之前要判读W25x16是否为空闲状态

BUSY 忙标志位1:忙  0:闲

WEL 写保护位 1:写使能   0:写保护

BP2\BP1\BP0 块区域保护

TB

l 写数据之前 先 cs = 0写使能 再写入写指令+24个字节 写入字节 cs = 1

l 读数据之前 先 cs = 0 写入读数据指令+24个字节 接收要写的数据 cs = 1

 

SPI