📄 020_smbus.lst
字号:
100 3 {
101 4 GCV_slave_subaddr_num = 0;
102 4 SMB0DAT = (unsigned char)GIV_slave_subaddr;
103 4 }
104 3 //没有子地址,则结束传输操作
105 3 else
106 3 {
107 4 STO = 1;
108 4 STA = 0;
109 4 _nop_();
110 4 }
111 3
112 3 SI = 0;
113 3 break;
114 3 }
115 2 //20 写地址已发送并收到非应答,发送重复起始位或者结束本次传输
116 2 case SEND_ADDR_W_REC_NACK:
117 2 {
118 3 //结束本次传输
119 3 STO = 1;
120 3 STA = 0;
121 3 SI = 0;
122 3 break;
123 3 }
124 2 //28 数据已发送并收到应答,发送下个数据或者停止传输或者重复起始条件。
125 2 case SEND_DATA_REC_ACK:
C51 COMPILER V7.50 020_SMBUS 05/07/2007 10:34:34 PAGE 8
126 2 {
127 3 //两种可能:写操作写出子地址,读操作写出子地址
128 3
129 3 //为1则为读操作
130 3 if (GBV_smbus_wr)
131 3 {
132 4 //如果从机子地址为1位,则发送低位即,子地址数减1
133 4 if (GCV_slave_subaddr_num == 1)
134 4 {
135 5 GCV_slave_subaddr_num = 0;
136 5 SMB0DAT = (unsigned char)GIV_slave_subaddr;
137 5 }
138 4 //从机子地址发送完毕,则开始发送重复起始位
139 4 else
140 4 {
141 5 //STO = 1;
142 5 //STA = 1;
143 5 //从机地址变读
144 5 GCV_slave_addr |= 0x01;
145 5 //重复起始
146 5 SMB0CN |= 0X30;
147 5 }
148 4 }
149 3 //否则为写操作
150 3 else
151 3 {
152 4 //如果从机子地址为1位,则发送低位即,子地址数减1
153 4 if (GCV_slave_subaddr_num == 1)
154 4 {
155 5 GCV_slave_subaddr_num = 0;
156 5 SMB0DAT = (unsigned char)GIV_slave_subaddr;
157 5 }
158 4 //从机子地址发送完毕,则开始发送字节
159 4 else if (GCV_slave_data_num > 0)
160 4 {
161 5 SMB0DAT = *GPV_slave_data_array;
162 5 GCV_slave_data_num--;
163 5 GPV_slave_data_array++;
164 5 }
165 4 //数据发送完毕,则结束传输过程
166 4 else
167 4 {
168 5 STO = 1;
169 5 STA = 0;
170 5 _nop_();
171 5 }
172 4 }
173 3 SI = 0;
174 3 break;
175 3 }
176 2 //30 数据已发送并收到非应答,停止传输或者重复起始条件。
177 2 case SEND_DATA_REC_NACK:
178 2 {
179 3 //结束本次传输
180 3 STO = 1;
181 3 SI = 0;
182 3 break;
183 3 }
184 2 //38 竞争失败,保存当前数据
185 2 case COMPETE_FAIL:
186 2 {
187 3 _nop_();
C51 COMPILER V7.50 020_SMBUS 05/07/2007 10:34:34 PAGE 9
188 3 SI = 0;
189 3 break;
190 3 }
191 2 //40 读地址已发送并收到应答,如果只接收1个字节,则AA位清0,否则等待接收数据
192 2 case SEND_ADDR_R_REC_ACK:
193 2 {
194 3 //如果只接收1个字节,则AA位清0,否则AA置1,允许应答
195 3 if (GCV_slave_data_num == 1)
196 3 {
197 4 AA = 0;
198 4 }
199 3 else
200 3 {
201 4 AA = 1;
202 4 }
203 3
204 3 SI = 0;
205 3 break;
206 3 }
207 2 //48 读地址已发送并收到非应答,发送重复起始位或者结束本次传输
208 2 case SEND_ADDR_R_REC_NACK:
209 2 {
210 3 //结束本次传输操作
211 3 STO = 1;
212 3 STA = 0;
213 3 SI = 0;
214 3 break;
215 3 }
216 2 //50 数据字节已收到并已发送完毕应答,读回SMB0DAT,等待下个字节,并判断,下个字节如果为最后一个字节,则AA
-位清0
217 2 case REC_DATA_SEND_ACK:
218 2 {
219 3 if (GCV_slave_data_num > 0)
220 3 {
221 4 //读取数据
222 4 *GPV_slave_data_array = SMB0DAT;
223 4 GPV_slave_data_array++;
224 4 GCV_slave_data_num--;
225 4 //下个字节如果为最后一个字节,则AA位清0
226 4 if (GCV_slave_data_num == 1)
227 4 {
228 5 AA = 0;
229 5 }
230 4 }
231 3 else
232 3 {
233 4 //结束传输
234 4 STO = 1;
235 4 STA = 0;
236 4 }
237 3
238 3 SI = 0;
239 3 break;
240 3 }
241 2 //58 数据字节已收到并已发送完毕非应答,则结束传输
242 2 case REC_DATA_SEND_NACK:
243 2 {
244 3 _nop_();
245 3 //读取数据
246 3 *GPV_slave_data_array = SMB0DAT;
247 3 //结束传输
248 3 STO = 1;
C51 COMPILER V7.50 020_SMBUS 05/07/2007 10:34:34 PAGE 10
249 3 STA = 0;
250 3 SI = 0;
251 3 break;
252 3 }
253 2
254 2 default:
255 2 {
256 3 //结束传输
257 3 STO = 1;
258 3 SI = 0;
259 3 break;
260 3 }
261 2 }
262 1 }
C51 COMPILER V7.50 020_SMBUS 05/07/2007 10:34:34 PAGE 11
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION fram_wr_fun (BEGIN)
; SOURCE LINE # 14
; SOURCE LINE # 18
; SOURCE LINE # 19
0000 A200 R MOV C,B_wr
0002 9200 R MOV GBV_smbus_wr,C
; SOURCE LINE # 20
0004 850000 R MOV GIV_slave_subaddr,subaddr
0007 850000 R MOV GIV_slave_subaddr+01H,subaddr+01H
; SOURCE LINE # 21
000A 850000 R MOV GCV_slave_data_num,length_of_data
; SOURCE LINE # 22
000D 850000 R MOV GPV_slave_data_array,P_to_wr_array+01H
0010 850000 R MOV GPV_slave_data_array+01H,P_to_wr_array+02H
; SOURCE LINE # 24
0013 7500A0 R MOV GCV_slave_addr,#0A0H
; SOURCE LINE # 25
0016 750002 R MOV GCV_slave_subaddr_num,#02H
; SOURCE LINE # 26
0019 C2C4 CLR STO
; SOURCE LINE # 27
001B D2C5 SETB STA
; SOURCE LINE # 28
001D 22 RET
; FUNCTION fram_wr_fun (END)
; FUNCTION wdt_rtc_wr_fun (BEGIN)
; SOURCE LINE # 31
; SOURCE LINE # 35
; SOURCE LINE # 36
0000 A200 R MOV C,B_wr
0002 9200 R MOV GBV_smbus_wr,C
; SOURCE LINE # 37
0004 850000 R MOV GIV_slave_subaddr,subaddr
0007 850000 R MOV GIV_slave_subaddr+01H,subaddr+01H
; SOURCE LINE # 38
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -