spi2 dma读取flash stm32f407

该代码展示了如何使用STM32的SPI接口结合DMA进行Flash的读写操作。主要功能包括:选中/取消选中Flash、等待写入完成、启用写入、设置写状态、读取和写入Flash状态、擦除扇区、写入和读取数据。代码中定义了SPI、DMA的初始化和配置,以及中断处理函数。

源代码
SPI.C

#include “spi.h”
#include <stdbool.h>
static volatile int g_rx_flag = 0;
static volatile int g_tx_flag = 0;
static void spi_chip_select(bool select)
{
//spi_do_delay(5);
if (select == true)
{
GPIOB->BSRRH = GPIO_Pin_12;
}
else
{
GPIOB->BSRRL = GPIO_Pin_12;
}
//spi_do_delay(5);
}
static void spi_wait_rx(void)
{
while(!g_rx_flag);
g_rx_flag = 0;
}

static void spi_post_rx(void)
{
g_rx_flag = 1;
}

static void spi_wait_tx(void)
{
while(!g_tx_flag);
g_tx_flag = 0;
}

static void spi_post_tx(void)
{
g_tx_flag = 1;
}

static void spi_do_delay(uint16_t n)
{
uint16_t t = n;
while (-- t);
}
uint8_t spi_byte_transfer(uint8_t Dat)
{
while ((SPI2->SR & SPI_I2S_FLAG_TXE) == 0);
SPI2->DR = Dat;
while ((SPI2->SR & SPI_I2S_FLAG_RXNE) == 0);
return ((uint8_t)(SPI2->DR));
}

uint8_t spi_readbyte(void)
{
return spi_byte_transfer(0xA5);
}

/* ?? GPIO6 ?? CS ??
*/
void flash_wait_write(void)
{
uint8_t status = 0;

spi_chip_select(true);
spi_byte_transfer(0x05);
do
{
status = spi_byte_transfer(0xA5);
} while (status & 0x01);

spi_chip_select(false);
}

void flash_enable_write(void)
{
spi_chip_select(true);
spi_byte_transfer(0x06);
spi_chip_select(false);
}

void flash_write_status(uint8_t value)
{
flash_enable_write();

spi_chip_select(true);
spi_byte_transfer(0x01);
spi_byte_transfer(value);

spi_chip_select(false);

flash_wait_write();
}

void flash_disable_write(void)
{
flash_write_status(0);
}

uint32_t flash_read_identify(void)
{
uint8_t byte0 = 0, byte1 = 0, byte2 = 0;

spi_chip_select(true);

spi_byte_transfer(0x9F);
byte0 = spi_byte_transfer(0xA5);
byte1 = spi_byte_transfer(0xA5);
byte2 = spi_byte_transfer(0xA5);

spi_chip_select(false);

return ((byte0 << 16) | (byte1 << 8) | (byte2 << 0));
}

void flash_erase_sector(uint32_t SectorAddr)
{
flash_enable_write();

spi_chip_select(true);
spi_byte_transfer(0x20);
spi_byte_transfer((SectorAddr & 0xFF0000) >> 16);
spi_byte_transfer((Sector

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值