• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 手機與無線通信 > 設(shè)計應用 > 基于pic單片機的模擬I2C通信

    基于pic單片機的模擬I2C通信

    作者: 時間:2011-05-28 來源:網(wǎng)絡 收藏

    本文引用地址:http://www.czjhyjcfj.com/article/156255.htm

    ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    ; File Name: i2c_low.asm
    ; Author: Alan G. Smith
    ; Purpose: This code is borrowed from Microchip with all of the fancy
    ; stuff taken out.
    ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    InitBusMaster

    ;************************************************************
    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
    ;************************************************************
    Abort
    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 Data ; 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


    上一頁 1 2 下一頁

    關(guān)鍵詞: I2C 通信 模擬 單片機 pic 基于

    評論


    相關(guān)推薦

    技術(shù)專區(qū)

    關(guān)閉
    主站蜘蛛池模板: 桑日县| 乌兰察布市| 容城县| 德昌县| 建湖县| 赤峰市| 万宁市| 盐源县| 江口县| 玉溪市| 乌审旗| 鄯善县| 荔波县| 靖边县| 清丰县| 洛阳市| 永丰县| 海盐县| 股票| 平塘县| 天等县| 青铜峡市| 岢岚县| 盘山县| 原平市| 天祝| 拜城县| 关岭| 米泉市| 叶城县| 新蔡县| 兴城市| 米泉市| 灌云县| 贡山| 中山市| 湾仔区| 长治市| 凤台县| 景德镇市| 珠海市|