#include "./flash/bsp_spi_flash.h"
#include "./usart/bsp_usart.h"
static __IO uint32_t SPITimeout = SPIT_LONG_TIMEOUT;
static uint32_t SPI_TIMEOUT_UserCallback(uint8_t errorCode);
static void SPI_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能与 SPI 有关的时钟 */
FLASH_SPI_APBxClock_FUN ( FLASH_SPI_CLK, ENABLE );
FLASH_SPI_GPIO_APBxClock_FUN ( FLASH_SPI_GPIO_CLK, ENABLE );
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_SCK_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(FLASH_SPI_SCK_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MOSI_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(FLASH_SPI_MOSI_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_MISO_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(FLASH_SPI_MISO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = FLASH_SPI_CS_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(FLASH_SPI_CS_PORT , &GPIO_InitStructure);
FLASH_SPI_CS_HIGH;
}
/**
* @brief SPI 工作模式配置
* @param 无
* @retval 无
*/
static void SPI_Mode_Config(void)
{
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CRCPolynomial = 0;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
/* SPI 初始化 */
SPI_Init(FLASH_SPIx, &SPI_InitStructure);
/* 使能 SPI */
SPI_Cmd(FLASH_SPIx, ENABLE);
}
void SPI_FLASH_Init(void)
{
SPI_GPIO_Config();
SPI_Mode_Config();
}
uint8_t SPI_FLASH_Send_Byte(uint8_t data)
{
//检查并等待TX缓冲区为空
while(SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_TXE)==RESET);
{
if((SPITimeout--)==0)
{
return SPI_TIMEOUT_UserCallback(0);
}
}
//程序到此,TX缓冲区已空
SPI_I2S_SendData(FLASH_SPIx, data);
//检查并等待RX缓冲区为非空
while(SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_RXNE)==RESET);
{
if((SPITimeout--)==0)
{
return SPI_TIMEOUT_UserCallback(0);
}
}
//程序到此说明数据发送完毕,并接收到一个字节
return SPI_I2S_ReceiveData(FLASH_SPIx);
}
uint8_t SPI_FLASH_Read_Byte(void)
{
return SPI_FLASH_Send_Byte(DUMMY);
}
uint32_t SPI_Read_ID(void)
{
uint32_t flash_id;
FLASH_SPI_CS_LOW;
SPI_FLASH_Send_Byte(READ_JEDEC_ID);
flash_id = SPI_FLASH_Read_Byte();
flash_id <<=8;
flash_id |=SPI_FLASH_Read_Byte();
flash_id <<=8;
flash_id |=SPI_FLASH_Read_Byte();
FLASH_SPI_CS_HIGH;
return flash_id;
}
static uint32_t SPI_TIMEOUT_UserCallback(uint8_t errorCode)
{
/* Block communication and all processes */
FLASH_ERROR(&quot;I2C 等待超时!errorCode = %d&quot;,errorCode);
return 0;
}
以上是SPI的C文件
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#ifndef __SPI_FLASH_H
#define __SPI_FLASH_H
#include &quot;stm32f10x.h&quot;
#define FLASH_SPIx SPI1
#define FLASH_SPI_APBxClock_FUN RCC_APB2PeriphClockCmd
#define FLASH_SPI_CLK RCC_APB2Periph_SPI1
#define FLASH_SPI_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define FLASH_SPI_GPIO_CLK (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC)
#define FLASH_SPI_SCK_PORT GPIOA
#define FLASH_SPI_SCK_PIN GPIO_Pin_5
#define FLASH_SPI_MOSI_PORT GPIOA
#define FLASH_SPI_MOSI_PIN GPIO_Pin_7
#define FLASH_SPI_MISO_PORT GPIOA
#define FLASH_SPI_MISO_PIN GPIO_Pin_6
#define FLASH_SPI_CS_PORT GPIOC
#define FLASH_SPI_CS_PIN GPIO_Pin_0
#define FLASH_SPI_CS_HIGH GPIO_SetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN);
#define FLASH_SPI_CS_LOW GPIO_SetBits(FLASH_SPI_CS_PORT, FLASH_SPI_CS_PIN);
#define DUMMY 0x00
#define READ_JEDEC_ID 0x9f
/*等待超时时间*/
#define SPIT_FLAG_TIMEOUT ((uint32_t)0x1000)
#define SPIT_LONG_TIMEOUT ((uint32_t)(10 * SPIT_FLAG_TIMEOUT))
/*信息输出*/
#define FLASH_DEBUG_ON 0
#define FLASH_INFO(fmt,arg...) printf(&quot;<<-FLASH-INFO->> &quot;fmt&quot;\n&quot;,##arg)
#define FLASH_ERROR(fmt,arg...) printf(&quot;<<-FLASH-ERROR->> &quot;fmt&quot;\n&quot;,##arg)
#define FLASH_DEBUG(fmt,arg...) do{\
if(FLASH_DEBUG_ON)\
printf(&quot;<<-FLASH-DEBUG->> [%d]&quot;fmt&quot;\n&quot;,__LINE__, ##arg);\
}while(0)
uint32_t SPI_Read_ID(void);
void SPI_FLASH_Init(void);
#endif
以上是SPI的H文件
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
#include &quot;stm32f10x.h&quot;
#include &quot;./led/bsp_led.h&quot;
#include &quot;./usart/bsp_usart.h&quot;
#include &quot;./flash/bsp_spi_flash.h&quot;
#include <string.h>
/**
* @brief 主函数
* @param 无
* @retval 无
*/
int main(void)
{
uint32_t id;
USART_Config();
SPI_FLASH_Init();
printf(&quot;\r\n 这是一个SPI_FLASH_ID读写测试例程 \r\n&quot;);
id= SPI_Read_ID();
printf(&quot;\r\n id=0x%x \r\n&quot;,id);
}
以上是主函数
、、、、、、、、、、、、、、、、、、、、、、、、、、、 |