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