📄 sp3530.lst
字号:
179 1 SFRPAGE = CONFIG_PAGE;
C51 COMPILER V7.05 SP3530 03/19/2007 15:47:59 PAGE 4
180 1 WDTCN = 0xde; // disable watchdog timer
181 1 WDTCN = 0xad;
182 1
183 1 OSCICN |= 0x03; // Set internal oscillator to highest setting
184 1 // (16 MHz)
185 1
186 1 XBR0 |= 0x07; // Route SMBus to GPIO pins through crossbar
187 1 XBR2 |= 0x44; // Enable crossbar and weak pull-ups
188 1
189 1 P0MDOUT |= 0x1D;
190 1 P1MDOUT |= 0x01;
191 1 SFRPAGE =SMB0_PAGE;
192 1 SMB0CN=0x00;
193 1 SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle
194 1 SMB0CR = -80; // SMBus clock rate = 100kHz.
195 1 SFRPAGE = CONFIG_PAGE;
196 1 EIE1 |= 2; // SMBus interrupt enable
197 1 EA = 1; // Global interrupt enable
198 1
199 1 SM_BUSY = 0; // Free SMBus for first transfer.
200 1 if(!BUSY)
201 1 BUSY=1;
202 1 BUSY=1;
203 1 _nop_();
204 1 _nop_();
205 1 BUSY=0;
206 1 BUSY=0;
207 1 _nop_();
208 1 _nop_();
209 1 // SetRealClockINT1(0x8000);
210 1 var = GetRealClockStatus();
211 1 ResetRealClock();
212 1 var = GetRealClockStatus();
213 1 SetRealClockStatus(0x82);
214 1 var = GetRealClockStatus();
215 1 RealTime.RT.Year=0x02;
216 1 RealTime.RT.Month=0x06;
217 1 RealTime.RT.Day=0x05;
218 1 RealTime.RT.Week=0x03;
219 1 RealTime.RT.Hour=0x11;
220 1 RealTime.RT.Minute=0x59;
221 1 RealTime.RT.Second=0x45;
222 1 SetRealClock();
223 1 // RealTime.RT.Year=0x0;
224 1 // RealTime.RT.Month=0x0;
225 1 // RealTime.RT.Day=0x0;
226 1 // RealTime.RT.Week=0x0;
227 1 // RealTime.RT.Hour=0x0;
228 1 // RealTime.RT.Minute=0x0;
229 1 // RealTime.RT.Second=0x0;
230 1 GetRealClock();
231 1 /* RealTime.RT.Year=0x02;
232 1 RealTime.RT.Month=0x06;
233 1 RealTime.RT.Day=0x05;
234 1 RealTime.RT.Week=0x02;
235 1 RealTime.RT.Hour=0x11;
236 1 RealTime.RT.Minute=0x14;
237 1 RealTime.RT.Second=0x45;
238 1 */
239 1 // SetRealClock();
240 1 GetRealClock();
241 1 GetRealClock();
C51 COMPILER V7.05 SP3530 03/19/2007 15:47:59 PAGE 5
242 1 GetRealClock();
243 1 GetRealClock();
244 1 while(1)
245 1 {
246 2 GetRealClock();
247 2 }
248 1 }
249
250
251 //------------------------------------------------------------------------------------
252 // Interrupt Service Routine
253 //------------------------------------------------------------------------------------
254 void SMBUS_ISR (void) interrupt 7
255 {
256 1 switch (SMB0STA)
257 1 { // SMBus 状态码SMB0STA 寄存器
258 2 // 主发送器/接收器起始条件已发送
259 2 case SMB_START:
260 2 SFRPAGE =SMB0_PAGE;
261 2 SMB0DAT = COMMAND ; // 装入要访问的从器件的地址
262 2 STA = 0; // 手动清除START 位
263 2 break;
264 2 //主发送器/接收器重复起始条件已发送
265 2 // 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后 ?
266 2 case SMB_RP_START:
267 2 SFRPAGE =SMB0_PAGE;
268 2 SMB0DAT = COMMAND; // COMMAND 中应保持从地址 + R.
269 2 STA = 0;
270 2 break;
271 2 // 主发送器从地址 + WRITE 已发送收到ACK
272 2 case SMB_MTADDACK:
273 2 // 主发送器数据字节已发送收到ACK
274 2 case SMB_MTDBACK:
275 2 if (BYTE_NUMBER)
276 2 {
277 3 SFRPAGE =SMB0_PAGE;
278 3 SMB0DAT = revolve(*I2CDataBuff); // If R/W=WRITE, load byte to write.
279 3 I2CDataBuff++;
280 3 BYTE_NUMBER--;
281 3 }
282 2 else
283 2 {
284 3 SFRPAGE =SMB0_PAGE;
285 3 STO = 1; SM_BUSY = 0; // Free SMBus
286 3 }
287 2 break;
288 2 // 主发送器从地址 + WRITE 已发送收到NACK
289 2 // 从器件不应答发送STOP + START 重试
290 2 case SMB_MTADDNACK:
291 2 SFRPAGE =SMB0_PAGE;
292 2 STO = 1; STA = 1;
293 2 break;
294 2 // 主发送器数据字节已发送收到NACK
295 2 // 从器件不应答发送STOP + START 重试
296 2 case SMB_MTDBNACK:
297 2 SFRPAGE =SMB0_PAGE;
298 2 STO = 1; STA = 1;
299 2 break;
300 2 // 主发送器竞争失败
301 2 // 不应出现如果出现重新开始传输过程
302 2 case SMB_MTARBLOST:
303 2 SFRPAGE =SMB0_PAGE;
C51 COMPILER V7.05 SP3530 03/19/2007 15:47:59 PAGE 6
304 2 STO = 1; STA = 1;
305 2 break;
306 2
307 2 // 主接收器从地址 + READ 已发送,收到ACK
308 2 case SMB_MRADDACK:
309 2 AA = 1; // 在应答周期ACK
310 2 if (!BYTE_NUMBER)
311 2 {
312 3 SFRPAGE =SMB0_PAGE;
313 3 STO = 1; SM_BUSY = 0; // 释放SMBus
314 3 }
315 2 break;
316 2 // 主接收器从地址 + READ 已发送收到NACK
317 2 // 从器件不应答发送重复起始条件重试
318 2 case SMB_MRADDNACK:
319 2 STA = 1;
320 2 break;
321 2 // 收到数据字节ACK 已发送
322 2 // 该状态不应出现因为AA 已在前一状态被清0 如果出现发送停止条件
323 2 case SMB_MRDBACK:
324 2 if (BYTE_NUMBER)
325 2 {
326 3 *I2CDataBuff=revolve(SMB0DAT);
327 3 I2CDataBuff++;
328 3 BYTE_NUMBER--;
329 3 }
330 2 if (!BYTE_NUMBER) AA= 0;
331 2 break;
332 2 // 收到数据字节NACK 已发送
333 2 // 读操作已完成读数据寄存器后发送停止条件
334 2 case SMB_MRDBNACK:
335 2 SFRPAGE =SMB0_PAGE;
336 2 STO = 1;
337 2 SM_BUSY = 0; // 释放SMBus
338 2 break;
339 2 // 在本应用中所有其它状态码没有意义通信复位
340 2 default:
341 2 SFRPAGE =SMB0_PAGE;
342 2 STO = 1; // 通信复位
343 2 SM_BUSY = 0;
344 2 break;
345 2 }
346 1 SI=0; // 清除中断标志
347 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 536 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 2
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -