原创
FM24CL04.asm
2008-9-15 09:34
2640
6
3
分类:
软件与OS
; FM24CL04铁电存储器的模拟IIC传输测试及其子程序
; 新华龙C8051F020芯片
; 外部时钟,11.0592Mhz
; 模拟IIC
$INCLUDE (C8051F020.INC)
ORG 0000H
LJMP MAIN
MAIN:
MOV SP, #60H
LCALL OTER_INIT
LCALL SYSCLK_INIT
LCALL SWITCH_INIT
LCALL WRDATA
LOOP:
LCALL FRAM
SJMP LOOP
;;--------------------------------
;;其它初始化操作
;;--------------------------------
OTER_INIT:
;;看门狗
CLR EA
MOV WDTCN,#0DEH ;DISABLE WATCHDOG
MOV WDTCN,#0ADH
SETB EA
ORL EMI0CF,#00100011B ;XRAM IN HIGH PORTS
RET
;;--------------------------------
;;时钟
;;--------------------------------
SYSCLK_INIT:
MOV OSCXCN,#67H
CLR A
DJNZ ACC,$
DJNZ ACC,$
DJNZ ACC,$
OSC_WAIT: NOP
MOV A,OSCXCN
JNB ACC.7,OSC_WAIT
MOV OSCICN,#88H ;SELECTED EX_CLK
RET
;;--------------------------------
;;交叉开关及I/O口的输入输出方式
;;--------------------------------
SWITCH_INIT:
MOV XBR0,#00000101B ;UART0, SMBUS
MOV XBR1,#00010100B ;INT1, INT0
MOV XBR2,#01000100B ;ENABLED, UART1
MOV P0MDOUT,#00H
MOV P1MDIN,#0FFH
MOV P1MDOUT,#00H
MOV P2MDOUT,#00H
MOV P3MDOUT,#00H
MOV P3IF,#00H
MOV P74OUT,#00H
RET
;;-----------------------
;;测试数据写程序
;;-----------------------
WRDATA:MOV R1,#0AH
MOV R0,#WR_BUF
WR_L: MOV @R0,#0AAH
INC R0
DJNZ R1,WR_L
RET
;;-----------------------
;;测试
;;-----------------------
FRAM:
CLR WP
MOV N,#10
MOV POINTER,#10H
LCALL WR_NB ;在小于256B空间内写入10B
MOV N,#10
MOV POINTER,#10H
LCALL RD_NB ;在小于256B空间内读出10B
MOV N,#10
MOV POINTERH,#01H
MOV POINTERL,#0F0H
LCALL WR_NBHL ;在大于256B空间内写入10B
MOV N,#10
MOV POINTERH,#01H
MOV POINTERL,#0F0H
LCALL RD_NBHL ;在大于256B空间内读出10B
RET
;***************************************************************************
SDA2 BIT P1.3
SCL2 BIT P1.4
WP BIT P1.5
POINTERH EQU 1FH ;高位地址,空间大于256B时用
POINTERL EQU 1EH ;低位地址,空间大于256B时用
POINTER EQU 20H ;一般地址,空间在256B以下时用
WR_BUF EQU 23H ;欲写的数据缓冲区首址
RD_BUF EQU 33H ;欲读的数据缓冲区首址
N EQU 22H ;字节个数
DEVICE EQU 21H ;器件地址
;;-----启动-----;;
START:LCALL DEL5US
SETB SDA2
LCALL DEL5US
SETB SCL2
LCALL DEL5US
CLR SDA2
LCALL DEL5US
CLR SCL2
LCALL DEL5US
RET
;;-----结束-----;;
STOP:LCALL DEL5US
SETB SCL2
LCALL DEL5US
SETB SDA2
LCALL DEL5US
RET
;;-----应答检查-----;;
CACK:SETB SDA2
LCALL DEL5US
SETB SCL2
LCALL DEL5US
MOV C,SDA2
JC CACK
CLR SCL2
CLR SDA2
LCALL DEL1MS
RET
;;-----应答-----;;
MACK:CLR SDA2
LCALL DEL5US
SETB SCL2
LCALL DEL5US
CLR SCL2
LCALL DEL5US
SETB SDA2
RET
;;-----按顺序写字节数据-----;;
;;入口:ACC
;;资源占用:A、R0、CY、F0、R2
IWRB:LCALL START
MOV A,#0A0H
LCALL WR8BIT
LCALL CACK
MOV A,WR_BUF
LCALL WR8BIT
LCALL CACK
IWEXIT:
LCALL STOP
LCALL DEL10MS
RET
;;-----按顺序读字节数据-----;;
;;入口:从器件地址DEVICE
;;出口:数据读入ACC
;;资源占用:A、R0、CY、F0
IRDB:LCALL START
MOV A,#0A1H
LCALL WR8BIT
LCALL CACK
LCALL RD8BIT
IREXIT:
LCALL STOP
RET
;;-----向从器件指定单元写N个字节数据-----;;
;;入口:传递的地址在POINTER,数据在WR_BUF中,发送字节数在N中
;;资源占用:ACC、R0、R1、R3、C
WR_NB:SETB SDA2
SETB SCL2
LCALL START
MOV A,#0A0H
LCALL WR8BIT
LCALL CACK
MOV A,POINTER
LCALL WR8BIT
LCALL CACK
MOV R3,N
MOV R1,#WR_BUF
WRNB1:MOV A,@R1
LCALL WR8BIT
LCALL CACK
INC R1
DJNZ R3,WRNB1
LCALL STOP
LCALL DEL10MS
RET
;;-----从从器件指定单元读N个字节数据-----;;
;;入口:传递的地址在POINTER,接收数据缓冲区RD_BUF,接收字节数在N中
;;资源占用:ACC、R0、R1、R3、C
RD_NB:MOV R3,N
RDNB1:LCALL START
MOV A,#0A0H
LCALL WR8BIT
LCALL CACK
MOV A,POINTER
LCALL WR8BIT
LCALL CACK
LCALL START
MOV A,#0A1H
LCALL WR8BIT
LCALL CACK
MOV R1,#RD_BUF
RDB: LCALL RD8BIT
MOV @R1,A
DJNZ R3,SACK
LCALL STOP
RET
SACK: INC R1
LCALL MACK
SJMP RDB
;;-----字节发送-----;;
;;入口:要发送的数据在ACC中
;;每发送完一个字节,要调用一次CACK,以判断是否有应答
WR8BIT:PUSH ACC
MOV R0,#08H
WR_BIT:RLC A
MOV SDA2,C
LCALL DEL5US
SETB SCL2
LCALL DEL5US
CLR SCL2
DJNZ R0,WR_BIT
POP ACC
RET
;;-----字节接收-----;;
;;出口:接收到的数据在ACC中
;;每接收完一个字节,要调用一MCACK/MNACK
RD8BIT:MOV R0,#08H
RD_BIT:SETB SDA2
LCALL DEL5US
SETB SCL2
LCALL DEL5US
MOV C,SDA2
RLC A
LCALL DEL5US
CLR SCL2
DJNZ R0,RD_BIT
CLR SDA2
RET
;;-----5US-----;;
DEL5US:NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RET
;;-----1MS-----;;
DEL1MS:MOV R4,#200
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R4,$-3
RET
;;-----10MS-----;;
DEL10MS:MOV R5,#10
NOP
LCALL DEL1MS
NOP
NOP
DJNZ R5,$-3
RET
;;-----向从器件指定单元写N个字节数据(>256B的EEPROM)-----;;
;;入口:传递的地址在POINTER,数据在WR_BUF中,发送字节数在N中
;;资源占用:ACC、R0、R1、R3、C
WR_NBHL:SETB SDA2
SETB SCL2
LCALL START
MOV A,#0A0H
LCALL WR8BIT
LCALL CACK
MOV A,POINTERH
LCALL WR8BIT
LCALL CACK
MOV A,POINTERL
LCALL WR8BIT
LCALL CACK
MOV R3,N
MOV R1,#WR_BUF
WRNB1HL:MOV A,@R1
LCALL WR8BIT
LCALL CACK
INC R1
DJNZ R3,WRNB1HL
LCALL STOP
LCALL DEL10MS
RET
;;-----从从器件指定单元读N个字节数据(>256B的EEPROM)-----;;
;;入口:传递的地址在POINTER,接收数据缓冲区RD_BUF,接收字节数在N中
;;资源占用:ACC、R0、R1、R3、C
RD_NBHL:MOV R3,N
RDNB1HL:LCALL START
MOV A,#0A0H
LCALL WR8BIT
LCALL CACK
MOV A,POINTERH
LCALL WR8BIT
LCALL CACK
MOV A,POINTERL
LCALL WR8BIT
LCALL CACK
LCALL START
MOV A,#0A1H
LCALL WR8BIT
LCALL CACK
MOV R1,#RD_BUF
RDBHL: LCALL RD8BIT
MOV @R1,A
DJNZ R3,SACKHL
LCALL STOP
RET
SACKHL: INC R1
LCALL MACK
SJMP RDBHL
;***************************
END
文章评论(0条评论)
登录后参与讨论