#include "spi.h"
/**************************************
* @brief Configures the SysTem SPI2 *
* @param None *
* @retval None *
**************************************/
void SPI2_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
/*PORTB时钟使能,SPI2时钟使能*/
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
/*设置PB13/14/15复用推挽输出,初始化GPIOB*/
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);
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);
GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
/*设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工*/
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
/*设置SPI工作模式:设置为主SPI*/
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
/*设置SPI的数据大小:SPI发送接收8位帧结构*/
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
/*串行同步时钟的空闲状态为高电平*/
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
/*串行同步时钟的第二个跳变沿(上升或下降)数据被采样*/
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
/*NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制*/
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
/*定义波特率预分频的值:波特率预分频值为4,spi_clk=36M/4=9M*/
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
/*指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始*/
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
/*CRC值计算的多项式*/
SPI_InitStructure.SPI_CRCPolynomial = 7;
/*根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器*/
SPI_Init(SPI2, &SPI_InitStructure);
/*使能SPI外设*/
SPI_Cmd(SPI2, ENABLE);
}
/**************************************
* @brief 发送写使能操作 *
* @param None *
* @retval None *
**************************************/
void SPI_FLASH_WriteEnable(void)
{
/*SPI_CS=0*/
SPI_FLASH_CS_LOW();
/*Send 0x06h*/
SPI_FLASH_SendByte(WriteEnable);
/*SPI_CS=1*/
SPI_FLASH_CS_HIGH();
}
/**************************************
* @brief 发送写失能操作 *
* @param None *
* @retval None *
**************************************/
void SPI_FLASH_WriteDisable(void)
{
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(WriteDisable);
SPI_FLASH_CS_HIGH();
}
/**************************************
* @brief 读状态寄存器操作 *
* @param None *
* @retval 返回状态码 *
**************************************/
u8 SPI_Flash_ReadStatusRegister(void)
{
static u8 StatusRegister = 0;
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(ReadStatusRegister);
StatusRegister = SPI_FLASH_ReceiveByte();
SPI_FLASH_CS_HIGH();
return StatusRegister;
}
/**************************************
* @brief 写状态寄存器操作 *
* @param None *
* @retval None *
**************************************/
void SPI_Flash_WriteStatusRegister(u8 Byte)
{
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(WriteStatusRegister);
SPI_FLASH_SendByte(Byte);
SPI_FLASH_CS_HIGH();
}
/**************************************
* @brief 发送一个字节操作 *
* @param 输入一个8位数据字节 *
* @retval None *
**************************************/
u8 SPI_FLASH_SendByte(u8 byte)
{
/*检查指定的SPI标志位设置与否:发送缓存空标志位*/
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);
/*通过外设SPIx发送一个数据*/
SPI_I2S_SendData(SPI2, byte);
/*检查指定的SPI标志位设置与否:接受缓存非空标志位*/
/*为了确保这个字节已经发送出去,因为发送和接收是并行同步进行的,就意味着发送一个字节同时也接受一个字节*/
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/*返回通过SPIx最近接收的数据*/
return SPI_I2S_ReceiveData(SPI2);
}
/**************************************
* @brief 接收一个字节操作 *
* @param 由于SPI通讯从设备不提供时钟,*
* 所以利用发送数据提供时钟 *
* @retval 返回一个字节 *
**************************************/
u8 SPI_FLASH_ReceiveByte(void)
{
return (SPI_FLASH_SendByte(Dummy_Byte));
}
/**************************************
* @brief 读数据操作 *
* @param 数据地址输入 *
* @retval 返回数据 *
**************************************/
u8 SPI_FLASH_ByteRead(u32 ReadAddr)
{
static u32 Temp = 0;
SPI_FLASH_CS_LOW();
/*发送读数据命令*/
SPI_FLASH_SendByte(Read_Data);
/*发送数据地址A23-A0*/
/*发送地址高8位,A23-A16*/
SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
/*发送地址中8位,A15-A8*/
SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
/*发送地址低8位,A7-A0*/
SPI_FLASH_SendByte(ReadAddr & 0xFF);
/*读取一个数据*/
Temp = SPI_FLASH_ReceiveByte();
/*Temp = SPI_FLASH_SendByte(Dummy_Byte);*/
SPI_FLASH_CS_HIGH();
return Temp;
}
/**************************************
* @brief 快速读数据操作 *
* @param 数据地址输入 *
* @retval 返回数据 *
**************************************/
u8 SPI_FLASH_FasttRead(u32 ReadAddr)
{
static u32 Temp = 0;
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(FastReadData);
SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
SPI_FLASH_SendByte(ReadAddr & 0xFF);
SPI_FLASH_SendByte(Dummy_Byte);
Temp = SPI_FLASH_ReceiveByte();
/*Temp = SPI_FLASH_SendByte(Dummy_Byte);*/
SPI_FLASH_CS_HIGH();
return Temp;
}
/**************************************
* @brief 读取多个数据操作 *
* @param 数据存储指针,数据地址输入, *
* 数据返回个数 *
* @retval 返回数据 *
**************************************/
void SPI_FLASH_BufferRead(u8* pBuffer, u32 ReadAddr, u16 NumByteToRead)
{
SPI_FLASH_CS_LOW();
SPI_FLASH_SendByte(Read_Data);
SPI_FLASH_SendByte((ReadAddr & 0xFF0000) >> 16);
SPI_FLASH_SendByte((ReadAddr& 0xFF00) >> 8);
SPI_FLASH_SendByte(ReadAddr & 0xFF);
while(NumByteToRead--)
{
*pBuffer = SPI_FLASH_ReceiveByte();
pBuffer++;
}
SPI_FLASH_CS_HIGH();
}
/**************************************
* @brief 扇区数据擦除操作 *
* @param 扇区数据地址 *
* @retval None *
**************************************/
void SPI_FLASH_SectorErase(u32 SectorAddr)
{
SPI_FLASH_WriteEnable();
SPI_FLASH_CS_LOW();
/*发送扇区擦除命令*/
SPI_FLASH_SendByte(SectorErace);
SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
SPI_FLASH_SendByte(SectorAddr & 0xFF);
SPI_FLASH_CS_HIGH();
SPI_FLASH_WaitForWriteEnd();
}
/**************************************
* @brief 块区数据擦除操作 *
* @param 块区数据地址 *
* @retval None *
**************************************/
void SPI_FLASH_BulkErase(u32 BlockAddr)
{
SPI_FLASH_WriteEnable();
SPI_FLASH_CS_LOW();
/*发送块区擦除命令*/
SPI_FLASH_SendByte(BlockErace);
SPI_FLASH_SendByte((BlockAddr & 0xFF0000) >> 16);
SPI_FLASH_SendByte((BlockAddr & 0xFF00) >> 8);
SPI_FLASH_SendByte(BlockAddr & 0xFF);
SPI_FLASH_CS_HIGH();
SPI_FLASH_WaitForWriteEnd();
}
/**************************************
* @brief 整片数据擦除操作 *
* @param None *
* @retval None *
******************************
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
spi通讯.zip (2个子文件)
spiͨѶ
spi.h 3KB
spi.c 15KB
共 2 条
- 1
资源评论
ChinaMaken
- 粉丝: 2
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功