📄 i2c.lst
字号:
C51 COMPILER V8.05a I2C 08/04/2007 17:18:56 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <c8051f020.h>
2 //------------------------------------------------------------------------------------
3 // Global CONSTANTS
4 //------------------------------------------------------------------------------------
5
6 #define WRITE 0x00 // SMBus WRITE command
7 #define READ 0x01 // SMBus READ command
8
9 //SMBus状态:MT=主发送器;MR=主接受器
10 #define SMB_BUS_ERROR 0x00 // (所以模式)总线错
11 #define SMB_START 0x08 // (主发送器和主接受器)开始条件已发送
12 #define SMB_RP_START 0x10 // (主发送器和主接受器)重复开始条件已发送
13 #define SMB_MTADDACK 0x18 // (主发送器)从地址+W 已发送,收到ACK
14 #define SMB_MTADDNACK 0x20 // (主发送器)从地址+W 已发送,收到NACK
15 #define SMB_MTDBACK 0x28 // (主发送器)数据字节已发送,收到ACK
16 #define SMB_MTDBNACK 0x30 // (主发送器)数据字节已发送,收到NACK
17 #define SMB_MTARBLOST 0x38 // (主发送器)竞争失败
18 #define SMB_MRADDACK 0x40 // (主接受器)从地址+R已发送,收到ACK
19 #define SMB_MRADDNACK 0x48 // (主接受器)从地址+R已发送,收到NACK
20 #define SMB_MRDBACK 0x50 // (主接受器)数据字节已收到,ACK已发出
21 #define SMB_MRDBNACK 0x58 // (主接受器)数据字节已收到,NACK已发出
22
23 //--------------------------------------------------------------------
24 //全局变量
25 //--------------------------------------------------------------------
26 unsigned char COMMAND; // 在SMBus 中断服务程序中用于
27 // 保存从地址+ R/W 位。
28 unsigned char *I2CDataBuff; // 保持SMBus 要发送的数据字节
29 // 或刚收到的数据
30 unsigned char NByte; // 数据字节数
31 // 高地址字节、低地址字节或数据字节
32 unsigned char HIGH_ADD, LOW_ADD;// EEPROM 存储器地址的高、低字节
33 bit SM_BUSY; // 该位在发送或接收开始时被置1,
34 // 操作结束后由中断服务程序清0
35 bit Attrib; // 地址字节数 1为双字节,0为单字节
36
37 //------------------------------------------------------------------------------------
38 // Function PROTOTYPES
39 //------------------------------------------------------------------------------------
40
41 void SMBus0_Init(void)
42 {
43 1 SMB0CN = 0x44; // 允许SMBus 在应答周期发送ACK
44 1 SMB0CR = -80; // SMBus 时钟频率= 100kHz.
45 1 EIE1 |= 2; // SMBus 中断允许
46 1 EA = 1; // 全局中断允许
47 1 SM_BUSY = 0; // 为第一次传输释放SMBus。
48 1 }
49
50 // SMBus 中断服务程序
51 void SMBUS_ISR (void) interrupt 7
52 {
53 1 // SMBus 状态码(SMB0STA 寄存器)
54 1 switch (SMB0STA)
55 1 {
C51 COMPILER V8.05a I2C 08/04/2007 17:18:56 PAGE 2
56 2 // 主发送器/接收器:起始条件已发送
57 2 // 在该状态发送的COMMAND 字的R/W 位总是为0(W),
58 2 // 因为对于读和写操作来说都必须先写存储器地址。
59 2 case SMB_START:
60 2 SMB0DAT = (COMMAND & 0xFE); // 装入要访问的从器件的地址
61 2 STA = 0; // 手动清除START 位
62 2 break;
63 2 // 主发送器/接收器:重复起始条件已发送。
64 2 // 该状态只应在读操作期间出现,在存储器地址已发送并得到确认之后
65 2 case SMB_RP_START:
66 2 SMB0DAT = (COMMAND | 0x01); // COMMAND 中应保持从地址 + R.
67 2 STA = 0;
68 2 break;
69 2 // 主发送器: 从地址+ WRITE 已发送,收到ACK。
70 2 case SMB_MTADDACK:
71 2 SMB0DAT = HIGH_ADD;
72 2 break;
73 2 // 主发送器: 数据字节已发送 收到ACK
74 2 case SMB_MTDBACK:
75 2 if( Attrib ) // 如果为 2 字节地址
76 2 {
77 3 Attrib = 0; // 清标志位
78 3 SMB0DAT = LOW_ADD; // 发低字节地址
79 3 break;
80 3 }
81 2 else if( COMMAND & 0x01 ) // 如果为读操作
82 2 {
83 3 STA = 1; // 重复起始条件
84 3 break;
85 3 }
86 2 else if( NByte ) // 如果未写完数据,继续写直到NByte=0;
87 2 {
88 3 SMB0DAT = *I2CDataBuff;
89 3 I2CDataBuff++;
90 3 NByte--;
91 3 break;
92 3 }
93 2 else
94 2 {
95 3 STO = 1;
96 3 SM_BUSY = 0;
97 3 }
98 2 break;
99 2 // 主发送器 从地址 + WRITE 已发送 收到NACK
100 2 // 从器件不应答发送STOP + START 重试
101 2 case SMB_MTADDNACK:
102 2 // 主发送器 数据字节已发送 收到NACK
103 2 // 从器件不应答发送STOP + START 重试
104 2 case SMB_MTDBNACK:
105 2 // 主发送器竞争失败
106 2 // 不应出现如果出现重新开始传输过程
107 2 case SMB_MTARBLOST:
108 2 STO = 1;
109 2 STA = 1;
110 2 break;
111 2 // 主接收器从地址 + READ 已发送,收到ACK
112 2 case SMB_MRADDACK:
113 2 AA = 1; // 在应答周期ACK
114 2 if (!NByte)
115 2 {
116 3 STO = 1;
117 3 SM_BUSY = 0; // 释放SMBus
C51 COMPILER V8.05a I2C 08/04/2007 17:18:56 PAGE 3
118 3 }
119 2 break;
120 2 // 主接收器从地址 + READ 已发送收到NACK
121 2 // 从器件不应答发送重复起始条件重试
122 2 case SMB_MRADDNACK:
123 2 STA = 1;
124 2 break;
125 2 // 收到数据字节ACK 已发送
126 2 // 该状态不应出现因为AA 已在前一状态被清0 如果出现发送停止条件
127 2 case SMB_MRDBACK:
128 2 if ( NByte )
129 2 {
130 3 *I2CDataBuff = SMB0DAT;
131 3 I2CDataBuff++;
132 3 NByte--;
133 3 }
134 2 if (!NByte)
135 2 AA= 0;
136 2 break;
137 2 // 收到数据字节 NACK 已发送
138 2 // 读操作已完成读数据寄存器后发送停止条件
139 2 case SMB_MRDBNACK:
140 2 STO = 1;
141 2 SM_BUSY = 0; // 释放SMBus
142 2 break;
143 2 // 在本应用中所有其它状态码没有意义通信复位
144 2 default:
145 2 STO = 1; // 通信复位
146 2 SM_BUSY = 0;
147 2 break;
148 2 }
149 1 SI=0; // 清除中断标志
150 1 }
151
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 227 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 ----
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -