亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? at45db041d._c

?? 用ATMEGA16的硬件SPI驅動AT45DB041D
?? _C
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************
*本驅動只用于AT45DB041D默認頁大小為264的情況
*頁改為256后可以有些不同
*頁的大小只能改一次(從264改為256),不能改回
************************************************************/
#include <iom16v.h>
#include <macros.h>
#include "AT45DB041D.h"
#include "eeprom.h"

/************************************************************
*SPI宏定義
************************************************************/
#define  SPI_DDR    	 DDRB
#define  SPI_PORT   	 PORTB

#define  RESET           3
#define  SS              4
#define  MOSI            5
#define  MISO            6
#define  SCK             7

/************************************************************
*延時函數
************************************************************/
void DF_Delay(unsigned int n)
{
  unsigned int i;
  unsigned int j;
  for(i=0;i<n;i++)
  {
    for(j=0;j<255;j++)
	{
	  asm("nop");
	}
  }
}
/************************************************************
*Init SPI Port
************************************************************/
void SPI_Port_Init(void)
{
  SPI_DDR  |= ((1<<SS)|(1<<SCK)|(1<<MOSI));//設為輸出
  SPI_DDR  &=~ (1<<MISO);                  //設為輸入
  SPI_PORT |= (1<<SS)|(1<<SCK)|(1<<MOSI);  //輸出高電平
  SPI_PORT |= (1<<MOSI);				   //上拉

  SPI_DDR|=(1<<RESET);                     //復位引腳設為輸出
}
/************************************************************
*初始化SPI
************************************************************/
void SPI_Init(void)//最高能到fOSC/16
{
  SPI_Port_Init();
  
  //SPI使能, master模式, MSB 前,  SPI 模式 3, SCK頻率Fcl/4 平時SCK為高電平
  SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPHA)|(1<<CPOL);
  //頻率加倍
  SPSR |= (1<<SPI2X);
}
/************************************************************
*使能SPI
************************************************************/
void SPI_Start(void)
{
 	 SPCR |= (1<<SPE);
}
/************************************************************
*禁止SPI
************************************************************/
void SPI_Stop(void)
{
 	 SPCR &=~ (1<<SPE);
}
/************************************************************
*SPI send a Byte
************************************************************/
void SPI_Write_Byte(unsigned char cData)
{
  SPDR = cData;                //write data
  while(!(SPSR & (1<<SPIF)));  //wait write ok
}
/************************************************************
*SPI send  Bytes
************************************************************/
void SPI_Write_Bytes(unsigned char *cData,unsigned int DataLen)
{
  unsigned int i;
  for(i=0;i<DataLen;i++)
  {
    SPDR = *(cData+i);           //write data
	while(!(SPSR & (1<<SPIF)));  //wait write ok
  }
}
/************************************************************
*SPI Read char
************************************************************/
unsigned char SPI_Read_Byte(unsigned char cData)
{
  SPDR = cData;                //write data
  while(!(SPSR & (1<<SPIF)));  //wait receive ok
  return SPDR;                 //返回數據
}
/************************************************************
*使能FLASH(低電平使能)
************************************************************/
void Enable_DFLASH(void)
{
  unsigned char i=255;
  while(i--);			//延長上一次高電平時間
  SPI_PORT&=~(1<<SS);
}
/************************************************************
*禁止FLASH(高電平禁止)
************************************************************/
void Disable_DFLASH(void)
{
  unsigned char i=255;
  SPI_PORT|=(1<<SS);	
  while(i--);			//延長高電平時間
}
/************************************************************
*讀取FLASH內部狀態寄存器
*Bit 7:Ready/busy status (1:no busy ; 0:busy)
*Bit 6:Compare (1: no matche ; 0:matche) 最近的一次比較結果
*Bit 0:PAGE SIZE (1:256 bytes ; 0:264 bytes)
************************************************************/
unsigned char DF_Read_status_Register(void)
{
  unsigned char rData=0;
  Enable_DFLASH();

  SPI_Write_Byte(Status_Register_Opcode);//write opcode

  rData = SPI_Read_Byte(0x00);//read device's status

  Disable_DFLASH();

  return rData;
}
/************************************************************
*讀取FLASH的頁大小
*返回1表示每一頁的大小為264 bytes,否則為256 bytes
************************************************************/
unsigned char DF_Check_Page_Size(void)
{
  unsigned char Page_Size;
  Page_Size=DF_Read_status_Register();
  if(Page_Size&0x01) return 0;
  return 1;
}
/************************************************************
*讀取FLASH忙標志位(最多判斷255次,不行還是返回且返回0)
************************************************************/
unsigned char DF_Check_Busy_State(void)
{
  unsigned char state;
  unsigned char i=255;
  while(i)
  {
     state=DF_Read_status_Register();
	 if(state & 0x80) break;		//讀取的最高位0時器件忙
	 --i;
  }
  return i;
}
/************************************************************
*讀取FLASH的產家ID的芯片ID等內容;
*以下函數會返回四個值,第一個數對AT45DB041D來說為0x1F;
*第四個數為 0x00;
*用此函數可以判斷芯片的好壞,是否正常;
************************************************************/
void DF_Manufacturer_and_Device_ID(unsigned char *ID)
{
  unsigned char i;

  DF_Check_Busy_State();

  Enable_DFLASH();

  SPI_Write_Byte(Device_ID_Opcode);

  for(i=0;i<4;i++)
  {
    ID[i] = SPI_Read_Byte(0);
  }

  Disable_DFLASH();
}
/************************************************************
*測試FLASH產家ID,正常返回1,否則返回0
************************************************************/
unsigned char Test_Manufacturer_ID(void)
{
  unsigned char Test_Buf[4];
  DF_Manufacturer_and_Device_ID(Test_Buf);
  if(Test_Buf[0]!=0x1F) return 0;       //產家ID不為0x1F則返回0

  return 1;//正確返回 1
}
/************************************************************
*使FLASH進入Deep_Power_Down
************************************************************/
void DF_Deep_Power_Down(void)
{
  DF_Check_Busy_State();
  Enable_DFLASH();
  SPI_Write_Byte(0xB9);//寫Deep Power-down操作碼
  Disable_DFLASH();
}
/************************************************************
*使FLASH退出Deep_Power_Down
************************************************************/
void DF_Resume_from_Deep_Power_Down(void)
{
  DF_Check_Busy_State();
  Enable_DFLASH();
  SPI_Write_Byte(0xAB);//寫Resume from Deep Power-down操作碼
  Disable_DFLASH();
}
/************************************************************
*使能扇區保護
************************************************************/
void DF_Enable_Sector_Protection(void)
{
  unsigned char Enable_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xA9}; //使能扇區保護操作碼
  unsigned char i;

  DF_Check_Busy_State();
  Enable_DFLASH();
  for(i=0;i<4;i++)
  {
	  SPI_Write_Byte(Enable_Sector_Protection_Command[i]);//寫使能扇區保護操作碼
  }
  Disable_DFLASH();
}
/************************************************************
*禁止扇區保護
************************************************************/
void DF_Disable_Sector_Protection(void)
{
  unsigned char Disable_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0x9A};//禁止扇區保護操作碼
  unsigned char i;

  DF_Check_Busy_State();
  Enable_DFLASH();
  for(i=0;i<4;i++)
  {
      SPI_Write_Byte(Disable_Sector_Protection_Command[i]);//寫禁止扇區保護操作碼
  }
  Disable_DFLASH();
}
/************************************************************
*擦除扇區保護
************************************************************/
void DF_Erase_Sector_Protection_Register(void)
{
  unsigned char Erase_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xCF};//擦除扇區保護操作碼
  unsigned char i;

  DF_Check_Busy_State();
  Enable_DFLASH();
  for(i=0;i<4;i++)
  {
      SPI_Write_Byte(Erase_Sector_Protection_Command[i]);//寫擦除扇區保護操作碼
  }
  Disable_DFLASH();
}
/************************************************************
*設置扇區保護
*注意:會改變BUFFER1中的內容
*Sector_Protection_Register:數組中的0~7字節對對應0~7個扇區(0xFF:寫保護)(0x00:擦除保護)

The Sector Protection Register can be reprogrammed while the sector protection enabled or dis-
abled. Being able to reprogram the Sector Protection Register with the sector protection enabled
allows the user to temporarily disable the sector protection to an individual sector rather than
disabling sector protection completely
************************************************************/
void DF_Program_Sector_Protection_Register(unsigned char *Sector_Protection_Register)
{
  unsigned char Program_Sector_Protection_Command[4]={0x3D,0x2A,0x7F,0xFC};//設置扇區保護操作碼
  unsigned char i;

  DF_Check_Busy_State();
  Enable_DFLASH();
  for(i=0;i<4;i++)
  {
      SPI_Write_Byte(Program_Sector_Protection_Command[i]);//寫設置扇區保護操作碼
  }
  for(i=0;i<8;i++)
  {
      SPI_Write_Byte(Sector_Protection_Register[i]);//寫設置扇區保護數據
  }
  Disable_DFLASH();
}
/************************************************************
*讀取扇區保護寄存器內容(返回8個字節,對應8個扇區的情況)
---------------------------------------
|Sector Number |0 (0a, 0b)  |1 to 7   |
---------------------------------------
|Protected	   |            | FFH     |
----------------   See PDF  -----------
|Unprotected   |            | 00H	  |
---------------------------------------
************************************************************/
void DF_Read_Sector_Protection_Register(unsigned char *Sector_Protection_Register)
{
  unsigned char Read_Sector_Protection_Register_Command[4]={0x32,0,0,0};
  unsigned char i;

  DF_Check_Busy_State();
  Enable_DFLASH();

  for(i=0;i<4;i++)//write
  {
    SPI_Write_Byte(Read_Sector_Protection_Register_Command[i]);
  }
  for(i=0;i<8;i++)//read
  {
    Sector_Protection_Register[i] = SPI_Read_Byte(0);
  }
  Disable_DFLASH();
}
/************************************************************
*取消所有扇區保護
*返回1表示成功取消扇區所以保護
************************************************************/
unsigned char DF_Cancel_Sector_Protection(void)
{
  unsigned char Sector_Protection_Register_for_Write[8]={0,0,0,0,0,0,0,0};//寫入0為去保護
  unsigned char Sector_Protection_Register_for_Read[8]={1,1,1,1,1,1,1,1};//防止默認值為0
  unsigned int i;
  unsigned char j=1;
  //使能扇區保護
  DF_Enable_Sector_Protection();
  //設置扇區保護

  DF_Program_Sector_Protection_Register(Sector_Protection_Register_for_Write);
  //讀取扇區保護寄存器內容
  DF_Read_Sector_Protection_Register(Sector_Protection_Register_for_Read);
  //判斷扇區保護寄存器內容
  for(i=0;i<8;i++)
  {
    if(Sector_Protection_Register_for_Read[i]!=0) j++;
  }
  //禁止扇區保護
  DF_Disable_Sector_Protection();

  return j;
}
/************************************************************
*設置扇區鎖(被鎖后不能再次解鎖)
*被設置的扇區就只能讀不能寫
*非一般情況不要使用(除非數據不用再改)
*Sector_Addr :地址在哪個扇區中就會鎖上那個扇區
************************************************************/
void DF_Program_Sector_Lockdown(unsigned long Sector_Addr)
{
  //unsigned char Sector_Lockdown_Command=[4]={0x3D,0x2A,0x7F,0x30};//加鎖操作碼
  unsigned char Sector_Lockdown_Command[4]={0x00,0x00,0x00,0x00};//防止寫到,這里亂寫
  unsigned char i;

  DF_Check_Busy_State();
  Enable_DFLASH();

  for(i=0;i<4;i++)//write
  {
    SPI_Write_Byte(Sector_Lockdown_Command[i]);
  }

  //write address
  SPI_Write_Byte((unsigned char)(Sector_Addr>>16));
  SPI_Write_Byte((unsigned char)(Sector_Addr>>8));
  SPI_Write_Byte((unsigned char)Sector_Addr);

  Disable_DFLASH();
}
/************************************************************
*讀取扇區加鎖寄存器(返回8個扇區的加鎖寄存器值)
*如果有讀到不為0的表示已被加鎖
*(0扇區的高四位為0也表示沒加鎖,其它扇區一定要全為O)
************************************************************/
void DF_Read_Sector_Lockdown_Register(unsigned char *Sector_Lockdown_Register)
{
  unsigned char Read_Sector_Lockdown_Register[4]={0x35,0x00,0x00,0x00};
  unsigned char i;

  DF_Check_Busy_State();
  Enable_DFLASH();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
jvid福利写真一区二区三区| 亚洲一二三四区| 91精品国模一区二区三区| 欧美中文字幕一区二区三区亚洲| 另类的小说在线视频另类成人小视频在线| 国产精品一二三区在线| 国产91精品精华液一区二区三区| 国产美女娇喘av呻吟久久| 成人综合激情网| 欧美综合一区二区三区| 欧美一三区三区四区免费在线看| 欧美成人vps| 亚洲天堂网中文字| 久久精品av麻豆的观看方式| 大尺度一区二区| 欧美日韩中文字幕一区二区| 欧美成人艳星乳罩| 一区二区三区在线视频观看| 国产一区二区三区在线观看精品| 99国产精品一区| 2020国产精品自拍| 亚洲成国产人片在线观看| 丰满少妇久久久久久久| 日韩午夜在线观看| 性做久久久久久久久| av成人免费在线观看| 久久视频一区二区| 日本在线不卡一区| 欧美午夜电影网| 亚洲精品成人悠悠色影视| 国产一区二区免费在线| 欧美va亚洲va| 久久国产麻豆精品| 日韩一区二区电影网| 一区二区三区四区高清精品免费观看| 国产成人综合网站| 日韩欧美一二三| 精品在线免费观看| 精品国产在天天线2019| 久久99国内精品| 精品久久一区二区| 亚洲福利一二三区| 成人av在线资源网| 中文字幕在线一区免费| 99视频有精品| 一区二区三区四区亚洲| 日本久久一区二区| 亚洲成人福利片| 91精品国产综合久久久久| 丝袜美腿亚洲色图| 久久日韩粉嫩一区二区三区| 国产乱子伦视频一区二区三区| 国产欧美日韩中文久久| 色综合久久中文综合久久牛| 一区二区在线观看视频| 日韩欧美国产小视频| 国产999精品久久久久久绿帽| 亚洲一区二区视频在线| 日韩女优av电影| 91在线视频在线| 免费高清成人在线| 亚洲三级小视频| 日韩欧美自拍偷拍| 91网站最新网址| 激情综合网最新| 亚洲成a人在线观看| 中文字幕av一区二区三区免费看| 欧美日韩亚洲综合在线 | 捆绑变态av一区二区三区| 久久夜色精品国产噜噜av| 91在线观看一区二区| 麻豆免费精品视频| 亚洲欧美日韩国产综合在线| 久久久久久久久免费| 91麻豆精品国产91| 欧美亚洲国产一区二区三区va| 国产精品一区免费视频| 美腿丝袜一区二区三区| 亚洲男人的天堂一区二区| 国产精品成人网| 欧美经典一区二区三区| 久久久综合视频| 久久综合色之久久综合| 国产欧美日韩视频在线观看| 欧美精品一区二区精品网| 欧美www视频| 国产精品素人视频| 成人欧美一区二区三区视频网页 | 青青草国产精品亚洲专区无| 亚洲二区在线观看| 精一区二区三区| 国产激情视频一区二区三区欧美| 精品亚洲成a人| 99re热视频精品| 色成人在线视频| 日韩一区二区三区视频在线 | 成人黄色免费短视频| 成人福利视频在线看| 91福利在线播放| 91精品国产综合久久香蕉麻豆| 日韩一区二区电影在线| 国产婷婷一区二区| 亚洲大片在线观看| 成人永久免费视频| 日韩一区二区三区三四区视频在线观看 | 欧美电视剧免费全集观看| 国产日本亚洲高清| 性做久久久久久免费观看| 国内成人精品2018免费看| 91天堂素人约啪| 精品日韩一区二区三区免费视频| 国产精品久久久久影院色老大| 亚洲综合免费观看高清在线观看| 国产又粗又猛又爽又黄91精品| 91香蕉视频污在线| 国产精品美女久久久久aⅴ国产馆| 一区二区三区久久久| 国产成人免费高清| 日韩欧美一区二区视频| 日韩电影网1区2区| 91同城在线观看| 亚洲欧洲精品天堂一级| 国产一区二区伦理片| 91精品福利在线一区二区三区| 中文字幕一区二区三中文字幕| 久久机这里只有精品| 91精品国产高清一区二区三区| 亚洲一区二区三区四区五区中文 | 欧美第一区第二区| 日日摸夜夜添夜夜添精品视频 | 亚洲码国产岛国毛片在线| 成人性生交大片免费| 亚洲视频一区在线观看| 成人动漫一区二区| 亚洲视频一区二区在线观看| 99久久久国产精品免费蜜臀| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆 | 国产99久久久精品| 国产精品狼人久久影院观看方式| 波多野结衣中文字幕一区二区三区| 国产午夜亚洲精品午夜鲁丝片| 国产成人自拍网| 亚洲欧美另类小说| 7777精品伊人久久久大香线蕉的| 青青草原综合久久大伊人精品 | 风间由美一区二区av101 | 99久久国产综合精品麻豆| 亚洲精品国产精华液| 日韩欧美一区在线观看| 国产a久久麻豆| 日韩成人一级片| 国产精品久久久久桃色tv| 欧美日韩高清一区二区三区| 蜜桃久久av一区| 一区二区三区四区蜜桃| 久久先锋影音av鲁色资源网| 91福利精品视频| 福利电影一区二区| 蜜桃久久av一区| 亚洲综合网站在线观看| 国产欧美日韩精品a在线观看| 欧美精品色综合| 色综合视频一区二区三区高清| 国产美女视频一区| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲综合色区另类av| 国产精品美女www爽爽爽| 国产片一区二区三区| 在线91免费看| 欧美一区午夜视频在线观看 | 国产精品不卡在线观看| 国产无一区二区| 久久久久久毛片| 久久先锋影音av| 久久久久青草大香线综合精品| 日韩欧美一区二区不卡| 久久影音资源网| 久久精品欧美一区二区三区不卡 | 成人黄色大片在线观看| 国产91丝袜在线观看| 成人av午夜电影| 色婷婷狠狠综合| 这里只有精品电影| 久久你懂得1024| 亚洲综合在线电影| 婷婷综合另类小说色区| 精品制服美女久久| 不卡视频一二三| 日韩一级成人av| 欧美激情在线看| 亚洲一区在线视频观看| 狠狠色狠狠色综合| 色婷婷综合激情| 2023国产精华国产精品| 亚洲欧洲日韩综合一区二区| 天天色天天爱天天射综合| 国产一区在线视频| 欧美性xxxxxx少妇| 亚洲国产高清在线| 美女网站一区二区|