|
- /******************************************************************************************
- 端口定義
- ****************************************************************************************/
- sbit SCL=P2^1; //將串行時鐘總線SCL位定義在為P3.4引腳
- sbit SDA=P2^0; //將串行數據總線SDA位定義在為P3.5引腳
- #define OP_READ 0xa1 // 器件地址以及讀取操作,0xa1即為1010 0001B
- #define OP_WRITE 0xa0 // 器件地址以及寫入操作,0xa1即為1010 0000B
- /******************************************************************************************
- * 函數名稱 :Start
- * 功能描述 : 啟動I2C總線
- * 參數 : 無
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- void Start()
- {
- SDA = 1; //SDA初始化為高電平“1”
- SCL = 1; //開始數據傳送時,要求SCL為高電平“1”
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- SDA = 0; //SDA的下降沿被認為是開始信號
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- SCL = 0; //SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)
- }
- /******************************************************************************************
- * 函數名稱 :Stop
- * 功能描述 : 結束I2C總線
- * 參數 : 無
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- void Stop()// 停止位
- {
- SDA = 0; //SDA初始化為低電平“0” _n
- SCL = 1; //結束數據傳送時,要求SCL為高電平“1”
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- SDA = 1; //SDA的上升沿被認為是結束信號
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- SDA=0;
- SCL=0;
- }
- /******************************************************************************************
- * 函數名稱 :TeskAsk
- * 功能描述 : 檢測應答位
- * 參數 : 無
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- void TestAsk()
- {
- bit ack_bit; //儲存應答位
- SDA = 1; // 發送設備(主機)應在時鐘脈沖的高電平期間(SCL=1)釋放SDA線,
- //以讓SDA線轉由接收設備(AT24Cxx)控制
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- SCL = 1; //根據上述規定,SCL應為高電平
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
- ack_bit = SDA; //接受設備(AT24Cxx)向SDA送低電平,表示已經接收到一個字節
- //若送高電平,表示沒有接收到,傳送異常 結束發送
- SCL = 0; //SCL為低電平時,SDA上數據才允許變化(即允許以后的數據傳遞)
- while(ack_bit!=0);
- }
- /******************************************************************************************
- * 函數名稱 :SendAsk
- * 功能描述 :發送應答位
- * 參數 : 無
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- void SendAsk()
- {
- SCL=0;
- _nop_();
- _nop_();
- SDA=0; //將SDA拉低并持續4.5us以上
- SCL=1;
-
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- SCL=0;
- SDA=1;
- }
- /******************************************************************************************
- * 函數名稱 :ReadData
- * 功能描述 :從24CXX里讀一個字節
- * 參數 : 無
- * 返回值 : x
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- unsigned char ReadData()
- // 從AT24Cxx移入數據到MCU
- {
- unsigned char i;
- unsigned char x; //儲存從AT24Cxx中讀出的數據
- for(i = 0; i < 8; i++)
- {
- SCL = 1; //SCL置為高電平
- x<<=1; //將x中的各二進位向左移一位
- x|=(unsigned char)SDA; //將SDA上的數據通過按位“或“運算存入x中
- SCL = 0; //在SCL的下降沿讀出數據
- }
- return(x); //將讀取的數據返回
- }
- /******************************************************************************************
- * 函數名稱 :WriteCurrent
- * 功能描述 :向AT24Cxx的當前地址寫入數據
- * 參數 : y (儲存待寫入的數據)
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- //在調用此數據寫入函數前需首先調用開始函數start(),所以SCL=0
- void WriteCurrent(unsigned char y)
- {
- unsigned char i;
- for(i = 0; i < 8; i++) // 循環移入8個位
- {
- SDA = (bit)(y&0x80); //通過按位“與”運算將最高位數據送到S
- //因為傳送時高位在前,低位在后
- _nop_(); //等待一個機器周期
- SCL = 1; //在SCL的上升沿將數據寫入AT24Cxx
- _nop_(); //等待一個機器周期
- _nop_(); //等待一個機器周期
-
- SCL = 0; //將SCL重新置為低電平,以在SCL線形成傳送數據所需的8個脈沖
- y <<= 1; //將y中的各二進位向左移一位
-
- }
- }
- /******************************************************************************************
- * 函數名稱 :WriteSet
- * 功能描述 :向AT24Cxx中的指定地址寫入數據
- * 參數 :add (儲存指定的地址);dat(儲存待寫入的數據)
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- void WriteSet(unsigned char add, unsigned char dat)
- // 在指定地址addr處寫入數據WriteCurrent
- {
- Start(); //開始數據傳遞
- WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
- TestAsk();
- WriteCurrent(add); //寫入指定地址
- TestAsk();
- WriteCurrent(dat); //向當前地址(上面指定的地址)寫入數據
- TestAsk();
- Stop(); //停止數據傳遞
- delay(4); //1個字節的寫入周期為1ms, 最好延時1ms以上
- }
- /******************************************************************************************
- * 函數名稱 :ReadCurrent
- * 功能描述 :從AT24Cxx中的當前地址讀取數據
- * 參數 : 無
- * 返回值 : x (儲存讀出的數據)
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- unsigned char ReadCurrent()
- {
- unsigned char x;
- Start(); //開始數據傳遞
- WriteCurrent(OP_READ); //選擇要操作的AT24Cxx芯片,并告知要讀其數據
- TestAsk();
- x=ReadData(); //將讀取的數據存入x
- Stop(); //停止數據傳遞
- return x; //返回讀取的數據
- }
- /******************************************************************************************
- * 函數名稱 :ReadSet
- * 功能描述 :從AT24Cxx中的指定地址讀取數據
- * 參數 : set_addr
- * 返回值 : x
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- unsigned char ReadSet(unsigned char set_addr)
- // 在指定地址讀取
- {
- Start(); //開始數據傳遞
- WriteCurrent(OP_WRITE); //選擇要操作的AT24Cxx芯片,并告知要對其寫入數據
- TestAsk();
- WriteCurrent(set_addr); //寫入指定地址
- TestAsk();
- return(ReadCurrent()); //從指定地址讀出數據并返回
- }
- /******************************************************************************************
- * 函數名稱 :WritePage
- * 功能描述 :從AT24Cxx中的指定頁地址寫8字節數據
- * 參數 : address,*s(要寫進去的數組首地址)
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- void WritePage(unsigned char address,unsigned char *s) //按頁寫
- {
- unsigned char i;
- Start();
- WriteCurrent(OP_WRITE); //發送控制寫字節
- TestAsk();
- WriteCurrent(address); //存儲器地址;每次讀完之后指針自動加1
- TestAsk();
- for(i=0;i<8;i++) //直接連續寫8次,每頁含有16個字節
- {
- WriteCurrent(*s);
- TestAsk();
- s++;
- }
- Stop();
- delay(4); //1個字節的寫入周期為1ms, 最好延時1ms以上
- }
- /******************************************************************************************
- * 函數名稱 :ReadPage
- * 功能描述 :從AT24Cxx中的指定頁地址讀取8字節數據
- * 參數 : address,tmp[](存放讀出來的數據)
- * 返回值 : 無
- * 創建日期 :2010-11-25
- * 作者 :zzj
- * 全局變量 :
- * 全局靜態變量:
- * 局部靜態變量:
- *----------------------------------------修改歷史------------------------------------------
- * 當前版本 : 修改人: 修改日期:
- * 修改說明 :
- ******************************************************************************************/
- void ReadPage(unsigned char address,unsigned char tmp[]) //按頁讀取、可以連續讀,不需要按頁讀
- {
- unsigned char i;
- Start();
- WriteCurrent(OP_WRITE); //發送控制寫字節
- TestAsk();
- WriteCurrent(address); //存儲器地址;每次讀完之后指針自動加1
- TestAsk();
- Start();
- WriteCurrent(OP_READ); //選擇要操作的AT24Cxx芯片,并告知要讀其數據
- TestAsk();
- tmp[0]=ReadData();
- for(i=1;i<8;i++)
- {
- SendAsk();
- tmp[i]=ReadData();
- } /**/
- Stop();
- }
復制代碼
|
|