微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > at24c02 iic

at24c02 iic

时间:10-02 整理:3721RD 点击:
为什么我的程序跑不了,求救各位大虾T,.T
include"at 24c02.h"
org  0x00
start:
R:
                call I2C_INIT
             mov  a,@0x55
                mov  I2C_DATA,a
            call I2C_WRITE_BYTE
                call I2C_READ_BYTE
               
                        call I2C_WRITE_BYTE
                        call I2c_SequentialRead
                 
                nop
                JMP  R
ret

/*--------------------------------------------------------------
                    24C02送数据/命令程序
入口 : I2C_ADDR 地址
        I2C_DATA 数据
出口 : 无
----------------------------------------------------------------*/
if I2C_SEQU_OP==1
I2C_PAGE_WRITE:
               call I2c_Start ; write command
               mov a,@0xa0
               call SendByte
               call I2C_CHACK__ACK
               mov a,I2C_ADDR
               call SendByte
               call I2C_CHACK__ACK

              ;--------------------------------
               mov a,@WRITE_NUM ; 连续写字节数量    3
               mov I2C_CNT_NUM,a
               mov a,@WRITE_BUF ; 缓冲区首地址    0x20
               mov r4,a
I2C_PAGE_LOOP:
               mov a,r0 ; 从缓存取一个数据
               call SendByte
               call I2C_CHACK__ACK
               inc r4 ; 缓存地址加一
               djz I2C_CNT_NUM
               jmp I2C_PAGE_LOOP
              ;--------------------------------
               call I2c_StOP
ret
endif
/*-----------------------------------------------------------
                     连续读取多个字节
入口: I2C_ADDR E2PROM开始地址
出口: I2C_DATA 数据
说明: 缓存的入口地址和读数据数量在头文件中宏定义
       也可以用寄存器传递。
;-----------------------------------------------------------*/
if I2C_SEQU_OP==1
I2c_SequentialRead:
               call I2c_Start ; COMMAND 先启动到 Random Read模式
               mov a,@0xa0  
               call SendByte
               call I2C_CHACK__ACK
               mov a,I2C_ADDR
               call SendByte
               call I2C_CHACK__ACK
               call I2C_START ; CURRENT READ
               mov a,@0xa1
               call SendByte
               call I2C_CHACK__ACK
                      

              ;-------------------------------- ; 连续读取指定个数据存到连续区域
               mov a,@READ_NUM  ;3
               mov I2C_CNT_NUM,a ; 连续读READ_NUM个数据
               mov a,@READ_BUF    ;2a
               mov r4,a ; 数据存放的缓存地址  
I2c_Sequential_loop:
               call ReadByte ; 读取一个数据
               mov I2C_DATA,a
               call I2c_Ack
               mov a,I2C_DATA
               mov r0,a ; 保存
               inc r4 ; 地址加一
               djz I2C_CNT_NUM
               jmp I2c_Sequential_loop
ret
endif
/******************************************************/
I2C_WRITE_BYTE:
    call  I2C_START
    mov   a,@0XA0;写命令       
    call  SENDBYTE       
    call  I2C_CHACK__ACK
    mov   a,I2C_ADDR
    call  SENDBYTE
    mov   a,I2C_DATA ;写入数据
    call  SENDBYTE
    call  I2C_CHACK__ACK:
    call  I2C_STOP
RET
;----------------------------------------------
;----------------------------------------------
I2C_READ_BYTE:
    call   I2C_START
    mov    a,@0XA0;
    call   SENDBYTE
    call   I2C_CHACK__ACK:
    mov    a,I2C_ADDR
    call   SENDBYTE
    call   I2C_CHACK__ACK:
;--------------------------------
    call   I2C_START
    mov    a,@0XA1
    call   SENDBYTE
    call   I2C_CHACK__ACK:
    call   READBYTE
    mov    a,I2C_DATA
    call   SENDBYTE
    call   I2C_STOP
RET
;--------------------------------------
;--------------------------------------
I2C_CHACK__ACK:
    clr  temp0
    BS SDA
    ;------------------
    mov a,@0xff
    IOW PORT6
    ;
call delay
    BS SCL
weit:   
         NOP
         NOP
    ;
    JBC  SDA
    jmp  weit  ;等待应答信号
    INC  temp0  ; temp = 1 有响应, temp = 0 没有响应
call delay
    BC   SCL
    ;------------------
    MOV A,@0X00
    IOW PORT6
ret
;------------------------------------
;-------------------------------------  
I2C_START:
         BS  SDA
         BS  SCL
call delay   
         BC  SDA
         NOP
call delay
         BC  SCL
RET
;------------------------------------
;------------------------------------
I2C_STOP:
         BC  SDA
         BS  SCL
         NOP
call delay   
         BS  SDA
         NOP
call delay
                  BS  SCL
RET
;----------------------------------------
;----------------------------------------
I2C_ACK:
        BC  SDA
call delay
        BS  SCL
call delay
        BC  SCL
RET
;----------------------------------------
;-----------------------------------------
I2C_NOACK:
        BS SDA
call delay
        BS  SCL
call delay
        BC  SCL
RET
;-------------------------------------------
;-------------------------------------------
SENDBYTE:
        MOV           A,@0x00
        IOW    Port6
        mov    temp0,a
        mov    a,@8
        mov    I2C_BYTE_CNT,a
        bc     scl
SEND_LOOP:
        RLC  temp0  ;MSB
        JBS  0X03,0 ;状态标志位
        JMP  $+3
        BS  SDA
        JMP  $+2
        BC  SDA
call delay
        BS  SCL
call delay
        BC  SCL
call delay
        DJZ  I2C_BYTE_CNT
        JMP  SEND_LOOP
        MOV           A,@0x00
        IOW    Port6          
       
       
RET
           
       
;---------------------------------------
;---------------------------------------
READBYTE:
;----------------------       
        mov  a,@0X01
        IOW  PORT6
;clr I2C_DATA

    mov  a,@8
        mov  I2C_BYTE_CNT,a
       
        bc  scl
                call delay
    bs  sda
            call delay
READ_LOOP:
    bs   SCL
            call delay
    rlc          I2C_DATA            
        BC    I2C_DATA,0
        JBC     SDA
        BS    I2C_DATA,0
             call delay
        Bc   SCL
                call delay
        DJZ  I2C_BYTE_CNT
        JMP  READ_LOOP
;---------------------
        mov  a,@0x00
        IOW PORT6
        mov  a,I2C_DATA   
RET
;--------------------------------------------------
;--------------------------------------------------
I2C_INIT:
                        MOV           A,@0X0E            ;4E: 上升沿触发,CE: 下降沿触发
                        BS     IOCS                        ;选择IOC51-IOCF1 R3 (状态寄存器)IO控制寄存器段选择位 1: 选择段1 (IOC51 ~ IOCC1)
       
                        MOV    A,@0X00
                        IOW    P6HCR                ;p6口内置上拉0x00 (下拉控制寄存器)
                        ;
                        BC     IOCS                        ;选择IOC50-IOCF0
                        MOV    A,@0x00
                        IOW    IOCC0                ;全部p6口开漏输出0xff (漏极开路控制寄存器)
                        ;
                        MOV    A,@0x00
                        IOW           IOCD0                ;p5上拉0x00  (上拉控制寄存器)
                        ;
                        MOV    A,@0xff
                        IOW    IOCB0                ;关闭P5下拉0xff (下拉控制寄存器)
                        ;               
                        MOV           A,@0X00                ;0 输入
                        IOW    IOC60                                                       
                        RET       
                       
;I2C_INIT:
;       mov  a,@0x01
  ;           IOW  SDA_PORT
   ;   
        ;    mov  a,@0x00
         ;   IOW  SCL_PORT
   ;
    ;         mov  a,@0x0d
     ;   IOW  P5
      ;  IOW  P6
      ;RET  
delay:

        mov a, @0x0b    ; 4us延迟
        mov temp0,a
B:     djz temp0
        jmp B
        nop
        clr temp0
ret


;-------------------------------------------------------

小编,碉堡了,。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top