mx25l1606e驱动程序----基于stm32

文章目录

  • mx25l1606e驱动程序----基于stm32
    • spi驱动头文件
    • spi驱动源码
    • mx25l1606e驱动头文件
    • mx25l1606e驱动源码

mx25l1606e驱动程序----基于stm32

spi驱动头文件

spi.h

#ifndef __SPI_H__
#define __SPI_H__
#include "stm32f10x.h"  

#define SPI_FLASH                               		  SPI2
#define SPI_FLASH_CLK                               	  RCC_APB1Periph_SPI2

#define SPI_FLASH_PIN_NSS_PORT                            GPIOB
#define SPI_FLASH_PIN_NSS_PORT_CLK                        RCC_APB2Periph_GPIOB
#define SPI_FLASH_PIN_NSS  								  GPIO_Pin_12

#define SPI_FLASH_PIN_SCK_PORT                            GPIOB
#define SPI_FLASH_PIN_SCK_PORT_CLK                        RCC_APB2Periph_GPIOB
#define SPI_FLASH_PIN_SCK                                 GPIO_Pin_13

#define SPI_FLASH_PIN_MISO_PORT                           GPIOB
#define SPI_FLASH_PIN_MISO_PORT_CLK                       RCC_APB2Periph_GPIOB
#define SPI_FLASH_PIN_MISO                                GPIO_Pin_14

#define SPI_FLASH_PIN_MOSI_PORT                           GPIOB
#define SPI_FLASH_PIN_MOSI_PORT_CLK                       RCC_APB2Periph_GPIOB
#define SPI_FLASH_PIN_MOSI                                GPIO_Pin_15

#define SPI_FLASH_CS_LOW     				GPIO_WriteBit( SPI_FLASH_PIN_NSS_PORT, SPI_FLASH_PIN_NSS, Bit_RESET )
#define SPI_FLASH_CS_HIGH     				GPIO_WriteBit( SPI_FLASH_PIN_NSS_PORT, SPI_FLASH_PIN_NSS, Bit_SET )

#define DUMMY_BYTE            0xFF//无效字节(参考手册)


void spi_io_init(SPI_TypeDef* SPIx );
uint8_t spi_recv_byte( SPI_TypeDef* SPIx);
uint8_t spi_send_byte( SPI_TypeDef* SPIx, uint8_t outData );

#endif //__SPI_H__

spi驱动源码

spi.c

#include "spi.h"
//spiIO初始化
//SPIx:对应的spi
void spi_io_init(SPI_TypeDef* SPIx )
{
   
	SPI_InitTypeDef SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
	
	if(SPIx == SPI_FLASH)
	{
   
		/* Enable peripheral clocks --------------------------------------------------*/
		RCC_APB2PeriphClockCmd( SPI_FLASH_PIN_MISO_PORT_CLK | SPI_FLASH_PIN_MOSI_PORT_CLK |
								SPI_FLASH_PIN_SCK_PORT_CLK | SPI_FLASH_PIN_NSS_PORT_CLK, ENABLE );
		RCC_APB1PeriphClockCmd( SPI_FLASH_CLK, ENABLE );	
		//禁用JTAG
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_AFIO, ENABLE );
		GPIO_PinRemapConfig( GPIO_Remap_SWJ_JTAGDisable, ENABLE );
		
		/* GPIO configuration ------------------------------------------------------*/
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

		GPIO_InitStructure.GPIO_Pin = SPI_FLASH_PIN_SCK;
		GPIO_Init( SPI_FLASH_PIN_SCK_PORT, &GPIO_InitStructure );

		GPIO_InitStructure.GPIO_Pin = SPI_FLASH_PIN_MOSI;
		GPIO_Init( SPI_FLASH_PIN_MOSI_PORT, &GPIO_InitStructure );

		GPIO_InitStructure.GPIO_Pin = SPI_FLASH_PIN_MISO;
//		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
		GPIO_Init( SPI_FLASH_PIN_MISO_PORT, &GPIO_InitStructure );
		
		GPIO_InitStructure.GPIO_Pin = SPI_FLASH_PIN_NSS;
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //片选的输出方式
		GPIO_Init( SPI_FLASH_PIN_NSS_PORT, &GPIO_InitStructure );
		GPIO_WriteBit( SPI_FLASH_PIN_NSS_PORT, SPI_FLASH_PIN_NSS, Bit_SET );
	

		/* SPI_FLASH Config -------------------------------------------------------------*/
		SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
		SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
		SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
		SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; /*CPOL=1,CPHA=1,模式3*/ 
		SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
		SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
		SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // 72/4 MHz
	//	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
		SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
		SPI_InitStructure.SPI_CRCPolynomial = 7;
		SPI_Init( SPI_FLASH, &SPI_InitStructure );
		SPI_Cmd( SPI_FLASH, ENABLE );
	} 
}


//spi读写函数
//SPIx:对应的spi
//outData:待输出的数据
uint8_t spi_send_byte( SPI_TypeDef* SPIx, uint8_t outData )
{
   
    /* Send SPIy data */
	u8 retry =0;

	while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET) //等待发送区空
	{
   
		;
	}
    SPI_I2S_SendData( SPIx, outData );
	
	retry =0;
    while( SPI_I2S_GetFlagStatus( SPIx, SPI_I2S_FLAG_RXNE ) == RESET )
	{
   
		;
	}
    return SPI_I2S_ReceiveData( SPIx );
}
//spi读写函数
//SPIx:对应的spi
//outData:待输出的数据
uint8_t spi_recv_byte( SPI_TypeDef* SPIx)
{
   
    /* Send SPIy data */
	u8 retry =0;

	while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET) //等待发送区空
	{
   
		;
	}
    SPI_I2S_SendData( SPIx, DUMMY_BYTE );
	
	retry =0;
    while( SPI_I2S_GetFlagStatus( SPIx, SPI_I2S_FLAG_RXNE ) == RESET )
	{
   
		;
	}
    return SPI_I2S_ReceiveData( SPIx );
}

mx25l1606e驱动头文件

mx25l1606e.h

#ifndef _MX25L1606_H_
#define _MX25L1606_H_
/*======================&#

你可能感兴趣的:(芯片驱动程序,stm32,flash,驱动程序)