|
#define W25Q128_NUM 0xEF4018 /* FALSH型號(hào) */
#define W25CMD_JEDEC_ID 0x9F
#define W25CMD_WERITE_ENABLE 0x06
#define W25CMD_READ_STATUS 0x05 /* 讀狀態(tài)寄存器 用來(lái)判斷busy */
#define W25CMD_SECTOR_ERASE 0x20
#define W25CMD_PAGE_PROGRAM 0x02
#define W25_PAGE_SIZE 256
static void W25Q128WriteEnable(void);
static u8 WaitW25Idle(void);
static void AlignmentWrite (u8 *buff, u32 addr, u16 len);
/* 讀取芯片ID */
u32 W25Q128ReadId(void)
{
u8 tempH, tempM, tempL;
SPI2_CSN_SELECT();
(void)Spi2WriteByte(W25CMD_JEDEC_ID);
(void)Spi2ReadByte(&tempH);
(void)Spi2ReadByte(&tempM);
(void)Spi2ReadByte(&tempL);
SPI2_CSN_RELASE();
return (U32)((tempH << 16) | (tempM << 8) | tempL);
}
/* 扇區(qū)擦除 */
void W25EraseSector(u32 addr)
{
W25Q128WriteEnable();
(void)WaitW25Idle();
SPI2_CSN_SELECT();
(void)Spi2WriteByte(W25CMD_SECTOR_ERASE);
(void)Spi2WriteByte((u8)(addr >> 16));
(void)Spi2WriteByte((u8)(addr >> 8));
(void)Spi2WriteByte((u8)addr);
SPI2_CSN_RELASE();
(void)WaitW25Idle();
}
/* 按頁(yè)寫(xiě)入 */
void W25PageWrite( u8 *buff, u32 addr, u16 len)
{
W25Q128WriteEnable();
(void)WaitW25Idle();
SPI2_CSN_SELECT();
(void)Spi2WriteByte(W25CMD_PAGE_PROGRAM);
(void)Spi2WriteByte((u8)(addr >> 16));
(void)Spi2WriteByte((u8)(addr >> 8));
(void)Spi2WriteByte((u8)addr);
while(len--)
{
(void)Spi2WriteByte(*buff);
buff++;
}
SPI2_CSN_RELASE();
(void)WaitW25Idle();
}
/* 對(duì)齊寫(xiě)入一定長(zhǎng)度的數(shù)據(jù) */
static void AlignmentWrite (u8 *buff, u32 addr, u16 len)
{
u8 numOfPage = len / W25_PAGE_SIZE;
u8 numOfLeave = len % W25_PAGE_SIZE;
if (numOfPage == 0) /* 數(shù)據(jù)長(zhǎng)度不滿1頁(yè) */
{
W25PageWrite(buff, addr, W25_PAGE_SIZE);
return ;
}
while(numOfPage--)
{
W25PageWrite(buff, addr, W25_PAGE_SIZE);
buff += W25_PAGE_SIZE;
addr += W25_PAGE_SIZE;
}
if (numOfLeave == 0)
{
return;
}
W25PageWrite(buff, addr, numOfLeave);
}
/* 非對(duì)齊寫(xiě)入一定長(zhǎng)度的數(shù)據(jù) */
static void UnAlignmentWrite (u8 *buff, u32 addr, u16 len)
{
u8 numOfPage = len / W25_PAGE_SIZE;
u8 numOfLeave = len % W25_PAGE_SIZE;
u8 unAlignmentLen = W25_PAGE_SIZE - (addr % W25_PAGE_SIZE); /* 寫(xiě)完這個(gè)長(zhǎng)度的數(shù)據(jù)之后就可以對(duì)齊寫(xiě)入了*/
if (numOfPage == 0)
{
if (numOfLeave > unAlignmentLen)
{
W25PageWrite(buff, addr, unAlignmentLen);
buff += unAlignmentLen;
addr += unAlignmentLen;
W25PageWrite(buff, addr, numOfLeave - unAlignmentLen);
}
else
{
W25PageWrite(buff, addr, len);
}
return ;
}
W25PageWrite(buff, addr, unAlignmentLen); /* 寫(xiě)入不對(duì)齊的部分 */
len -= unAlignmentLen;
buff += unAlignmentLen;
addr += unAlignmentLen;
AlignmentWrite(buff, addr, len);
}
/* 寫(xiě)使能 */
static void W25Q128WriteEnable(void)
{
SPI2_CSN_SELECT();
(void)Spi2WriteByte(W25CMD_WERITE_ENABLE);
SPI2_CSN_RELASE();
}
/*
等待芯片空閑
return : 0失敗 1成功
*/
static u8 WaitW25Idle(void)
{
u8 temp;
u8 retryCnt = 0;
SPI2_CSN_SELECT();
do {
(void)Spi2WriteByte(W25CMD_READ_STATUS);
(void)Spi2ReadByte(&temp);
if (++retryCnt == 250)
{
return 0;
}
}while(temp & 0x01);
SPI2_CSN_RELASE();
return 1;
}
|
評(píng)分
-
查看全部評(píng)分
|