实验是这样的,SPI用的是SPI3,所以改过来了。代码如下:
#include "spi3.h"
//SPI3初始化代码,配置为主机模式,驱动SD Card
//驱动SPI3初始化函数
void SPI3_Init(void)
{
RCC->APB2ENR|=1<<3; //PORTB时钟使能
RCC->APB2ENR|=1<<2; //PORTA时钟使能 CS用的是PA那个端口
RCC->APB1ENR|=1<<15; //SPI3时钟使能
RCC->APB2ENR|=1<<0; //AFIO
//这里只针对SPI3口初始化
GPIOB->CRL&=0XFF000FFF;
GPIOB->CRL|=0X00BBB000;//PB3,4,5复用
GPIOB->ODR|=0X7<<3; //PB3,4,5上拉
SPI3->CR1|=0<<10;//全双工模式
SPI3->CR1|=1<<9; //软件nss管理
SPI3->CR1|=1<<8; //NSS引脚上的电平,SSI
SPI3->CR1|=1<<2; //SPI主机
SPI3->CR1|=0<<11;//8bit数据格式
SPI3->CR1|=1<<1; //空闲模式下SCK为1 CPOL=1
SPI3->CR1|=1<<0; //数据采样从第二个时间边沿开始,CPHA=1
SPI3->CR1|=7<<3; //Fsck=Fcpu/256
SPI3->CR1|=0<<7; //MSBfirst
SPI3->CR1|=1<<6; //SPI设备使能
SPI3_ReadWriteByte(0xff);//启动传输
}
FLASH用的是W25X16
代码如下:
//W25X16 驱动函数
//正点原子@ALIENTEK
//4Kbytes为一个Sector
//16个扇区为1个Block
//W25X16
//容量为2M字节,共有32个Block,512个Sector
//初始化SPI FLASH的IO口
void SPI_Flash_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<3; //使能PORTB时钟
GPIOA->CRH&=0X0FFFFFFF;
GPIOA->CRH|=0X30000000; //PA15 推挽
GPIOA->ODR|=1<<15; //PA15 上拉
SPI3_Init(); //初始化SPI3
SPI3_SetSpeed(SPI_SPEED_2);//设置为36M时钟,高速模式
}
//W25X16 驱动函数
//正点原子@ALIENTEK
#define SPI_FLASH_CS PAout(15) //选中FLASH
////////////////////////////////////////////////////////////////////////////
//W25Qxx(兼容W25Xxx系列)读写
//W25Q80 ID 0XEF13
//W25Q16 ID 0XEF14
//W25Q32 ID 0XEF15
#define FLASH_ID 0XEF14 //不知我那个是W25X16是不是不是这个的ID
实验的结果就是:
提示更新字库,然后就更新了两个字库,接着提示更新成功,然后就出现如上图所以的界面,不过我重新上电或者复位之后,又开始进行字库更新。最后又是那个界面。。。军哥,这个是什么原因?