📄 i2cdrive.lst
字号:
C51 COMPILER V7.06 I2CDRIVE 03/01/2005 13:39:02 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE I2CDRIVE
OBJECT MODULE PLACED IN I2CDRIVE.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2CDRIVE.C BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include "i2cexprt.h"
2 /* Immediate data to write into I2CON */
3 /* CRSEL = 0 -> CLK determined by I2SCLH / L */
4 #define GENERATE_STOP 0x54 /* STO=1, STA=0, SI=0 */
5 #define RELEASE_BUS_ACK 0x44 /* STO=STA=SI=0, AA=1 */
6 #define RELEASE_BUS_NOACK 0x40 /* STO=STA=SI=AA=0 */
7 #define RELEASE_BUS_STA 0x64 /* (rep)START, STA=1 */
8 static I2C_TRANSFER *tfr; /* Ptr to active trf block */
9 static I2C_MESSAGE *msg; /* ptr to active msg block */
10 static BYTE msgCount; /* Nr of messages to sent */
11 static BYTE dataCount; /* bytes send/received */
12 void I2C_Interrupt(void) interrupt 6 using 1
13 {
14 1 switch(I2STAT)
15 1 {
16 2 case 0x00: /* Bus Error has occured */
17 2 I2CON = GENERATE_STOP;
18 2 break;
19 2 case 0x08:
20 2 case 0x10:
21 2 I2DAT = msg->address;
22 2 I2CON = RELEASE_BUS_ACK;
23 2 break;
24 2 case 0x18:
25 2 case 0x28:
26 2 if (dataCount < msg->nrBytes)
27 2 {
28 3 I2DAT = msg->buf[dataCount++];
29 3 I2CON = RELEASE_BUS_ACK;
30 3 }
31 2 else
32 2 {
33 3 if (msgCount < tfr->nrMessages)
34 3 {
35 4 dataCount = 0;
36 4 msg = tfr->p_message[msgCount++];
37 4 I2CON = RELEASE_BUS_STA;
38 4 }
39 3 else
40 3 {
41 4 I2CON = GENERATE_STOP;
42 4 I2C_Ready(I2C_OK, msgCount);
43 4 }
44 3 }
45 2 break;
46 2 case 0x20:
47 2 case 0x48:
48 2 I2C_Ready(I2C_NACK_ON_ADDRESS, msgCount);
49 2 I2CON = GENERATE_STOP;
50 2 break;
51 2 case 0x30:
52 2 I2C_Ready(I2C_NACK_ON_DATA, msgCount);
53 2 I2CON = GENERATE_STOP;
54 2 break;
55 2 case 0x38:
C51 COMPILER V7.06 I2CDRIVE 03/01/2005 13:39:02 PAGE 2
56 2 I2CON = RELEASE_BUS_STA;
57 2 break;
58 2 case 0x40:
59 2 if (msg->nrBytes == 1)
60 2 I2CON = RELEASE_BUS_NOACK;
61 2 else
62 2 I2CON = RELEASE_BUS_ACK;
63 2 break;
64 2 case 0x50:
65 2 msg->buf[dataCount++] = I2DAT;
66 2 if (dataCount + 1 == msg->nrBytes)
67 2 I2CON = RELEASE_BUS_NOACK;
68 2 else
69 2 I2CON = RELEASE_BUS_ACK;
70 2 break;
71 2 case 0x58:
72 2 msg->buf[dataCount] = I2DAT;
73 2 if (msgCount < tfr->nrMessages)
74 2 {
75 3 dataCount = 0;
76 3 msg = tfr->p_message[msgCount++];
77 3 I2CON = RELEASE_BUS_STA;
78 3 }
79 2 else
80 2 {
81 3 I2CON = GENERATE_STOP;
82 3 I2C_Ready(I2C_OK, msgCount);
83 3 }
84 2 break;
85 2 default: break;
86 2 }
87 1 }
88 void I2C_Init(void)
89 /*****************/
90 {
91 1 // Fpclk = 7.373 Mhz internal oscillator
92 1 // I2c speed = Fpclk / (2*(I2SCLH+I2SCLL)
93 1 P1M1 |= 0x0C; /* P1.2 and P1.3 to open drain */
94 1 P1M2 |= 0x0C;
95 1 I2ADR = 0x26; /* default slave address */
96 1 I2SCLH = 19; /* speed ~100KHz, 50% duty */
97 1 I2SCLL = 19;
98 1 I2CON = RELEASE_BUS_ACK; /* enable I2C hardware */
99 1 EI2C = 1; /* enable I2C interrupt */
100 1 }
101 void I2C_Transfer(I2C_TRANSFER *p)
102 {
103 1 tfr = p;
104 1 msgCount = 0;
105 1 dataCount = 0;
106 1 msg = tfr->p_message[msgCount++];
107 1 I2CON = RELEASE_BUS_STA;
108 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 409 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
C51 COMPILER V7.06 I2CDRIVE 03/01/2005 13:39:02 PAGE 3
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -