微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 踏踏实实搞清 stm32 SPI总线 基础和编程

踏踏实实搞清 stm32 SPI总线 基础和编程

时间:11-28 来源:互联网 点击:

teByte(SPI_TypeDef* SPIx,u8 byte);

//spi 写一个字节...................................................................
u8 SPI_WriteByte(SPI_TypeDef* SPIx,u8 Byte)
{
while((SPIx->SR&SPI_I2S_FLAG_TXE)==RESET); //等待发送区空
SPIx->DR=Byte; //发送一个byte
while((SPIx->SR&SPI_I2S_FLAG_RXNE)==RESET);//等待接收完一个byte
return SPIx->DR; //返回收到的数据
}


void M25P16_Write_Enable(void)
{
Select_Flash();
SPI_Flash_Write(WRITE_ENABLE);
NotSelect_Flash();
}

void M25P16_Read_Id(u8 * id)
{
u8 i;

Select_Flash();
SPI_Flash_Write(READ_ID);

for(i=0;i<20;i++)
{
id[i] = SPI_Flash_Read();
}

NotSelect_Flash();
}

void M25P16_Write_Status_Reg(u8 reg)
{
Select_Flash();
SPI_Flash_Write(WRITE_STAUS_REG);
SPI_Flash_Write(reg);
NotSelect_Flash();
}

void M25P16_Read_Data(u32 addr,u32 len,u8 *buf)
{
u32 i;
Select_Flash();
SPI_Flash_Write(READ_DATA);
SPI_Flash_Write((addr>>16) & 0xff);
SPI_Flash_Write((addr>>8) & 0xff);
SPI_Flash_Write(addr & 0xff);
for(i=0;i{
buf[i]=SPI_Flash_Read();
}
NotSelect_Flash();
}

//页编程函数,页编程前一定要进行页擦除!!!
void M25P16_Page_Program(u32 addr,u16 len,u8 *buf)
{
u32 i;

M25P16_Write_Enable();
Select_Flash();
SPI_Flash_Write(PAGE_PROGRAM);
SPI_Flash_Write((addr>>16) & 0xff);
SPI_Flash_Write((addr>>8) & 0xff);
SPI_Flash_Write(addr & 0xff);

for(i=0;iSPI_Flash_Write(buf[i]);

NotSelect_Flash();

while(M25P16_Read_Status_Reg()&0x01);
}

以上函数搞懂了,特别市红色部分标注的为重点,对于spi也就基本清楚了,这些也算是最底层的函数了,提供基本的API供以后文件系统或其它地方使用。

----------------------------------------------------------------------------------------------

最后补上一些文件框架的说明

首先我们把最底层的SPI初始化写上,函数如下:


可见有芯片自带SPI模块 有给mp3芯片的,有给flash的,还有给无线网络的,还有给软件模拟spi时序供给触摸屏的控制器的,然后我们把这个.c文件配套的.h文件给下面具体的函数包含,就能正确的选取和使用了,当这些具体功能的函数写好了后,对应得.h函数就又继续给更高级别的应用层使用。

今天先就介绍下spi_flash模块了,等天补上其它3个模块的讲解,毕竟现在是基础哦。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top