您的位置:首页单片机义隆单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

EM78系列单片机--I2C串行总线的控制

[日期:2008-07-01 ] [来源:东哥单片机学习网 www.picavr.com 整理 作者:佚名] [字体: (投递新闻)
SEEPROM 写入数据传送格式如下:
START
从地址
0
A
地址字节
A
数据字节1
A
数据字节N
A
STOP
A为从设备的确认位。
SEEPROM 读出数据传送格式如下:(A为确认位。)
START
从地址
0
A
地址字节
A
START
从地址
1
A
数据字节
A
。。。
最后字节
STOP
图  5.10 程序流程图
3.参考例程
;*****************************************************************************
;**  EM78单片机与24Cxx / 85Cxx 串行CMOS EEPROM接口I2C总线读/写的程序
;**  (所有时隙均基于2MHZ晶体震荡器频率)
;*****************************************************************************
;       存储器定义
PC      EQU     2               ; Program counter
STAT    EQU     3               ; EM78 status byte
FSR     EQU     4               ; RAM 选择寄存器
P5      EQU     5               ; Port A use to select device address
P6      EQU     6               ; P6.7 = SDA, P6.6 = SCL
;
STATUS  EQU     08              ; Status register
FLAG    EQU     09              ; Common flag bits register
EEPROM  EQU     0A              ; Bit buffer
ERCODE  EQU     0B              ; Error code (to indicate bus status)
ADDR    EQU     10  &, nbsp;           ; Address register
DATAI   EQU     11              ; Stored data input register
DATAO   EQU     12              ; Stored data output register
SLAVE   EQU     13              ; Device address (1010xxx0)
TXBUF   EQU     14              ; TX buffer
RXBUF   EQU     15              ; RX buffer
COUNT   EQU     16          ,     ; Bit counter
TIMER0  EQU     18              ; Delay timer0
TIMER1  EQU     19              ; Delay timer1
;-----------------------------------------------------------------------------
;                     位定义
; Status bits
Z       EQU     2
C       EQU     0
; FLAG Bits
ERROR   EQU     0               ; Error flag
; EEPROM Bits
DI      EQU     7               ; EEPROM input
DO      EQU     6               ; EEPROM output
; I2C Device Bits
SDA     EQU     7               ; P6.7, data in/out
SCL     EQU     6               ; P6.6, serial clock
;-----------------------------------------------------------------------------
;       两线I2C - CPU 通信错误状态表和子程序
;  input  :     W-reg   = error code
;  output :     ERCODE  = error code
;           FLAG(ERROR) = 1
;         code          error status mode
;       -------         ------------------------------------------------------
;           1   :       SCL locked low by device (bus is still busy)
;           2   :       SDA locked low by device (bus is still busy)
;           3   :       No acknowledge from device (no handshake)
;           4   :       SDA bus not released for master to generate STOP bit
;-----------------------------------------------------------------------------
    org     0x0000
        JMP     start
;按照错误状态表识别SCL状态和SDA数据子程序
ERR
        JBS     FLAG,ERROR      ; Remain as first error encountered
        MOV     ERCODE,A          ; Save error code
        BS      FLAG,ERROR      ; Set error flag
        RET    
;-----------------------------------------------------------------------------
;       启动总线通信程序
;       input   : none
;       output  : initialize bus communication
;-----------------------------------------------------------------------------
;Generate START bit (SCL is high while SDA goes from high to low transition)
;and check status of the serial clock.
BSTART
        MOV     A,@B'00111111'     ; Put SCL, SDA line in output state
        IOW     P6
        bs      P6,SDA          ;make sure sda is high
        BS      P6,SCL          ; Set clock high
        MOV     A,@1               ; Ready error status code 1
        JBS     P6,SCL          ; Locked?
        CALL    ERR             ; SCL locked low by device
        BC      P6,SDA          ; SDA goes low during SCL high
    NOP                     ; Timing adjustment
        NOP
        NOP
        BC      P6,SCL          ; Start clock train
        RET    
;-----------------------------------------------------------------------------
;       启动总线通信程序
;       Input   :       None
;       Output  :       Bus communication, STOP condition
;-----------------------------------------------------------------------------
;Generate STOP bit (SDA goes from low to high during SCL high state)
;and check bus conditions.
BSTOP
        MOV     A,@B'00111111'     ; Put SCL, SDA line in output state
        IOW     P6
        BC      P6,SDA          ; Return SDA to low
        BS      P6,SCL          ; Set SCL high
        nop
        nop
        MOV     A,@1               ; Ready error code 1
        JBS     P6,SCL          ; High?
        CALL    ERR             ; No, SCL locked low by device
        BS      P6,SDA          ; SDA goes from low to high during SCL high
        MOV     A,@4               ; Ready error code 4
        JBS     P6,SDA          ; High?
        CALL    ERR             ; No, SDA bus not release for STOP
        RET   
END SUB
;-----------------------------------------------------------------------------
;       从EM78 发送数据到串行EEPROM, 一位一位子程序
;       Input   :       None
;       Output  :       To (DI) of serial EEPROM device
;-----------------------------------------------------------------------------
BITIN
        MOV     A,@B'10111111'     ; Force SDA line as input
        IOW     P6
        BS      P6,SDA          ; Set SDA for input
        BC      EEPROM,DI
        BS      P6,SCL          ; Clock high
        MOV     A,@1
        JBS     P6,SCL          ; Skip if SCL  is high
        JMP     BIT1
        JBS     FLAG,ERROR      ; Remain as first error encountered
        MOV     ERCODE,A          ; Save error code
        BS      FLAG,ERROR      ; Set error flag
BIT1
        JBC     P6,SDA          ; Read SDA pin
        BS      EEPROM,DI       ; DI = 1
    NOP                     ; Delay
        BC      P6,SCL          ; Return SCL to low    
        RET   
;-----------------------------------------------------------------------------
;       从串行EEPROM 接收数据, 一位一位子程序
;       Input   :       EEPROM file
;       Output  :       From (DO) of serial EEPROM device to PIC
;-----------------------------------------------------------------------------
BITOUT
        MOV     A,@B'00111111'     ; Set SDA, SCL as outputs
        IOW     P6
        JBS     EEPROM,DO
        JMP     BIT0
        BS      P6,SDA          ; Output bit 0
        MOV     A,@2
        JBC     P6,SDA          ; Check for error code 2
        JMP     CLK1
        JBS     FLAG,ERROR      ; Remain as first error encountered
        MOV     ERCODE,A          ; Save error code
        BS      FLAG,ERROR      ; Set error flag
        JMP     CLK1            ; SDA locked low by device
BIT0
        BC      P6,SDA          ; Output bit 0
        NOP                     ; Delay
        NOP
        NOP
CLK1:  BS      P6,SCL
        MOV     A,@1               ; Error code 1
        JBC     P6,SCL          ; SCL locked low?
        JMP     BIT2            ; No.
        JBS     FLAG,ERROR      ; Yes.
        MOV     ERCODE,A          ; Save error code
        BS      FLAG,ERROR      ; Set error flag
BIT2:  NOP
        NOP
        BC      P6,SCL          ; Return SCL to low
        RET   
12下一页  GO
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐