新闻中心

EEPW首页>嵌入式系统>设计应用> 踏踏实实搞清 stm32 SPI总线 基础和编程

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

作者: 时间:2016-11-28 来源:网络 收藏

全双工模式(BIDIMODE=0并且RXONLY=0)

当写入数据到SPI_DR寄存器(发送缓冲器)后,传输开始;

在传送第一位数据的同时,数据被并行地从发送缓冲器传送到8位的移位寄存器中,

然后按顺序被串行地移位送到MOSI引脚上;

与此同时,在MISO引脚上接收到的数据,按顺序被串行地移位进入8位的移位寄存器

中,然后被并行地传送到SPI_DR寄存器(接收缓冲器)中。

注意:也就是说,在主机模式下,发送和接收是同时进行的,所以我们发送了一个数据,也就能接收到一个数据。而STM32内部硬件是这个过程的支撑!

读一个字节,往里面发送0,外设就返回一个数据了,发送的0外设不处理(需要先写入命令生效)

#define SPI_ReadByte(SPIx)SPI_WriteByte(SPIx,0)

写一个字节就直接发送相应的字节,外设就返回一个数据了

u8 SPI_WriteByte(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;i SPI_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个模块的讲解,毕竟现在是基础哦。


上一页 1 2 下一页

关键词:stm32SPI总

评论


相关推荐

技术专区

关闭