📄 upsd_i2c.lst
字号:
C51 COMPILER V7.00 UPSD_I2C 11/13/2002 09:49:12 PAGE 1
C51 COMPILER V7.00, COMPILATION OF MODULE UPSD_I2C
OBJECT MODULE PLACED IN upsd_i2c.OBJ
COMPILER INVOKED BY: E:\KEIL\C51\BIN\C51.EXE upsd_i2c.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*----------------------------------------------------------------------------
2 Title: upsd_i2c.c
3 Date: July 22, 2002
4 Author: Alec Bath
5
6 Description: I2C Routines for DK3200 Board
7
8 Copyright 2002 ST Microelectronics
9 This example demo code is provided as is and has no warranty,
10 implied or otherwise. You are free to use/modify any of the provided
11 code at your own risk in your applications with the expressed limitation
12 of liability (see below) so long as your product using the code contains
13 at least one uPSD products (device).
14
15 LIMITATION OF LIABILITY: NEITHER STMicroelectronics NOR ITS VENDORS OR
16 AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA,
17 INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR
18 CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR
19 OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
20 ----------------------------------------------------------------------------*/
21
22 #pragma CODE // include assembly in .lst file
23
24 #include "upsd3200.h"
25 #include "upsd_hardware.h"
26 #include "upsd_i2c.h"
27 #include "upsd_timer.h" // timer fns for timeout, etc.
28 //#include "lcd_io.h"
29
30 xdata unsigned char i2c_xmit_buf[256]; // message xmit buffer
31 xdata unsigned char i2c_rcv_buf[256]; // message rcv buffer
32 unsigned int i; // array pointer
33 unsigned char dummybyte, i2c_timeout; // dummy byte to rcv, timeout cntr
34 bit i2c_init_flag, i2cwait, i2c_master, i2c_xmitr; // callable status flag bits
35 bit bus_lost_flag, slave_nack_flag, i2c_timeout_flag; // error flag bits
36
37 //--------------------------------------------------
38 // I2C Initialization Routine
39 //--------------------------------------------------
40
41 void upsd_i2c_init (void){
42 1 P3SFS |= 0xC0; // Enable P3.7 for SCL, P3.6 for SDA
43 1 S2CON |= 0x81; // Setup I2C-2 for 83KHz (40MHz XTAL)
44 1 i2c_init_flag = 1; // set init done flag
45 1 i2c_timeout_flag = 0; // clear timeout error flag
46 1 PX1 = 0; // set low priority for INT1
47 1 IPA |= 0x02; // set high priority for EI2C
48 1 IEA |= 0x02; // set EI2C I2C Int. Enable bit
49 1 EX1 = 1; // set EX1 Int. Enable bit (INT1)
50 1 }
51
52 //--------------------------------------------------
53 // I2C Transmit Data Routine
54 //--------------------------------------------------
55
C51 COMPILER V7.00 UPSD_I2C 11/13/2002 09:49:12 PAGE 2
56 void upsd_i2c_xmit (unsigned char i2c_address, unsigned char start_address, unsigned char data_len){
57 1 while ((S2STA & BBUSY) != 0); // wait for BBUSY to be clear
58 1 i2c_master = 1;
59 1 i2c_xmitr = 1; // set up for master transmitter
60 1 S2DAT = i2c_address; // set up i2c address
61 1 S2CON |= ENI; // Set ENI (Enable I2C-2)
62 1 S2CON &= ~STO; // Clr STO in S2CON
63 1 S2CON |= STA; // Set STA (Send start bit)
64 1 S2CON &= ~AA; // Clr AA in S2CON
65 1 i2c_wait_for_int(); // Wait for interrupt
66 1 S2CON &= ~STA; // clear STA
67 1 S2DAT = start_address;
68 1 i2c_wait_for_int(); // Wait for interrupt
69 1 S2CON &= ~STA; // clear STA
70 1
71 1 for (i=0; i < (data_len-1); i++){
72 2 S2DAT = i2c_xmit_buf[i];
73 2 i2c_wait_for_int(); // Wait for interrupt
74 2 S2CON &= ~STA; // clear STA
75 2 }
76 1 S2CON |= STO; // set STO (stop bit)
77 1 S2DAT = i2c_xmit_buf[i]; // send last data byte
78 1 i2c_wait_for_int(); // Wait for interrupt
79 1 S2DAT = dummy; // send dummy byte
80 1 }
81
82
83
84 //--------------------------------------------------
85 // I2C Receive Data Routine
86 //--------------------------------------------------
87
88 void upsd_i2c_rcv (unsigned char i2c_address, unsigned char start_address, unsigned char data_len){
89 1 while ((S2STA & BBUSY) != 0); // wait for BBUSY to be clear
90 1 i2c_master = 1;
91 1 i2c_xmitr = 0; // set flags for master receiver
92 1
93 1 // set up i2c slave starting address
94 1 S2DAT = i2c_address; // set up i2c address
95 1 S2CON |= ENI; // Set ENI (Enable I2C-2)
96 1 S2CON |= STA; // Set STA (Send start bit)
97 1 S2CON &= ~AA; // Clr AA in S2CON
98 1 i2c_wait_for_int(); // Wait for interrupt
99 1 S2CON &= ~STA; // clear STA
100 1 S2CON |= STO; // set STO (stop bit)
101 1 S2DAT = start_address; // send starting address
102 1 i2c_wait_for_int(); // Wait for interrupt
103 1 S2DAT = dummy; // send dummy byte
104 1
105 1 // receive bytes from slave from starting address
106 1 S2DAT = (i2c_address | 0x01); // set up i2c address (set R/W bit)
107 1 S2CON |= ENI; // Set ENI (Enable I2C-2)
108 1 S2CON &= ~STO; // Clr STO in S2CON
109 1 S2CON |= STA; // Set STA (Send start bit)
110 1 S2CON &= ~AA; // Clr AA in S2CON
111 1 i2c_wait_for_int(); // Wait for interrupt
112 1 S2CON &= ~STA; // clear STA
113 1 S2DAT = 0xFF; // send byte for rcv mode
114 1 S2CON |= AA; // Set AA in S2CON
115 1 i2c_wait_for_int(); // Wait for interrupt
116 1
117 1 for (i=0; i < (data_len-1); i++){
C51 COMPILER V7.00 UPSD_I2C 11/13/2002 09:49:12 PAGE 3
118 2 dummybyte = S2STA; // Dummy Read S2STA
119 2 i2c_rcv_buf[i] = S2DAT; // Get data byte from Slave
120 2 i2c_wait_for_int(); // Wait for interrupt
121 2 }
122 1 S2CON &= ~AA; // Clr AA in S2CON
123 1 i2c_rcv_buf[i] = S2DAT; // Get last data byte
124 1 i2c_wait_for_int(); // Wait for interrupt
125 1 dummybyte = S2STA; // Dummy Read S2STA
126 1 i++;
127 1 i2c_rcv_buf[i] = S2DAT; // Get dummy data byte
128 1 }
129
130
131
132 //--------------------------------------------------
133 // I2C Wait for Interrupt Routine
134 //--------------------------------------------------
135
136 void i2c_wait_for_int (void){
137 1 i2cwait = 1; //
138 1 i2c_timeout = 0;
139 1 while (i2cwait == 1){ // .. wait for int to clear flag
140 2 if (i2c_timeout >= 10){ // 10mS timeout loop
141 3 i2c_timeout_flag = 1; // set error flag
142 3 i2cwait = 0; //
143 3 }
144 2 timer0_delay(1); // 1 mS delay
145 2 i2c_timeout++;
146 2 }
147 1 }
148
149
150 /*--------------------------------------------------
151 I2C Interrupt Service Routine
152 --------------------------------------------------*/
153
154 void i2c_isr (void) interrupt I2C_VECTOR using 2 { // I2C Interrupt Routine
155 1 if ((S2STA & BLOST) == 1){
156 2 // printfLCD("\nI2C Bus Lost!\n"); // display on LCD
157 2 // timer0_delay(1000); // 1 Sec timeout
158 2 S2DAT = dummy; // send dummy byte
159 2 bus_lost_flag = 1;
160 2 }
161 1 if ((S2STA & _ACKREP) == 1){
162 2 // printfLCD("\nNo Slave ACK!\n"); // display on LCD
163 2 // timer0_delay(1000); // 1 Sec timeout
164 2 S2DAT = dummy; // send dummy byte
165 2 slave_nack_flag = 1;
166 2 }
167 1 if (i2c_master & i2c_xmitr){ // mstr transmitter mode
168 2 i2cwait = 0; // reset wait flag
169 2 }
170 1 if (i2c_master & ~i2c_xmitr){ // mstr receiver mode
171 2 i2cwait = 0; // reset wait flag
172 2 }
173 1 }
174
175
176
C51 COMPILER V7.00 UPSD_I2C 11/13/2002 09:49:12 PAGE 4
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION upsd_i2c_init (BEGIN)
; SOURCE LINE # 41
; SOURCE LINE # 42
0000 4393C0 ORL P3SFS,#0C0H
; SOURCE LINE # 43
0003 43DC81 ORL S2CON,#081H
; SOURCE LINE # 44
0006 D200 R SETB i2c_init_flag
; SOURCE LINE # 45
0008 C200 R CLR i2c_timeout_flag
; SOURCE LINE # 46
000A C2BA CLR PX1
; SOURCE LINE # 47
000C 43B702 ORL IPA,#02H
; SOURCE LINE # 48
000F 43A702 ORL IEA,#02H
; SOURCE LINE # 49
0012 D2AA SETB EX1
; SOURCE LINE # 50
0014 22 RET
; FUNCTION upsd_i2c_init (END)
; FUNCTION _upsd_i2c_xmit (BEGIN)
; SOURCE LINE # 56
0000 8D00 R MOV start_address,R5
0002 8B00 R MOV data_len,R3
;---- Variable 'i2c_address' assigned to Register 'R7' ----
0004 ?C0002:
; SOURCE LINE # 57
0004 E5DD MOV A,S2STA
0006 20E3FB JB ACC.3,?C0002
0009 ?C0003:
; SOURCE LINE # 58
0009 D200 R SETB i2c_master
; SOURCE LINE # 59
000B D200 R SETB i2c_xmitr
; SOURCE LINE # 60
000D 8FDE MOV S2DAT,R7
; SOURCE LINE # 61
; SOURCE LINE # 62
; SOURCE LINE # 63
; SOURCE LINE # 64
; SOURCE LINE # 65
000F 120000 R LCALL ?C0026
; SOURCE LINE # 66
0012 53DCDF ANL S2CON,#0DFH
; SOURCE LINE # 67
0015 8500DE R MOV S2DAT,start_address
; SOURCE LINE # 68
0018 120000 R LCALL i2c_wait_for_int
; SOURCE LINE # 69
001B 53DCDF ANL S2CON,#0DFH
; SOURCE LINE # 71
001E E4 CLR A
001F F500 R MOV i,A
0021 F500 R MOV i+01H,A
0023 ?C0004:
0023 E500 R MOV A,data_len
0025 24FF ADD A,#0FFH
C51 COMPILER V7.00 UPSD_I2C 11/13/2002 09:49:12 PAGE 5
0027 FF MOV R7,A
0028 E4 CLR A
0029 34FF ADDC A,#0FFH
002B FE MOV R6,A
002C C3 CLR C
002D E500 R MOV A,i+01H
002F 9F SUBB A,R7
0030 E500 R MOV A,i
0032 9E SUBB A,R6
0033 501E JNC ?C0005
; SOURCE LINE # 72
0035 7400 R MOV A,#LOW i2c_xmit_buf
0037 2500 R ADD A,i+01H
0039 F582 MOV DPL,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -