機電之家資源網
單片機首頁|單片機基礎|單片機應用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
24CXX系列讀寫程序(EMC指令版)
24CXX系列讀寫程序(EMC指令版)
 更新時間:2008-7-26 20:11:56  點擊數:2
【字體: 字體顏色
;******************************************
;** 24CXX 接口I2C總線讀/寫的程序
;** (所有時序均基于4MHZ晶體震蕩器頻率)
;******************************************
/*
;****************************
;隨機讀寫測試程序(示范程序)
;****************************
TEST:
MOV A,@0XAE ;A2=A1=A0=1
MOV SLAVE_24,A ;設置器件碼
MOV A,@2 ;R/W LOC. = 2
MOV ADDR_24,A ;設置地址碼
MOV A,@55 ;
MOV DATA_24,A ;寫55到E2PROM
CALL WRBYTE ;寫一個字節(jié)
CALL DL10MS ;延時10MS,等待寫操作完成(注意,此語句非常重要)
CALL RDBYTE ;讀回原數據
MOV A,@55 ;
XOR A,DATA_24 ;
JBS R3,Z ;讀出數據=寫入數據跳
WRONG:
JMP WRONG ;校驗失敗
CORRECT:
JMP CORRECT ;校驗通過
DL10MS:
RET
;****************************
;存儲器定義
;****************************
PROT_I2C EQU 0X05 ;I2C操作口
SDA EQU 3 ;數據腳
SCL EQU 2 ;時鐘腳

ADDR_24 EQU 0X1B ;地址寄存器
DATA_24 EQU 0X1C ;寫入/讀自I2C的數據寄存器
SLAVE_24 EQU 0X1D ;從器件地址寄存器(1010XXX0)
DBUF_24 EQU 0X1E ;發(fā)送/接受自SDA口的數據緩沖器
COUNT_24 EQU 0X1F ;位計數器
TT_24 EQU 0X20 ;標志寄存器
REND_24 EQU 1 ;讀完畢標志(0=未完畢,1=完畢)
NUM_24 EQU 0X21 ;頁寫/頁讀字節(jié)數

*/
;****************************
;宏定義
;****************************
;=================
;設置SCL,SDA為輸出口
;=================
SDA_OUT MACRO
MOV A,@0B00000001
IOW PROT_I2C
ENDM
;=================
;設置SCL為輸出口,SDA為輸入口
;=================
SDA_IN MACRO
MOV A,@0B00001001
IOW PROT_I2C
ENDM
;****************************
;字節(jié)寫程序
;功能: 寫一個字節(jié)到EEPROM器件
;入口: DATA_24 =要寫的數據
; ADDR_24 =數據地址
; SLAVE_24=從器件地址1010XXX0)
;****************************
WRBYTE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送從器件地址并檢測應答信號
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送數據地址并檢測應答信號
MOV A,DATA_24
MOV DBUF_24,A
CALL TX ;送數據并檢測應答信號
CALL BSTOP ;送停止位
RET
;****************************
;字節(jié)讀程序
;功能: 從EEPROM器件讀一個字節(jié)
;入口: ADDR_24 =數據地址
; SLAVE_24=從器件地址(1010XXX0)
;出口: DATA_24 =讀到的數據
;****************************
RDBYTE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送從器件地址并檢測應答信號
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送數據地址并檢測應答信號
;轉入讀狀態(tài)
CALL BSTART ;送起始位
MOV A,SLAVE_24
MOV DBUF_24,A
BS DBUF_24,0
CALL TX ;送從器件地址并檢測應答信號
BS TT_24,REND_24
CALL RX ;讀數據并發(fā)送應答信號
CALL BSTOP ;送停止位
MOV A,DBUF_24
MOV DATA_24,A ;保存數據到DATA_24
RET
;****************************
;頁寫程序
;功能: 寫一個字節(jié)到EEPROM器件
;入口: R4 =要寫的數據在RAM中存放首地址
; NUM_24 =字節(jié)數
; ADDR_24 =數據地址
; SLAVE_24=從器件地址1010XXX0)
;****************************
WRPAGE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送從器件地址并檢測應答信號
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送數據地址并檢測應答信號
WRPAGE1:
MOV A,R0
MOV DBUF_24,A
CALL TX ;送數據并檢測應答信號
INC R4
DJZ NUM_24
JMP WRPAGE1 ;未寫完繼續(xù)
CALL BSTOP ;送停止位
RET
;****************************
;頁讀程序
;功能: 從EEPROM器件讀一個字節(jié)
;入口: ADDR_24 =數據地址
; SLAVE_24=從器件地址(1010XXX0)
; NUM_24 =字節(jié)數
;出口: R4 =讀到的數據在RAM中存放首地址
;****************************
RDPAGE:
MOV A,SLAVE_24
MOV DBUF_24,A
CALL BSTART ;送起始位
CALL TX ;送從器件地址并檢測應答信號
MOV A,ADDR_24
MOV DBUF_24,A
CALL TX ;送數據地址并檢測應答信號
;轉入讀狀態(tài)
CALL BSTART ;送起始位
MOV A,SLAVE_24
MOV DBUF_24,A
BS DBUF_24,0
CALL TX ;送從器件地址并檢測應答信號
RDPAGE1:
MOV A,@1
XOR A,NUM_24
BS TT_24,REND_24
JBS R3,Z ;NUM_24=1跳;判斷是否最后一個字節(jié),決定應答信號
BC TT_24,REND_24
CALL RX ;讀數據并發(fā)送應答信號
MOV A,DBUF_24
MOV R0,A ;保存數據到R0
INC R4
DJZ NUM_24
JMP RDPAGE1 ;未讀完繼續(xù)
CALL BSTOP ;送停止位
RET
;****************************
;I2C操作子程序(時序)集合
;****************************
;=================
;發(fā)送起始位程序
;說明: 當SCL=1時,向SDA發(fā)一個下降沿
;=================
BSTART:
SDA_OUT ;設置SDA為輸出口
BS PROT_I2C,SDA ;SDA=1
NOP ;延時0.6US
BS PROT_I2C,SCL ;SCL=1
NOP ;延時0.6US
BC PROT_I2C,SDA ;SDA=0
NOP ;延時0.6US
BC PROT_I2C,SCL ;SCL=0
NOP ;延時0.6US
RET
;=================
;發(fā)送結束位程序
;說明: 當SCL=1時,向SDA發(fā)一個上升沿
;=================
BSTOP:
SDA_OUT ;設置SDA為輸出口
BC PROT_I2C,SDA ;SDA=0
NOP ;延時0.6US
BS PROT_I2C,SCL ;SCL=1
NOP ;延時0.6US
BS PROT_I2C,SDA ;SDA=1
NOP ;延時0.6US
RET
;=================
;位輸入子程序
;說明: 當SCL=1時,從SDA上讀電平
;出口: C=從SDA上讀入的位值
;=================
BITIN:
SDA_IN ;設置SDA為輸入口
BS PROT_I2C,SDA ;SDA=1
NOP ;延時0.6US
BS PROT_I2C,SCL ;SCL=1
NOP ;延時0.6US
BC R3,C
JBC PROT_I2C,SDA
BS R3,C ;C=SDA
NOP ;延時0.6US
BC PROT_I2C,SCL ;SCL=0
NOP ;延時0.6US
RET
;=================
;位輸出子程序
;說明: 每當SCL=0時,改寫SDA上的電平
;入口: C=要寫到SDA上的位值
;=================
BITOUT:
SDA_OUT ;設置SDA為輸出口
JBS R3,C
JMP BIT0
BS PROT_I2C,SDA ;SDA=C=1
JMP CLK1
BIT0:
BC PROT_I2C,SDA ;SDA=C=0
CLK1:
NOP ;延時0.6US
BS PROT_I2C,SCL ;SCL=1
BIT2:
NOP
NOP
BC PROT_I2C,SCL ;SCL=0
RET
;============================
;接收數據子程序
;入口: TT_24.REND_24 =讀完畢標志
;出口: DBUF_24 =接受到的數據(8_BIT)
;============================
RX:
MOV A,@8 ;循環(huán)次數=8
MOV COUNT_24,A
CLR DBUF_24
RXLP:
CALL BITIN ;輸入1_BIT
RLC DBUF_24 ;左移(帶C)
DJZ COUNT_24 ;循環(huán)結束?
JMP RXLP
;設置應答信號位,如果讀完畢則送1(NO_ACK)停止接受,否則送0(ACK)繼續(xù)接受
BS R3,C
JBS TT_24,REND_24 ;讀完畢信號->C
BC R3,C
CALL BITOUT ;應答
RET
;============================
;發(fā)送數據子程序
;入口: DBUF_24 =要發(fā)送的數據(8_BIT)
;============================
TX:
MOV A,@8 ;循環(huán)次數=8
MOV COUNT_24,A
TXLP:
RLC DBUF_24 ;左移(帶C)
CALL BITOUT ;輸出1_BIT
DJZ COUNT_24 ;循環(huán)結束?
JMP TXLP
CALL BITIN ;讀應答信號
RET

;****************************
;I2C總線讀/寫的程序全部結束 !
;****************************
  • 上一篇: Em78p458/9 比較器功能測試程序
  • 下一篇: EMC指令版本SLE4428卡讀寫程序
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關文章
    網友評論:(只顯示最新5條。)
    關于我們 | 聯系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務100強網站

    網站經營許可證:浙B2-20080178-1