📄 dataflash.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 + -