| 
  |||||||||||
| 技術(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  | 
  
請(qǐng)問(wèn)張工 | 
  
| 作者:shaoguang 欄目:單片機(jī) | 
張工你好:你書上的關(guān)于I2C通訊程序范例,都是通過(guò)驗(yàn)證的嗎?特別是PIC單片機(jī)通過(guò)I2C通訊,的硬件主模式程序, 我調(diào)試沒(méi)通過(guò)呀!! 我想請(qǐng)教一下用I2C時(shí)是采用硬件方式好調(diào)試那,還是用軟件模擬I2C方式好那? 我在一個(gè)板子里用兩片PIC16F877A采用I2C方式通訊,一個(gè)采用主模式,另一個(gè)采用中斷從模式. 請(qǐng)張工給個(gè)調(diào)試過(guò)的例子,多謝!!!  | 
  
| 2樓: | >>參與討論 | 
| 作者: xieyuanbin 于 2004/10/22 6:59:00 發(fā)布:
         這是我兩年前的發(fā)送例程,調(diào)試通過(guò)。 ;這是一個(gè)由16F87X硬件I2C主模式向地址為76H的從設(shè)備SAA1064發(fā)送若干字節(jié)的源程序, ;發(fā)送的字節(jié)數(shù)包括從設(shè)備地址存在COUNTI2C中,發(fā)送時(shí)從BUFADD開(kāi)始依次讀取COUNTI2C個(gè)字節(jié)并發(fā)送. ;從設(shè)備為SAA1064T四LED八段數(shù)碼管顯示控制器,子地址從00H開(kāi)始,每寫入一個(gè)字節(jié)地址自動(dòng)增1. ;硬件主模式中,發(fā)送/接收時(shí)使用SSPADD作為波特率發(fā)生器的基數(shù),SCL的頻率為 晶體振蕩頻率/(4*(sspadd+1)) ;本程序主要部分在PIC16F872向SSA1064芯片發(fā)送數(shù)據(jù)通訊中運(yùn)行通過(guò), LIST P=PIC16F872 INCLUDE "P16F872.INC" CBLOCK 20H BUFADD ;從地址,76 BUFSADD ;從設(shè)備子地址00開(kāi)始 BUFCOM ;子地址為00H的控制字節(jié) BUFDIS1 ;數(shù)據(jù)1 BUFDIS2 ;數(shù)據(jù)2 COUNTI2C ;發(fā)送字節(jié)計(jì)數(shù)器 ENDC ORG 0x0000 GOTO START START BSF STATUS,RP0 ;BANK1 MOVLW B'11000' MOVWF TRISC ;設(shè)置SCL,SDA為輸入 MOVLW H'9' MOVWF SSPADD ;設(shè)置波特率發(fā)生器的波特率基數(shù),頻率=1M/(SSPADD+1)(晶振為4M) BCF STATUS,RP0 ;BANK0 CLRF PORTC MOVLW B'101000' ;開(kāi)MSSP模塊,設(shè)置I2C為主控模式.SCL頻率為 振蕩頻率/(4*(sspadd+1)).這里約為100KHZ MOVWF SSPCON MOVLW H'76' MOVWF BUFADD ;將從設(shè)備地址76H存入 CLRF BUFSADD ;從 從設(shè)備子地址為00開(kāi)始寫入 MOVLW B'11000' ;將從設(shè)備控制字節(jié)寫入 MOVWF BUFCOM MOVLW H'30' MOVWF BUFDIS1 MOVLW H'4F' MOVWF BUFDIS2 ;向從設(shè)備寫入的數(shù)據(jù). MOVLW H'5' MOVWF COUNTI2C ;設(shè)置寫入字節(jié)數(shù)為5個(gè). CALL SENDDATA ;調(diào)用發(fā)送數(shù)據(jù)子程序. GOTO START ;返回. ;----------------------------------------------------------------------------------- SENDDATA ;主模式傳送開(kāi)始 MOVLW BUFADD ;將第一個(gè)字節(jié)的地址存入FSR MOVWF FSR BCF PIR1,SSPIF ;清中斷標(biāo)志. BSF STATUS,RP0 ;BANK1 BSF SSPCON2,SEN ;發(fā)送START條件. BCF STATUS,RP0 ;BANK0 TESTSTART BTFSS PIR1,SSPIF ;查詢SSPIF中斷標(biāo)志,看是否收到START條件,也可在中斷中查詢. GOTO TESTSTART BCF PIR1,SSPIF ;清中斷標(biāo)志. LOOPSEND MOVF INDF,0 ;將FSR所指向的寄存器中的內(nèi)容存入發(fā)送/接收緩存SSPBUF MOVWF SSPBUF TESTASK BTFSS PIR1,SSPIF ;1字節(jié)發(fā)送完成否?這里采用中斷標(biāo)志查詢方式,也可使用中斷方式; GOTO TESTASK ;這期間MCU通過(guò)SSPSR寄存器自動(dòng)向SDA(PORTC,4)逐位發(fā)送數(shù)據(jù),用戶可以干其它事等待中斷發(fā)生. BTFSC PORTC,3 ;檢測(cè)是否有應(yīng)答.有應(yīng)答繼續(xù). GOTO NOACK ;無(wú)應(yīng)答轉(zhuǎn)無(wú)應(yīng)答處理程序. INCF FSR ;地址加1 BCF PIR1,SSPIF ;清中斷標(biāo)志 DECFSZ COUNTI2C ;計(jì)數(shù)器減1, GOTO LOOPSEND ;繼續(xù)發(fā)送下一個(gè)字節(jié) BSF STATUS,RP0 BSF SSPCON2,PEN ;發(fā)送STOP條件. BCF STATUS,RP0 TESTSTOP BTFSS PIR1,SSPIF GOTO TESTSTOP BCF PIR1,SSPIF RETURN NOACK ;無(wú)應(yīng)答處理子程序,這里略,一般是改變SSPADD里的值從新確定波特率 ;或改變BUFADD里的值重新尋址 ........ END  | 
  |
| 3樓: | >>參與討論 | 
| 作者: shaoguang 于 2004/10/22 10:13:00 發(fā)布:
         多謝樓上的朋友!  | 
  |
| 4樓: | >>參與討論 | 
| 作者: shaoguang 于 2004/10/22 10:26:00 發(fā)布:
         張工現(xiàn)在真的很忙了,希望他多來(lái)做做  | 
  |
| 5樓: | >>參與討論 | 
| 作者: xieyuanbin 于 2004/10/22 10:41:00 發(fā)布:
         一個(gè)禮拜能見(jiàn)到他2-3次已經(jīng)不錯(cuò)了。 老是亂跑的。  | 
  |
| 6樓: | >>參與討論 | 
| 作者: wurg 于 2004/10/22 16:14:00 發(fā)布:
         亂跑 亂跑是為了找黃金.  | 
  |
  | 
    
 
  | 
  
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 | 
Copyright © 1998-2006 udpf.com.cn 浙ICP證030469號(hào)  |