📄 smbus.lst
字号:
C51 COMPILER V7.50 SMBUS 06/10/2007 23:11:21 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE SMBUS
OBJECT MODULE PLACED IN .\out\smbus.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE smbus.c LARGE OPTIMIZE(SIZE) REGFILE(.\out\mbtest.ORC) BROWSE INCDIR(C:\Kei
-l\C51\LIB\;D:\TEST_C020\MC_55_C\) DEBUG OBJECTEXTEND OBJECT(.\out\smbus.obj)
line level source
1
2 #include "all.h"
3
4
5 void smbus(void) interrupt 7 using 2 //SMBUS中断服务程序
6 {
7 1 //char sfrpage_save = SFRPAGE;
8 1 //SFRPAGE = SMB0_PAGE;
9 1
10 1 watch=SMB0STA;
11 1
12 1 smbus_ms_cnt = 0;//无中断豪秒计数器,在SMBUS中断清0
13 1 switch (watch)
14 1 //SMBUS状态寄存器SMB0STA
15 1 {
16 2
17 2 case 0x08: //主发送/接收:起始条件已发出.
18 2 STA = 0; //人工清除起始位STA
19 2 iic_error_flag = 0; //iic_error_flag=1说明SMBus有问题
20 2 AA = 1;
21 2 iic_data_count = 0;
22 2 SMB0DAT = slave_add; //从地址+读/写标志送SMB0DAT,
23 2 break;
24 2
25 2 case 0x10: //主发送/接收:重复起始条件已发出。
26 2 STA = 0; //人工清除起始位STA
27 2 AA = 1;
28 2
29 2 SMB0DAT = slave_add; //从地址+读/写标志送SMB0DAT
30 2
31 2 iic_data_len = iic_data_len+iic_data_count;
32 2 iic_buf_p = iic_buf_p - iic_data_count;
33 2 iic_data_count = 0;
34 2 break;
35 2
36 2 case 0x18: //主发送器:从地址+写标志已发出,收到ACK
37 2 if((slave_add&0xfe) == 0xa0) //如果是存储器操作
38 2 {
39 3 //发送MEMORY地址高字节
40 3 SMB0DAT = iic_ram_add; //>>8;
41 3 }
42 2 else
43 2 {
44 3 SMB0DAT = iic_ram_add;
45 3 }
46 2
47 2 iic_add_count = 0; //1;
48 2 write_start_num = 0;
49 2 break;
50 2
51 2 case 0x20: //主发送器:从地址+写标志已发出,收到NACK
52 2 write_start_num++;
53 2
54 2 if(write_start_num>5) //如果超过5次不成功则释放总线
C51 COMPILER V7.50 SMBUS 06/10/2007 23:11:21 PAGE 2
55 2 {
56 3 STO = 1;
57 3 sm_busy = 0;
58 3 iic_error_flag = 1;
59 3 }
60 2 else //确认查询重复,置位STO+STA。
61 2 {
62 3 STO = 1;
63 3 STA = 1;
64 3 }
65 2
66 2 break;
67 2
68 2 case 0x28: //数据字节已发出,收到ACK,将下一字节装入SMB0DAT;
69 2 //判断,如果是存储器操作,则判断是否发送完2个字节地址
70 2 if(((iic_add_count == 1)&&(slave_add&0xfe) == 0xa0))
71 2 {
72 3 //发送MEMORY地址低字节
73 3 SMB0DAT = iic_ram_add;
74 3 iic_add_count = 0;
75 3 }
76 2 else
77 2 {
78 3 switch(iic_data_len)
79 3 {
80 4 case 0x00: //如果数据已经发送结束则释放总线
81 4 STO=1;
82 4 sm_busy=0;
83 4 break;
84 4
85 4 default :
86 4 SMB0DAT = *iic_buf_p;
87 4 iic_buf_p++;
88 4 iic_data_count++;
89 4 iic_data_len--;
90 4 break;
91 4 }
92 3 }
93 2
94 2 break;
95 2
96 2 case 0x30: //主发送器:数据字节已发出,收到NACK,
97 2 write_start_num++;
98 2 if(write_start_num>5) //如果超过5次不成功则释放总线
99 2 {
100 3 STO=1;
101 3 sm_busy=0;
102 3 iic_error_flag=1;
103 3 }
104 2 else //重试传输或置位STO
105 2 {
106 3 STO=1;
107 3 STA=1;
108 3 }
109 2 break;
110 2
111 2 case 0x38: //主发送器:竞争失败,保存当前数据
112 2 write_start_num++;
113 2
114 2 if(write_start_num>5) //如果超过5次不成功则释放总线
115 2 {
116 3 STO=1;
C51 COMPILER V7.50 SMBUS 06/10/2007 23:11:21 PAGE 3
117 3 sm_busy=0;
118 3 iic_error_flag=1;
119 3 }
120 2 else
121 2 {
122 3 STO=1;
123 3 STA=1;
124 3 }
125 2
126 2 break;
127 2
128 2 case 0x40:
129 2 read_start_num=0; //主接收器:从地址+读标志已发出,收到ACK,
130 2 if(iic_data_len<2) //如果只接收一个字节,清AA位(收到字节后发NACK),等待接收数据
131 2 {
132 3 AA=0;
133 3 }
134 2 break;
135 2
136 2 case 0x48: //主接收器:从地址+读标志已发出,收到NACK,
137 2 read_start_num++;
138 2 if(read_start_num>5) //如果超过5次不成功则释放总线
139 2 {
140 3 STO=1;
141 3 sm_busy=0;
142 3 iic_error_flag=1;
143 3 }
144 2 else //确认查询重复,置位STO+STA。
145 2 {
146 3 STO=1;
147 3 STA=1;
148 3 }
149 2 break;
150 2
151 2 case 0x50: //主接收器:数据字节收到,ACK已发出;读SMB0DAT,等待
152 2 //iic_data_buf[iic_data_count++]=SMB0DAT;
153 2 *iic_buf_p = SMB0DAT;
154 2 iic_buf_p++;
155 2 iic_data_count++;
156 2 iic_data_len--;
157 2
158 2 if(iic_data_len<2)
159 2 {
160 3 AA=0; //下一个字节,如下一个字节是最后字节,清除AA。
161 3 }
162 2 break;
163 2
164 2 case 0x58: //主接收器:数据字节收到,NACK已发出,置位STO。
165 2 //iic_data_buf[iic_data_count++]=SMB0DAT; //读操作已经完成,读数据寄存器并且发出STOP.
166 2 *iic_buf_p = SMB0DAT;
167 2 iic_buf_p++;
168 2 iic_data_count++;
169 2 iic_data_len--;
170 2 STO=1;sm_busy=0; //Free SMBus
171 2 break;
172 2
173 2 default: //Reset communication.
174 2 STO=1;
175 2 sm_busy=0;
176 2 iic_error_flag=1;
177 2 break;
178 2 }
C51 COMPILER V7.50 SMBUS 06/10/2007 23:11:21 PAGE 4
179 1
180 1 SI=0; //clear interrupt flag
181 1
182 1 //SFRPAGE = sfrpage_save;
183 1
184 1 }
185
186
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 427 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
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 + -