《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 解決方案 > PIC單片機的IIC接口程序

PIC單片機的IIC接口程序

2009-01-16
關鍵詞: 接口程序 PIC

PIC單片機的IIC接口程序

InitI2CBusMaster

;************************************************************
TxmtStartBit
   bsf    Bus_Busy                       ; on a start condition bus is busy
   bsf    STATUS, RP0                    ; Select page 1
   bsf    _SDA                           ; set SDA high
   bsf    _SCL                           ; clock is high
   call   Delay40uSec                    ; This is necessary for setup time
   bcf    _SDA                           ; This gives a falling edge on SDA while clock is high
   call   Delay47uSec                    ; Necessary for START HOLD time
   return
;************************************************************
TxmtStopBit
   bsf    STATUS, RP0                    ; Select page 1
   bcf    _SCL                           ; clock is low
   bcf    _SDA                           ; set SDA low
   bsf    _SCL                           ; clock is pulled up
   call   Delay40uSec                    ; Setup time for STOP condition
   bsf    _SDA                           ; rising edge on SDA while CLOCK is high
   call   Delay47uSec                    ; makes sure a START isn't sent immediately after a STOP
   bcf    Bus_Busy                       ; The bus isn't busy anymore
   return
;************************************************************
AbortI2C
   call   TxmtStopBit                    ; Send a stop bit
   bsf    Abort                          ; set the abort bit
   return
;************************************************************
TxmtSlaveAddr
   movf   SlaveAddr, w                   ; Move slave address to W
   bcf    ACK_Error                      ; reset Acknowledge error bit
   movwf  I2CData                        ; move W to I2C Data
   bcf    I2CData, LSB                   ; Set for write
   btfsc  Slave_RW                       ; If skip then write operation
   bsf    I2CData, LSB                   ; Clear for read
   call   SendData                       ; send the address
   btfss  Txmt_Success                   ; skip if successful
   goto   AddrSendFail                   ; Oops, we failed
   retlw  TRUE                           ; return true
AddrSendFail
   btfss  ACK_Error                      ; was there an error acknowledging
   retlw  FALSE                          ; No, so return 0
   call   TxmtStopBit                    ; Address not acknowleged, so send STOP bit
   retlw  FALSE                          ; Unsuccessful, so return 0

;************************************************************
SendData
 ; We might should make a copy of the data here, the example does but I don't see why!!!
   bsf    Txmt_Progress                  ; We are in the middle of transmitting
   bcf    Txmt_Success                   ; reset success bit
   movlw  0x08
   movwf  I2CBitCount                    ; Set I2C Bit Count to 8
   bsf    STATUS, RP0                    ; Select page 1
TxmtNextBit:
   bcf    _SCL                           ; Set clock Low
   rlf    I2CData, F                     ; MSB First, Note that I2CData is Destroyed
   bcf    _SDA                           ; Set clock based on what the MSB is
   btfsc  STATUS,C                       ; Was the MSB a 1
   bsf    _SDA                           ; Nope set it high
   call   Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time
   bsf    _SCL                           ; set clock high
   call   Delay40uSec                    ; guarantee min HIGH TIME tHIGH
   decfsz I2CBitCount, F                 ; are we done yet
   goto   TxmtNextBit                    ; nope, send the next bit
;
; Check For Acknowledge
;
   bcf    _SCL                           ; reset clock
   bsf    _SDA                           ; Release SDA line for Slave to pull down
   call   Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time
   bsf    _SCL                           ; clock for slave to ACK
   call   Delay40uSec                    ; guarantee min HIGH TIME tHIGH
   bcf    STATUS, RP0                    ; Select PAGE 0 to test SDA pin
   btfsc  SdaPin                         ; SDA should be pulled low by slave if OK
   goto   TxmtErrorAck                   ; Uh oh, slave isn't behaving (or isn't there)
   bsf    STATUS, RP0                    ; Select PAGE 1
   bcf    _SCL                           ; reset clock
   bcf    Txmt_Progress                  ; reset progress bit in Bus Status
   bsf    Txmt_Success                   ; Transmission successful
   bcf    ACK_Error                      ; ACK OK
   return
TxmtErrorAck
   bsf    STATUS,RP0                     ; select page 1
   bsf    _SDA                           ; tristate SDA
   bsf    _SCL                           ; tristate SCL
   bcf    Txmt_Progress                  ; reset progress bit in Bus Status
   bcf    Txmt_Success                   ; Transmission NOT successful
   bsf    ACK_Error                      ; No ACK From Slave
   return

;************************************************************
GetData
   bsf    Rcv_Progress                   ; set Bus status for txmt progress
   bcf    Rcv_Success                    ; reset status bit
   movlw  0x08
   movwf  I2CBitCount
RcvNextBit
   bsf    STATUS, RP0                    ; page 1 for TRIS manipulation
   bcf    _SCL                           ; lower clock
   bcf    _SDA                           ; lower data line
   call   Delay47uSec                    ; guarantee min LOW TIME tLOW & setup time
   bsf    _SCL                           ; clock high, data sent by slave
   call   Delay40uSec                    ; guarantee min HIGH TIME tHIGH
   bcf    STATUS, RP0                    ; select page 0 to read Ports
   bcf    STATUS, C                      ; 0 out Status
   btfsc  SdaPin                         ; Check state of pin
   bsf    STATUS, C                      ; Pin was high, set status
   rlf    I2CData, F                     ; left Shift data (MSB first)
   decfsz I2CBitCount, F                 ; Are we done yet
   goto   RcvNextBit                     ; Nope, go get the next one
;
; Generate ACK bit if not last byte to be read,
; if last byte Gennerate NACK ; do not send ACK on last byte, main routine will send a STOP bit
;
   bsf    STATUS, RP0                    ; Page 1 for TRIS manipulation
   bcf    _SCL                           ; pull SCL low
   bcf    _SDA                           ; ACK by pulling SDA low
   btfsc  Last_Byte_Rcv                  ; Is it the last byte to receive
   bsf    _SDA                           ; If so, send NACK by setting SDA high
   call   Delay47uSec                    ; guarantee min LOW TIME tLOW & Setup time
   bsf    _SCL                           ; Raise Clock back up
   call   Delay40uSec                    ; guarantee min HIGH TIME tHIGH
RcvEnd:
   bcf    _SCL                           ; reset clock
   bcf    Rcv_Progress                   ; reset bit in Bus Status
   bsf    Rcv_Success                    ; transmission successful
   bcf    ACK_Error                      ; ACK OK
   return

Delay47uSec:
   movlw ((_47uS_Delay-5)/3 + 1)         ; move delay into W
DlyK
   movwf DelayCount                      ; move what is in W to DelayCount
   decfsz   DelayCount, F                ; Decrement DelayCount
   goto  $-1                             ; Loop until 0
   return                                ; return

Delay40uSec:
   movlw ((_40uS_Delay-8)/3 + 1)         ; move delay into W
   goto  DlyK                            ; goto DlyK loop

 

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
日韩视频在线播放| 久久米奇亚洲| 亚洲第一黄网| 欧美一区二区视频97| 亚洲欧美日韩另类| 亚洲一区二区网站| 亚洲欧美国产毛片在线| 国产精品99久久久久久久vr| 亚洲精品久久久一区二区三区| 亚洲韩国青草视频| 亚洲二区三区四区| 永久免费视频成人| 曰韩精品一区二区| 曰本成人黄色| 亚洲高清在线播放| 91久久国产自产拍夜夜嗨| 亚洲国产欧美一区| 亚洲精品视频在线播放| 亚洲精品一区在线| 在线亚洲一区观看| 亚洲在线观看视频| 亚洲欧美偷拍卡通变态| 亚洲欧美一级二级三级| 午夜精品久久久久影视| 羞羞视频在线观看欧美| 久久成人精品| 亚洲级视频在线观看免费1级| 亚洲日本久久| 一区二区三区日韩欧美| 亚洲视频观看| 欧美影院在线| 美女脱光内衣内裤视频久久网站| 蜜月aⅴ免费一区二区三区 | 久久久久久免费| 久久久久久亚洲综合影院红桃| 久久婷婷麻豆| 欧美国产第二页| 欧美日韩成人在线播放| 欧美性淫爽ww久久久久无| 国产精品青草久久| 国产在线拍揄自揄视频不卡99 | 欲色影视综合吧| 亚洲精品久久久久久久久| 中文亚洲欧美| 欧美一区二区三区喷汁尤物| 亚洲黄一区二区| 国产精品99久久久久久宅男| 欧美一区亚洲二区| 欧美91精品| 国产精品乱码一区二区三区| 国内精品久久久久久影视8| 亚洲黄色大片| 亚洲中字黄色| 亚洲精品日韩欧美| 亚洲免费在线视频一区 二区| 久久久久久久综合| 欧美日韩岛国| 韩国一区电影| 日韩一区二区精品| 欧美在线网址| 一区二区三区四区国产| 久久国产一区二区| 欧美日韩精品久久久| 国产亚洲精品7777| 亚洲伦理自拍| 久久se精品一区二区| 亚洲视频免费在线观看| 久久嫩草精品久久久精品| 欧美日韩网址| 国际精品欧美精品| 一区二区激情| 亚洲经典自拍| 欧美一二三区在线观看| 欧美人与性动交α欧美精品济南到| 国产日韩精品一区二区三区| 亚洲三级免费| 亚洲国产精品成人一区二区| 亚洲欧美怡红院| 欧美交受高潮1| 国产日产欧产精品推荐色| 亚洲日本一区二区| 亚洲电影免费观看高清完整版在线| 亚洲尤物在线| 欧美日韩1区2区3区| 国产主播一区二区| 亚洲图片欧洲图片av| 亚洲精品资源| 久久综合九色| 国产精品尤物| 一本一本久久a久久精品综合妖精| 亚洲成色777777在线观看影院| 亚洲欧美日韩国产一区| 欧美精品久久久久久久久老牛影院 | 国产精品videossex久久发布| 亚洲黄色一区二区三区| 亚洲电影第三页| 久久久久国产精品厨房| 国产精品欧美日韩一区| 99国产精品私拍| 亚洲精品亚洲人成人网| 麻豆精品精品国产自在97香蕉| 国产一区二区三区网站| 亚洲自拍偷拍色片视频| 亚洲一区国产精品| 欧美日韩免费高清| 日韩午夜精品视频| 一区二区三区免费观看| 欧美精品aa| 亚洲青涩在线| 亚洲狼人综合| 欧美激情精品| 日韩视频免费在线| 一区二区三区黄色| 欧美日韩免费观看一区=区三区| 亚洲激情啪啪| 一区二区免费看| 欧美日韩视频专区在线播放 | 亚洲午夜在线观看视频在线| 欧美日产一区二区三区在线观看| 亚洲国产日韩欧美综合久久| 亚洲激情精品| 欧美国产精品专区| 亚洲人成小说网站色在线| 亚洲伦理在线| 欧美日韩伊人| 夜夜夜精品看看| 亚洲欧美一区二区精品久久久| 国产精品女主播一区二区三区| 亚洲午夜av电影| 亚洲欧美日韩精品久久奇米色影视| 欧美性一二三区| 亚洲免费视频成人| 久久精品国产2020观看福利| 韩日视频一区| 亚洲欧洲日产国产网站| 欧美久久99| 一区二区日韩精品| 欧美一区二区视频97| 国模大胆一区二区三区| 亚洲国产成人高清精品| 欧美国产精品劲爆| 一区二区三区高清| 欧美一区免费视频| 怡红院av一区二区三区| 亚洲精品日日夜夜| 欧美日韩另类字幕中文| 亚洲尤物影院| 老**午夜毛片一区二区三区| 亚洲丶国产丶欧美一区二区三区 | 一本久久a久久免费精品不卡| 亚洲欧美视频一区| 国产一区二区三区久久久 | 夜夜夜久久久| 国产精品欧美在线| 亚洲承认在线| 欧美三区在线观看| 欧美一二三区精品| 欧美成人有码| 亚洲天堂av电影| 久久免费精品视频| 亚洲精品一区二区在线| 欧美一级视频精品观看| 在线激情影院一区| 亚洲自拍电影| 亚洲电影欧美电影有声小说| 亚洲一区二区三区高清| 国内精品**久久毛片app| 亚洲九九九在线观看| 国产精品外国| 亚洲国产精彩中文乱码av在线播放| 欧美日韩精品一区二区三区| 亚洲欧美中日韩| 欧美好骚综合网| 亚洲欧美日韩高清| 欧美电影在线免费观看网站| 亚洲一线二线三线久久久| 久久夜精品va视频免费观看| 日韩一级片网址| 久久这里有精品15一区二区三区| 亚洲美女性视频| 久久婷婷久久| 亚洲一区亚洲| 欧美精品久久99| 久久激情视频| 国产精品久久久久影院亚瑟| 亚洲韩国精品一区| 国产九色精品成人porny| 亚洲免费黄色| 激情文学综合丁香| 午夜在线a亚洲v天堂网2018| 亚洲国产一区二区三区a毛片 | 9色porny自拍视频一区二区| 久久综合999| 亚洲一区二区在线视频| 欧美激情精品久久久久久久变态 | 亚洲免费激情| 又紧又大又爽精品一区二区| 欧美一二三视频| 一区二区三区久久| 欧美日韩国产91|