STM32F10X SPI操作flash MX25L64读写数据
简单的一种应用,ARM芯片作为master,flash为slaver,实现单对单通信。ARM主控芯片STM32F103,flash芯片为MACRONIX INTERNATIONAL的MX25L6465E,64Mbit。
SPI应该是嵌入式外围中最简单的一种应用了吧!一般SPI应用有两种方法:软件仿真,手动模拟产生时序和应用主控芯片的SPI控制器。
一般采用第二种方法比较好,比较稳定。应用主控芯片的SPI控制器,要点:正确的初始化SPI、操作SPI各寄存器和正确理解flash的时序。下面是过程,采用的是STM32F10X自带的库函数
1、初始化:void SpiFlashInitialzation(void);
要知道硬件是怎么连接的,是SPI1还是SPI2连接到flash中去,通过连接图知道我们要操作的是SPI2。初始化大概3个部分,配置时钟;配置GPIO;配置SPI2。这里要注意的是,CS片选脚是作为普通的GPIO来使用,输出方式为“推挽式输出”,其他CLK,MISO,MOSI为“复用功能推挽式输出”;
代码:
- void SpiFlashInitialzation(void)
- {
- /*初始化的SPI,GPIO结构体*/
- SPI_InitTypeDef SPI_InitStructure;
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE); /*在RCC_APB1ENB中使能SPI2时钟(位14)*/
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);/*因为与SPI2相关的4个引脚和GPIOB相*/
- /*关,GPIOB时钟(位3),这句现在还不 */
- /*确定要不要,待调试时再确定 */
- /*上面这一句是必须的,因为CS脚是当做GPIO来使用的,2011-01-30调试*/
- /*配置SPI_FLASH_CLK(PB13),SPI_FLASH_MISO(PB14),SPI_FLASH_MOSI(PB15)*/
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; /*复用功能推挽式输出*/
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init( GPIOB, &GPIO_InitStructure);
- /*配置输入SPI_FLASH_CS(PB12)*/
- GPIO_InitStructure.GPIO_Pin=GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; /*推挽式输出*/
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_Init( GPIOB, &GPIO_InitStructure);
- SPI_FLASH_CS_SET; /*不选flash*/
- /* SPI2配置 增加于2010-01-13*/