|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
用2051模擬I2C接口讀寫(xiě)24C04的問(wèn)題 |
| 作者:gjhdiy 欄目:單片機(jī) |
新手第一次寫(xiě)I2C程序,看了好幾遍24C04的DATASHEET,根據(jù)理解寫(xiě)了一段用2051模擬I2C接口讀寫(xiě)24C04的程序,編譯已經(jīng)通過(guò),但目的板上調(diào)試不通,請(qǐng)各位熟悉I2C的高手幫忙看看哪里問(wèn)題。 調(diào)不同的原因可能是對(duì)24C04的讀或?qū)憰r(shí)序理解得不透徹,我的理解是這樣的: 寫(xiě)操作:?jiǎn)?dòng)總線->發(fā)送器件尋址字節(jié)->回答->發(fā)送尋址地址->回答->發(fā)送第一個(gè)數(shù)據(jù)->回答->發(fā)送第二個(gè)數(shù)據(jù)->回答...........->發(fā)送第n-1個(gè)數(shù)據(jù)->回答->停止總線; 讀操作:?jiǎn)?dòng)總線->發(fā)送器件尋址字節(jié)->回答->發(fā)送數(shù)據(jù)尋址地址->回答->停止總線+啟動(dòng)總線->讀第一個(gè)數(shù)據(jù)->回答->讀第二個(gè)數(shù)據(jù)->回答...........->讀第n-1個(gè)數(shù)據(jù)->回答->停止總線。 以上的理解正確否?請(qǐng)高手指正。 |
| 2樓: | >>參與討論 |
| 作者: gjhdiy 于 2005/3/4 9:01:00 發(fā)布:
以下是程序(匯編) ;------------------------------------------------------------------------------------ SCL BIT P1.1 ;定義24C04的串行時(shí)鐘線 SDA BIT P1.0 ;定義24C04的串行數(shù)據(jù)線 LED BIT P3.4 ;LED ;------------------------------------------------------------------------------------ ORG 0000H LJMP POWER_ON POWER_ON: MOV SCON ,#50H ;設(shè)置成串口1方式 MOV TMOD ,#20H ;波特率發(fā)生器T1工作在模式2上 MOV PCON ,#80H ;波特率翻倍為2400x2=4800BPS MOV TH1 ,#0F3H ;預(yù)置初值(按波特率2400BPS預(yù)置初) MOV TL1 ,#0F3H ;預(yù)置初值(按波特率2400BPS預(yù)置初) SETB TR1 ;啟動(dòng)T1 CLR RI CLR TI SETB REN MOV DPTR,#0700H ;定義的數(shù)據(jù)起始 MOV R3,#20H ;數(shù)據(jù)保存在24C04的開(kāi)始地址 ;================================================================= MAIN: ;主程序 LCALL RX_DATA ;等待串口接收,在PC發(fā)#00H MOVC A,@A+DPTR ;將定義的數(shù)據(jù)取出 MOV R7,A LCALL WRITE ;調(diào)用寫(xiě)操作 INC DPTR ;定義的數(shù)據(jù)地址加1 MOV R3,A ;保存地址加1 LCALL READ ;讀24C04 LCALL TX_DATA ;發(fā)到PC上 AJMP MAIN ;======================================================= RX_DATA: ;UART接收 JNB RI,RX_DATA MOV A,SBUF CLR RI RET ;==================================================== TX_DATA: ;UART發(fā)送 MOV SBUF,A CLR TI RET ;===================================================== WRITE: ;寫(xiě)入24C04 LCALL STAR ;開(kāi)始發(fā)出 MOV A,#0A2H ;對(duì)地址為00的設(shè)備寫(xiě)操作 ADDR: LCALL SDATA ;送出設(shè)備地址 LCALL ACK JC ADDR ;判別應(yīng)答位 NOP MOV A,R3 ;數(shù)據(jù)保存地址 ADDR1: LCALL SDATA ;發(fā)送數(shù)據(jù)的保存地址20H LCALL ACK JC ADDR1 NOP MOV A,R7 ;數(shù)據(jù)1 ADDR2: LCALL SDATA ;寫(xiě)入數(shù)據(jù)1 LCALL ACK JC ADDR2 NOP   |
|
| 3樓: | >>參與討論 |
| 作者: mengzs 于 2005/3/4 9:31:00 發(fā)布:
建議: 建議:1、仔細(xì)檢查發(fā)送、接收協(xié)議有沒(méi)有錯(cuò)誤。 2、晶振頻率與發(fā)送、接收時(shí)脈沖寬度是否匹配。 |
|
| 4樓: | >>參與討論 |
| 作者: gjhdiy 于 2005/3/4 9:49:00 發(fā)布:
MAIN段有寫(xiě)錯(cuò),應(yīng)該如下: 正確的應(yīng)該這樣 ;================================================================= MAIN: ;主程序 LCALL RX_DATA ;等待串口接收,在PC發(fā)#00H MOVC A,@A+DPTR ;將定義的數(shù)據(jù)取出 MOV R7,A LCALL WRITE ;調(diào)用寫(xiě)操作 INC DPTR ;定義的數(shù)據(jù)地址加1 MOV A,R3 ;將 LCALL READ ;讀24C04 LCALL TX_DATA ;發(fā)到PC上 AJMP MAIN ;================================================================= 請(qǐng)教mengzs: 1.我就是按第一帖上說(shuō)的讀寫(xiě)操作來(lái)理解發(fā)送、接收協(xié)議的,不知道這樣對(duì)不對(duì)?有沒(méi)有什么方法可以知道程序運(yùn)行后實(shí)際有沒(méi)有寫(xiě)入24C04?在目的板上運(yùn)行總是跳不出讀程序,可能是ACK盤(pán)剝那里死循環(huán)了,但我試過(guò)去掉 JC ADDR? 的判斷語(yǔ)句,也讀不出數(shù)據(jù)。 2.我用12MHZ的晶振,你是不是說(shuō)指令周期快過(guò)I2C的最高傳輸速度? |
|
| 5樓: | >>參與討論 |
| 作者: mengzs 于 2005/3/4 13:38:00 發(fā)布:
如下 讀操作:?jiǎn)?dòng)總線->發(fā)送器件尋址字節(jié)->回答->發(fā)送數(shù)據(jù)尋址地址->回答->停止總線+啟動(dòng)總線->讀第一個(gè)數(shù)據(jù)->回答->讀第二個(gè)數(shù)據(jù)->回答...........->讀第n-1個(gè)數(shù)據(jù)->回答->停止總線。 改為:?jiǎn)?dòng)總線->發(fā)送器件尋址字節(jié)(寫(xiě))->回答->發(fā)送數(shù)據(jù)尋址地址->回答->停止總線+啟動(dòng)總線->發(fā)送器件尋址字節(jié)(讀)-〉應(yīng)答(接收)-〉讀第一個(gè)數(shù)據(jù)->回答->讀第二個(gè)數(shù)據(jù)->回答..........->讀第n-1個(gè)數(shù)據(jù)->非應(yīng)答->停止總線 I2C完整程序如下: SDA EQU P1.0 SCL EQU P1.1 SLAW EQU 0A0H;外圍器件尋址字節(jié)(寫(xiě)) SLAR EQU 0A1H;外圍器件尋址字節(jié)(讀) SLA EQU 50H ;尋址字節(jié)存放單元 NUMBYT EQU 51H ;傳送字節(jié)數(shù)次存放單元 MTD EQU 30H ;發(fā)送數(shù)據(jù)緩沖區(qū) MRD EQU 40H ;接收數(shù)據(jù)緩沖區(qū) ;========讀24C04======= VAT24R: MOV MTD,#50H MOV SLA,#SLAW MOV NUMBYT,#1 LCALL WRNBYT MOV SLA,#SLAR MOV NUMBYT,#08H LCALL RDNBYT ACALL RMOV8 RET RMOV8: MOV R0,#MRD MOV R1,#60H MOV R2,#8 RMOV: MOV A,@R0 MOV @R1,A INC R0 INC R1 DJNZ R2,RMOV RET ;=====寫(xiě)24C04===== VAT24W: ACALL RMOV9 MOV SLA,#SLAW MOV NUMBYT,#09H LCALL WRNBYT RET RMOV9: MOV R0,#MTD; MOV R1,#60H MOV R2,#9 WMOV: MOV A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R2,WMOV RET STA: SETB SDA SETB SCL NOP CLR SDA NOP CLR SCL RET STOP: CLR SCL CLR SDA NOP SETB SCL NOP SETB SDA RET MACK: CLR SDA;應(yīng)答 NOP SETB SCL NOP CLR SCL RET MNACK: SETB SDA ;非應(yīng)答 NOP SETB SCL NOP CLR SCL RET CACK: SETB SDA ;應(yīng)答檢驗(yàn) SETB SCL NOP CLR F0 MOV C,SDA JNC CEND LCALL STOP SETB F0 CEND: NOP CLR SCL RET WRBYT: MOV R0,#08H ;寫(xiě)1字節(jié) WLP: RLC A JC WR1 AJMP WR0 WLP1: DJNZ R0,WLP RET WR1: SETB SDA SETB SCL NOP CLR SCL CLR SDA AJMP WLP1 WR0: CLR SDA SETB SCL NOP CLR SCL | |
| 6樓: | >>參與討論 |
| 作者: e.bug 于 2005/3/4 16:51:00 發(fā)布:
網(wǎng)上有的是現(xiàn)成的 |
|
| 7樓: | >>參與討論 |
| 作者: Iam11 于 2005/3/4 17:35:00 發(fā)布:
費(fèi)那么大勁干什么? 去www.zlgmcu.com下載個(gè)模擬I2C軟件包就搞定了 |
|
| 8樓: | >>參與討論 |
| 作者: gjhdiy 于 2005/3/4 19:00:00 發(fā)布:
多謝各位~~ 周立功網(wǎng)站上果然有很詳細(xì)的示例,謝謝各位啦! |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |