PIC单片机论坛
直播中

CALLME茶米

9年用户 9经验值
私信 关注
[问答]

at24c02 iic

为什么我的程序跑不了,求救各位大虾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





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

回帖(1)

杨永胜

2016-1-10 16:47:27
楼主,碉堡了,。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分