音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(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ī)
2051模擬I2C接口讀寫(xiě)24C04的問(wèn)題
新手第一次寫(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
以下是程序(匯編)
;------------------------------------------------------------------------------------
    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
建議:
建議:1、仔細(xì)檢查發(fā)送、接收協(xié)議有沒(méi)有錯(cuò)誤。
      2、晶振頻率與發(fā)送、接收時(shí)脈沖寬度是否匹配。

4樓: >>參與討論
gjhdiy
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
如下
讀操作:?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
網(wǎng)上有的是現(xiàn)成的
 
7樓: >>參與討論
Iam11
費(fèi)那么大勁干什么?
去www.zlgmcu.com下載個(gè)模擬I2C軟件包就搞定了

8樓: >>參與討論
gjhdiy
多謝各位~~
周立功網(wǎng)站上果然有很詳細(xì)的示例,謝謝各位啦!

參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
招單片機(jī)學(xué)徒,注重實(shí)戰(zhàn)!目的:你學(xué)到東西,也幫我做到東西!
問(wèn)個(gè)問(wèn)題:.bin文件與.hex文件格式有什么不同?
點(diǎn)陣屏的問(wèn)題?
請(qǐng)教:用74hc244能驅(qū)動(dòng)數(shù)碼管碼?
尋求抄表器
免費(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)