|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
誰幫我看看這段I\\0模擬I2C的代碼,究竟出了什么問題 |
| 作者:zhlking 欄目:單片機(jī) |
;----------------------- ;MCU:AT89C52,Fosc=22.1184MHZ ;程序內(nèi)容:向AT24C16.html">AT24C16寫一個(gè)字節(jié)的數(shù)據(jù),再讀出來,并送到P1口看是否正確 ;------------------------ SDA bit P1.4 SCL bit P1.5 ADDRH EQU 20H ADDRL EQU 21H ADDWH EQU 22H ADDWL EQU 23H _DATA EQU 24H ORG 0000H LJMP START ORG 0030H START: MOV SP,#60H MOV ADDRH,#00H MOV ADDRL,#00H MOV ADDWH,#00H MOV ADDWL,#00H MOV _DATA,#0FH LCALL W_24C16 LCALL R_24C16 MOV A,25H MOV P1,A ;送到I/O口檢測收到的數(shù)據(jù)是否正確 ; RET SJMP $ ;--------------------------- ;讀AT24C16.html">AT24C16一個(gè)字節(jié)數(shù)據(jù)子程序 ;--------------------------- R_24C16: LCALL _SIGNAL ;調(diào)用發(fā)起始信號子程序 MOV A,ADDRH ;取要讀數(shù)據(jù)的高位地址 CLR C RLC A ;I/O口模擬I2C只能按位讀,左環(huán)移一位空出R/W位: 0 0 0 0 A10 A9 A8 R/W ORL A,#0a0H ;保留器件地址1010,AT24C系列的EEPROM的型號地址均為1010 ;1 0 1 0 A10 A9 A8 R/W ;AT24C16.html">AT24C16的片選信號A2A1A0均用硬件拉低的 ;第一個(gè)1表示起始信號,最后一個(gè)1表示先寫高位地址 CALL SEND ;發(fā)送高位地址 MOV A,ADDRL ;取低位地址 LCALL SEND ;發(fā)送低位地址 LCALL _SIGNAL ;調(diào)用發(fā)起始信號子程序,準(zhǔn)備傳數(shù)據(jù) MOV A,#0A1H LCALL SEND ;發(fā)送本器件地址 LCALL READ CALL STOP ;調(diào)用終止子程序 RET ;--------------------------- ;讀數(shù)據(jù)子程序 ;--------------------------- READ: MOV R7,#08H CLR SCL READ_LOP: CALL DELAY5US SETB SDA SETB SCL CALL DELAY5US MOV C,SDA MOV A,R2 RLC A MOV R2,A CALL DELAY5US CLR SCL DJNZ R7,READ_LOP MOV 25H,A CLR SDA ;應(yīng)答信號 CALL DELAY5US SETB SCL RET ;--------------------------- ;向AT24C16.html">AT24C16寫入一個(gè)字節(jié)數(shù)據(jù)子程序 ;--------------------------- W_24C16: CALL _SIGNAL ;調(diào)用發(fā)起始信號子程序 MOV A,ADDWH ;存儲單元地址高位0000,0 A10 A9 A8 CLR C RLC A ;左環(huán)移一位空出R/W位: 0 0 0 0 A10 A9 A8 R/W ORL A,#0a0H ;保留器件地址1010,AT24C系列的EEPROM的型號地址均為1010;;第一個(gè)1表示起始信號,最后一個(gè)0表示先寫高位地址 ;1 0 1 0 A10 A9 A8 0 CALL SEND ;調(diào)用發(fā)送子程序,發(fā)送第一個(gè)字節(jié) MOV A,ADDWL ;存儲單元地址低8位 0 0 0 0 0 0 0 0 CALL SEND ;發(fā)送低位地址 MOV A,_DATA ;把放在DATA里面要發(fā)送的數(shù)據(jù)給A CALL SEND ;發(fā)送數(shù)據(jù) CALL STOP ;調(diào)用發(fā)送終止信號子程序 RET ;傳輸結(jié)束后必須發(fā)送終止子程序 ;--------------------------- ;發(fā)送I2C總線終止信號子程序,關(guān)閉24C16 ;--------------------------- STOP: CLR SDA ;SCL=1時(shí),SDA由0變?yōu)?,即為終止信號 SETB SCL CALL DELAY5US SETB SDA CALL DELAY5US CLR SCL CLR SDA CALL DELAY5US RET ;--------------------------- ;發(fā)送子程序 ;--------------------------- SEND: MOV R7,#08H ;用I/O模擬I2C時(shí),必須按位傳輸,每個(gè)字節(jié)8位 CLR SCL SEND_LOP: RLC A ;大循環(huán)左移 MOV SDA,C ;只能按位來傳輸 CALL DELAY5US SETB SCL ;;給SCL一個(gè)上升沿 CALL DELAY5US CLR SCL ;開始發(fā)送下一位,且SDA上的值只能在SCL為0時(shí)才能更改 DJNZ R7,SEND_LOP SETB SDA ;每次發(fā)完一個(gè)字節(jié)后都要發(fā)應(yīng)答信號 CALL DELAY5US SETB SCL CALL DELAY5US SEND_LOP1: ;等待AT24C16.html">AT24C16的應(yīng)答信號 MOV C,SDA ;應(yīng)答信號一來則SDA變0 JC SEND_LOP1 CLR SCL RET ;--------------------------- ;發(fā)起始信號子程序 ;--------------------------- _SIGNAL: SETB SCL ; |
| 2樓: | >>參與討論 |
| 作者: zhlking 于 2007/4/21 11:34:00 發(fā)布:
幫幫忙! 有人指導(dǎo)一下么? |
|
| 3樓: | >>參與討論 |
| 作者: jxmemail 于 2007/4/21 22:54:00 發(fā)布:
出什么問題了? |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |