?? at45db081b.c
字號:
用AVR寫的1M FLASH AT45DB081B驅動程序(ZT)
zlei @ 2005-6-22 17:27:00
//來自21icbbs,cpu為atmega32
/******************************************************************************/
/* 函數名稱:void write_to_flash_byte(uchar) */
/* 功能描述:向AT45DB081B flas寫入一個字節(jié) */
/* 參數說明:cdata為待寫入的數據 */
/* 參數返回:無 */
/******************************************************************************/
void Write_To_Flash_Byte(uchar cdata)
{
uchar byte;
SPDR = cdata;
while (!(SPSR & 0x80))
; //等待寫結束
byte = SPDR;
}
/******************************************************************************/
/* 函數名稱:uchar check_flash_busy(void) */
/* 功能描述:檢查flash是否忙 */
/* 參數說明:無 */
/* 參數返回: 如果忙返回1,不忙返回0 */
/******************************************************************************/
uchar Check_Flash_Busy(void)
{
uchar busy_flag;
PORTB &=0xef; //置cs低選中
Write_To_Flash_Byte(0xd7);
Write_To_Flash_Byte(0xff); //寫字節(jié)數據,使字節(jié)數據從SO移出
busy_flag = SPDR;
PORTB |= 0x10; //置cs高不選中
if(busy_flag & 0x80)
busy_flag = 0;
else
busy_flag = 1;
return busy_flag;
}
/******************************************************************************/
/* 函數名稱:void write_buff(uchar,uint,uint) */
/* 功能描述:從datasave_buff數組向flash緩沖區(qū)buffer1或buffer2 */
/* 寫入指定數量的數據 */
/* 參數說明:Write_com為命令字0x84寫buffer1,0x87寫buffer2, */
/* buffer_offset為寫緩沖區(qū)起始地址,byte_count為 */
/* 待寫入的字節(jié)數 */
/* 參數返回: 無 */
/******************************************************************************/
void Write_Buff(uchar Write_com,uint buffer_offset,uint byte_count)
{
uint i;
PORTB &=0xef; //置cs低選中
Write_To_Flash_Byte(Write_com); //寫buffer指令
Write_To_Flash_Byte(0); //寫無關位
Write_To_Flash_Byte((uchar)(buffer_offset>>8));
Write_To_Flash_Byte((uchar)buffer_offset);
for (i=0;i<byte_count;i++) //將byte_count個字節(jié)寫入FLASH Buffer1
Write_To_Flash_Byte(Data_Buff[i]);
PORTB |= 0x10; //置cs高不選中
}
/******************************************************************************/
/* 函數名稱:void read_write_flash(uchar,uint) */
/* 功能描述: 從buffer1或buffer2向flash存貯區(qū)帶擦除或不帶擦除寫一頁 */
/* 或從flash存貯區(qū)向buffer1或buffer2寫一頁 */
/* 參數說明:Write_com為命令字0x83帶擦除buffer1到主存,0x86帶擦除 */
/* buffer2到主存,0x88不帶擦除buffe1到主存,0x89為不帶擦 */
/* 除buffer2主存,0x53為主存?zhèn)魉偷絙uffer1,0x55為主存?zhèn)? */
/* 送到buffer2,page_address為頁地址 */
/* 參數返回: 無 */
/******************************************************************************/
void Read_Write_Flash(uchar Write_com,uint page_address)
{
PORTB &=0xef; //置cs低選中
Write_To_Flash_Byte(Write_com);
page_address = page_address << 1;
Write_To_Flash_Byte((uchar)(page_address>>8));
Write_To_Flash_Byte((uchar)page_address);
Write_To_Flash_Byte(0); //寫無關位
PORTB |= 0x10; //置cs高不選中
while(Check_Flash_Busy()); //等待器件寫完結束
}
/******************************************************************************/
/* 函數名稱:void read_buff(uchar,uint,uint) */
/* 功能描述:從buffer1或buffer2向datasave_buff數組讀指定數量的數據 */
/* 參數說明:Write_com為命令字0xd4讀buffer1,0xd6讀buffer2, */
/* buffer_offset為讀緩沖區(qū)起始地址,byte_count為 */
/* 欲讀取的字節(jié)數 */
/* 參數返回: 無 */
/******************************************************************************/
void Read_Buff(uchar Readcmd,uint buffer_offset,uint count)
{
uint i;
PORTB &= 0xef; //置cs低選中
Write_To_Flash_Byte(Readcmd);
Write_To_Flash_Byte(0);
Write_To_Flash_Byte((uchar)(buffer_offset>>8));
Write_To_Flash_Byte((uchar)buffer_offset);
Write_To_Flash_Byte(0);
for(i=0;i<count;i++)
{
Write_To_Flash_Byte(0xff);
Data_Buff[i]=SPDR;
}
PORTB |= 0x10; //置cs高不選中
}
/******************************************************************************/
/* 函數名稱:void read_flash(uchar,uint,uint,uint) */
/* 功能描述:從flash指定頁指定頁內起始地址讀取指定數量的數據字節(jié)到 */
/* datasave_buff數組 */
/* 參數說明:Write_com為命令字0xd2讀命令,page_offset為頁內起始地址 */
/* page_address為頁地址,count為欲讀取的字節(jié)數 */
/* 參數返回: 無 */
/******************************************************************************/
void Read_Flash(uchar Readcmd,uint page_offset,uint page_address,uint count)
{
uint pa,i;
uchar byte;
pa=0;
page_address <<=1;
pa = page_offset>>8;
page_address |= pa;
PORTB &= 0xef; //置cs低選中
Write_To_Flash_Byte(Readcmd);
Write_To_Flash_Byte((uchar)(page_address>>8));
Write_To_Flash_Byte((uchar)page_address);
Write_To_Flash_Byte((uchar)page_offset);
for(byte=0;byte<4;byte++)
{
Write_To_Flash_Byte(0);
}
for(i=0;i<count;i++)
{
Write_To_Flash_Byte(0xff); //寫字節(jié)數據,使字節(jié)數據從SO移出
Data_Buff[i] = SPDR;
}
PORTB |= 0x10; //置cs高不選中
}
SPI控制字為:SPCR = 0x5f;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -