⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dataflash.c

📁 STM32_fatfs_shell_SDHC.rar
💻 C
字号:
#include "at45db161d.h"
#include "dataflash.h"

/*****下面是内部调用的接口函数******/

//从SPI口输出一字节数据
u8 spi_write(u8 data) {
	u8 i;
	/* Loop while DR register in not emplty */
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET)
		;

	/* Send byte through the SPI1 peripheral */
	SPI_I2S_SendData(SPI1, data);

	/* Wait to receive a byte */
	while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)
		;

	/* Return the byte read from the SPI bus */
	return SPI_I2S_ReceiveData(SPI1);
}

#define c_AT45DB161D_StatusWord_BusyMask   0x80//状态字忙标志位掩码
u8 DataFlash_BusyCheck(void) {
	u8 ucFlashStatusWord; //芯片状态字
	bool bReturnValue;

	ucFlashStatusWord = Get_flash_State_Value();
	if (ucFlashStatusWord & c_AT45DB161D_StatusWord_BusyMask) {
		bReturnValue = 0; //空闲态
	} else {
		bReturnValue = 1; //忙
	}
	return (bReturnValue);
}

/*****下面是为外部调用而提供的接口函数******/

void SPI_FLASH_Init(void) {
	SPI_InitTypeDef SPI_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);

	SPI_FLASH_CS_HIGH();

	SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
	SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
	SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
	SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
	SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
	SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
	SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
	SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
	SPI_InitStructure.SPI_CRCPolynomial = 7;
	SPI_Init(SPI1, &SPI_InitStructure);

	SPI_Cmd(SPI1, ENABLE);
}

//从DataFlash芯片AT45DB161D中读取一个扇区的内容到数据缓冲区

u8 DataFlash_ReadSector(u32 ulSectorNo, u8 *ucRdDataBuff) {
	u16 uii;
	u16 uiPageAddress;

	u8 bytes[2];

	uiPageAddress = (u16) ulSectorNo & 0x0FFF;
	uiPageAddress = uiPageAddress * 4;

	bytes[0] = (u8)(uiPageAddress >> 8);
	bytes[1] = (u8)(uiPageAddress & 0xFF);

	while (DataFlash_BusyCheck())
		;
	SPI_FLASH_CS_LOW();

	spi_write(0x52);

	spi_write(bytes[0]);
	spi_write(bytes[1]);
	spi_write(0x00);

	spi_write(0x00);
	spi_write(0x00);
	spi_write(0x00);
	spi_write(0x00);

	for (uii = 0; uii < 512; uii++) {
		ucRdDataBuff[uii] = spi_write(0x00);
	}

	SPI_FLASH_CS_HIGH();

	return 1;
}

u8 DataFlash_WriteSector(u32 ulSectorNo, const u8 *ucWrDataBuff) {
	u16 uiPageAddress;
	u8 bytes[2];
	u16 uii;

	uiPageAddress = (u16) ulSectorNo & 0x0FFF;
	uiPageAddress = uiPageAddress * 4;

	bytes[0] = (u8)(uiPageAddress >> 8);
	bytes[1] = (u8)(uiPageAddress & 0xFF);

	while (DataFlash_BusyCheck())
		;
	SPI_FLASH_CS_LOW();

	spi_write(0x82);

	spi_write(bytes[0]);
	spi_write(bytes[1]);
	spi_write(0x00);

	for (uii = 0; uii < 512; uii++) {
		spi_write(*ucWrDataBuff++);
	}

	SPI_FLASH_CS_HIGH();

	return 1;
}
u8 Get_flash_State_Value(void) {
	u8 ucResult;

	SPI_FLASH_CS_LOW();

	spi_write(0x57);
	ucResult = spi_write(0);

	SPI_FLASH_CS_HIGH();

	return (ucResult);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -