原创
FM24CL04.asm
2008-9-15 09:34
2652
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条评论)
登录后参与讨论