📄 i2cslave.lst
字号:
I2CSLAVE PAGE 1
1 ;======================================================================
2 ;
3 ; Author : ADI - Apps www.analog.com/MicroConverter
4 ;
5 ; Date : Oct 2000
6 ;
7 ; File : i2cslave.asm
8 ;
9 ; Hardware : ADuC831
10 ;
11 ; Description : Code for a slave in an I2C system. This code will
12 ; continuously receive and transmit a byte over the I2C
13 ; interface, then send the received byte out the UART,
14 ; then check if a character had been entered in the UART.
15 ; If so, it will send the ASCII value of the character
16 ; entered to the slave, the next time it transmits a byte.
17 ;
18 ; Reference : Tech Note, uC001: "MicroConverter I2C Compatible
19 ; Interface" find it at www.analog.com/microconverter
20 ;
21 ;======================================================================
22
23 $MOD831
24
25 ;____________________________________________________________________
26 ; DEFINE VARIABLES IN INTERNAL RAM
27
0030 28 BYTECNT DATA 30h ; byte counter for I2C routines
0031 29 INPUT DATA 31h ; data recieved from master
0032 30 OUTPUT DATA 32h ; data to be transmitted to master
31
0000 32 GO BIT 00h ; flag to wait for interrupts
0001 33 FIRST BIT 01h ; flag to indicate first receive Int
34
00B4 35 LED EQU P3.4 ; P3.4 drives the LED on eval board
36
37 ;____________________________________________________________________
38 ; BEGINNING OF CODE
---- 39 CSEG
0000 40 ORG 0000h
0000 020060 41 JMP MAIN
42 ;____________________________________________________________________
43 ; INT0 ISR
0003 44 ORG 0003h
0003 0532 45 INC OUTPUT
0005 32 46 RETI
47 ;____________________________________________________________________
48 ; I2C ISR
003B 49 ORG 003Bh
50
003B 20E90B 51 JB I2CTX, SLAVE_TRANSMITTER
52
003E 53 SLAVE_RECEIVER:
003E 200110 54 JB FIRST, ENDINT1 ; if first INT then wait for next int
0041 D200 55 SETB GO ; reception complete
0043 859A31 56 MOV INPUT, I2CDAT ; store data received in INPUT
0046 020051 57 JMP ENDINT1
58
I2CSLAVE PAGE 2
0049 59 SLAVE_TRANSMITTER:
0049 D200 60 SETB GO ; transmission complete
004B 85329A 61 MOV I2CDAT, OUTPUT ; move data to be transmitted into I2CDAT
004E 020053 62 JMP ENDINT2 ; Note: On the ADuC824/816 the read or
63 ; write of I2CDAT register
64 ; automatically clears i2ci. If
65 ; I2CI is cleared twice then the
66 ; microconverter will hang.)
67
0051 68 ENDINT1:
0051 C2E8 69 CLR I2CI ; clear I2C interrupt bit (812 only)
0053 70 ENDINT2:
0053 C201 71 CLR FIRST ; address has already been received
0055 32 72 RETI
73
74 ;____________________________________________________________________
75 ; MAIN PROGRAM
0060 76 ORG 0060h
0060 77 MAIN:
78
0060 759E85 79 MOV T3CON,#085H
0063 759D08 80 MOV T3FD,#08H
0066 759852 81 MOV SCON,#52H
82
83 ;configure and enable interrupts
84 ; MOV IE2,#01h ; enable I2C interrupt
0069 75A901 85 MOV IEIP2,#01h ; enable I2C interrupt
006C D2A8 86 SETB EX0 ; enable INT0
006E D288 87 SETB IT0 ; INT0 edge triggered
0070 D2AF 88 SETB EA ; allow all the interrupts
89
90 ;initialize settings
0072 759B44 91 MOV I2CADD,#044h ; slave address is 44h
0075 75E800 92 MOV I2CCON,#00h ; slave mode (default=>not necessary)
0078 C200 93 CLR GO ; clear flag to wait for interrupt
94 ; GO is set once data is TX'd or RX'd
007A D201 95 SETB FIRST ; FIRST is cleared after receiving the
96 ; first SLAVE receiver interrupt
97
007C 753200 98 MOV OUTPUT,#0 ; first byte to be transmitted is 40h
007F D2B4 99 SETB LED
100
0081 101 WAITFORDATA:
0081 3000FD 102 JNB GO,$ ; ----- wait for i2c interrupt ------
103 ; If it is in receive mode, it will
104 ; wait here for a second interrupt (as
105 ; the first interrupt only contains the
106 ; slave address in I2CDAT).
107 ; In transmit mode the tranmission will
108 ; occur after the first interrupt.
0084 D201 109 SETB FIRST ; re-initialise flags
0086 C200 110 CLR GO
0088 20E9F6 111 JB I2CTX,WAITFORDATA
112 ; if the slave has just transmitted then
113 ; wait to receive a byte
114 ; if the slave has just received then
115 ; send input up the UART
116
I2CSLAVE PAGE 3
008B 117 SENDUART:
008B B2B4 118 CPL LED ; LED changes each time one byte has been
119 ; received and another transmitted
120
008D E531 121 MOV A,INPUT ; send value received out the UART
008F 1200BA 122 CALL SENDVAL
0092 740A 123 MOV A,#10
0094 1200A6 124 CALL SENDCHAR ; send LF + CR
0097 740D 125 MOV A,#13
0099 1200A6 126 CALL SENDCHAR
127
009C 3098E2 128 JNB RI, WAITFORDATA ; repeat (unless UART data received)
129
130 ; WHEN UART DATA RECEIVED, MOVE DATA TO I2C OUTPUT...
131
009F 859932 132 MOV OUTPUT, SBUF ; update OUTPUT byte to new value
00A2 C298 133 CLR RI ; must clear RI
00A4 80DB 134 JMP WAITFORDATA ; back to main loop
135
136
137 ;======================================================================
138 ; SUBROUTINES
139 ;======================================================================
140
141 ;____________________________________________________________________
142 ; SENDCHAR
143 ; sends ASCII value contained in A to UART
144
00A6 145 SENDCHAR:
00A6 3099FD 146 JNB TI,$ ; wait 'til present char gone
00A9 C299 147 CLR TI ; must clear TI
00AB F599 148 MOV SBUF,A
00AD 22 149 RET
150 ;____________________________________________________________________
151 ; HEX2ASCII
152 ; converts A into the hex character representing the value of A's
153 ; least significant nibble
154
00AE 155 HEX2ASCII:
00AE 540F 156 ANL A,#00Fh
00B0 B40A00 157 CJNE A,#00Ah,$+3
00B3 4002 158 JC IO0030
00B5 2407 159 ADD A,#007h
00B7 2430 160 IO0030: ADD A,#'0'
00B9 22 161 RET
162 ;____________________________________________________________________
163 ; SENDVAL
164 ; converts the hex value of A into two ASCII chars, and then spits
165 ; these two characters up the UART. does not change the value of A.
166
00BA 167 SENDVAL:
00BA C0E0 168 PUSH ACC
00BC C4 169 SWAP A
00BD 11AE 170 CALL HEX2ASCII
00BF 11A6 171 CALL SENDCHAR ; send high nibble
00C1 D0E0 172 POP ACC
00C3 C0E0 173 PUSH ACC
00C5 11AE 174 CALL HEX2ASCII
I2CSLAVE PAGE 4
00C7 11A6 175 CALL SENDCHAR ; send low nibble
00C9 D0E0 176 POP ACC
00CB 22 177 RET
178 ;____________________________________________________________________
179
180 END
VERSION 1.2h ASSEMBLY COMPLETE, 0 ERRORS FOUND
I2CSLAVE PAGE 5
ACC. . . . . . . . . . . . . . . D ADDR 00E0H PREDEFINED
BYTECNT. . . . . . . . . . . . . D ADDR 0030H NOT USED
EA . . . . . . . . . . . . . . . B ADDR 00AFH PREDEFINED
ENDINT1. . . . . . . . . . . . . C ADDR 0051H
ENDINT2. . . . . . . . . . . . . C ADDR 0053H
EX0. . . . . . . . . . . . . . . B ADDR 00A8H PREDEFINED
FIRST. . . . . . . . . . . . . . B ADDR 0001H
GO . . . . . . . . . . . . . . . B ADDR 0000H
HEX2ASCII. . . . . . . . . . . . C ADDR 00AEH
I2CADD . . . . . . . . . . . . . D ADDR 009BH PREDEFINED
I2CCON . . . . . . . . . . . . . D ADDR 00E8H PREDEFINED
I2CDAT . . . . . . . . . . . . . D ADDR 009AH PREDEFINED
I2CI . . . . . . . . . . . . . . B ADDR 00E8H PREDEFINED
I2CTX. . . . . . . . . . . . . . B ADDR 00E9H PREDEFINED
IEIP2. . . . . . . . . . . . . . D ADDR 00A9H PREDEFINED
INPUT. . . . . . . . . . . . . . D ADDR 0031H
IO0030 . . . . . . . . . . . . . C ADDR 00B7H
IT0. . . . . . . . . . . . . . . B ADDR 0088H PREDEFINED
LED. . . . . . . . . . . . . . . NUMB 00B4H
MAIN . . . . . . . . . . . . . . C ADDR 0060H
OUTPUT . . . . . . . . . . . . . D ADDR 0032H
P3 . . . . . . . . . . . . . . . D ADDR 00B0H PREDEFINED
RI . . . . . . . . . . . . . . . B ADDR 0098H PREDEFINED
SBUF . . . . . . . . . . . . . . D ADDR 0099H PREDEFINED
SCON . . . . . . . . . . . . . . D ADDR 0098H PREDEFINED
SENDCHAR . . . . . . . . . . . . C ADDR 00A6H
SENDUART . . . . . . . . . . . . C ADDR 008BH NOT USED
SENDVAL. . . . . . . . . . . . . C ADDR 00BAH
SLAVE_RECEIVER . . . . . . . . . C ADDR 003EH NOT USED
SLAVE_TRANSMITTER. . . . . . . . C ADDR 0049H
T3CON. . . . . . . . . . . . . . D ADDR 009EH PREDEFINED
T3FD . . . . . . . . . . . . . . D ADDR 009DH PREDEFINED
TI . . . . . . . . . . . . . . . B ADDR 0099H PREDEFINED
WAITFORDATA. . . . . . . . . . . C ADDR 0081H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -