📄 smb_ex2.lst
字号:
237 2 break;
238 2
239 2 // Master Transmitter: Data byte transmitted. ACK received.
240 2 // This state is used in both READ and WRITE operations. Check BYTE_NUMBER
C51 COMPILER V7.06 SMB_EX2 05/20/2004 15:09:37 PAGE 5
241 2 // for memory address status - if only HIGH_ADD has been sent, load LOW_ADD.
242 2 // If LOW_ADD has been sent, check COMMAND for R/W value to determine
243 2 // next state.
244 2 case SMB_MTDBACK:
245 2 switch (BYTE_NUMBER){
246 3 case 2: // If BYTE_NUMBER=2, only HIGH_ADD
247 3 SMB0DAT = LOW_ADD; // has been sent.
248 3 BYTE_NUMBER--; // Decrement for next time around.
249 3 break;
250 3 case 1: // If BYTE_NUMBER=1, LOW_ADD was just sent.
251 3 if (COMMAND & 0x01){ // If R/W=READ, sent repeated START.
252 4 STO = 0;
253 4 STA = 1;
254 4
255 4 } else {
256 4 SMB0DAT = WORD; // If R/W=WRITE, load byte to write.
257 4 BYTE_NUMBER--;
258 4 }
259 3 break;
260 3 default: // If BYTE_NUMBER=0, transfer is finished.
261 3 STO = 1;
262 3 SM_BUSY = 0; // Free SMBus
263 3 }
264 2 break;
265 2
266 2
267 2 // Master Transmitter: Data byte transmitted. NACK received.
268 2 // Slave not responding. Send STOP followed by START to try again.
269 2 case SMB_MTDBNACK:
270 2 STO = 1;
271 2 STA = 1;
272 2 break;
273 2
274 2 // Master Transmitter: Arbitration lost.
275 2 // Should not occur. If so, restart transfer.
276 2 case SMB_MTARBLOST:
277 2 STO = 1;
278 2 STA = 1;
279 2 break;
280 2
281 2 // Master Receiver: Slave address + READ transmitted. ACK received.
282 2 // Set to transmit NACK after next transfer since it will be the last (only)
283 2 // byte.
284 2 case SMB_MRADDACK:
285 2 AA = 0; // NACK sent on acknowledge cycle.
286 2 break;
287 2
288 2 // Master Receiver: Slave address + READ transmitted. NACK received.
289 2 // Slave not responding. Send repeated start to try again.
290 2 case SMB_MRADDNACK:
291 2 STO = 0;
292 2 STA = 1;
293 2 break;
294 2
295 2 // Data byte received. ACK transmitted.
296 2 // State should not occur because AA is set to zero in previous state.
297 2 // Send STOP if state does occur.
298 2 case SMB_MRDBACK:
299 2 STO = 1;
300 2 SM_BUSY = 0;
301 2 break;
302 2
C51 COMPILER V7.06 SMB_EX2 05/20/2004 15:09:37 PAGE 6
303 2 // Data byte received. NACK transmitted.
304 2 // Read operation has completed. Read data register and send STOP.
305 2 case SMB_MRDBNACK:
306 2 WORD = SMB0DAT;
307 2 STO = 1;
308 2 SM_BUSY = 0; // Free SMBus
309 2 break;
310 2
311 2 // All other status codes meaningless in this application. Reset communication.
312 2 default:
313 2 STO = 1; // Reset communication.
314 2 SM_BUSY = 0;
315 2 break;
316 2 }
317 1
318 1 SI=0; // clear interrupt flag
319 1 }
320
321
322 /********************************************************************************************************/
323 /********************************************************************************************************/
324 /********************************************************************************************************/
325 /********************************************************************************************************/
326 //uint8 xdata EepromBuf[16];
327 /*********************************************************************************************************
328 ** 函数名称: EepromReadBuf
329 ** 功能描述: 从指定的地址开始读出指定的字节数放入缓冲区
330 ** 输 入: address,bytenumber
331 ** 输 出: 无
332 ** 全局变量: EepromBuf
333 ** 调用模块: SM_Receive
334 ** 注 意:此函数不可重入,使用前要先申请信号量
335 ** 作 者: 刘宝贵
336 ** 日 期: 2004年5月5日
337 **-------------------------------------------------------------------------------------------------------
338 ** 修改人:
339 ** 日 期:
340 **-------------------------------------------------------------------------------------------------------
341 *********************************************************************************************************/
342 /*
343 void EepromReadBuf (uint16 address ,uint8 bytenumber)
344 {
345 uint8 data i;
346 if(bytenumber>16)
347 bytenumber=16;
348 for(i=0;i<bytenumber;i++)
349 {
350 EepromBuf[i] = SM_Receive(CHIP_A, address++);
351 }
352 }
353 /*********************************************************************************************************
354 ** 函数名称: EepromWriteBuf
355 ** 功能描述: 从指定的地址开始写入缓冲区内指定的字节数
356 ** 输 入: address,bytenumber
357 ** 输 出: 无
358 ** 全局变量: EepromBuf OSWait
359 ** 调用模块: SM_Send
360 ** 注 意:此函数不可重入,使用前要先申请信号量
361 ** 作 者: 刘宝贵
362 ** 日 期: 2004年5月5日
363 **-------------------------------------------------------------------------------------------------------
364 ** 修改人:
C51 COMPILER V7.06 SMB_EX2 05/20/2004 15:09:37 PAGE 7
365 ** 日 期:
366 **-------------------------------------------------------------------------------------------------------
367 *********************************************************************************************************/
368 /*
369 void EepromWriteBuf (uint16 address ,uint8 bytenumber)
370 {
371 uint8 data i;
372 if(bytenumber>16)
373 bytenumber=16;
374 for(i=0;i<bytenumber;i++)
375 {
376 SM_Send(CHIP_A, address++, EepromBuf[i]);
377 OSWait(K_TMO,(10*OS_TICKS_PER_SEC)/1000);//delay10ms
378 }
379 }
380 /*********************************************************************************************************
381 ** 函数名称: EepromReadByte
382 ** 功能描述: 从指定的地址读出一个字节数据
383 ** 输 入: address,bytenumber
384 ** 输 出: 所读数据
385 ** 全局变量: 无
386 ** 调用模块: SM_Receive
387 ** 注 意:此函数不可重入,使用前要先申请信号量
388 ** 作 者: 刘宝贵
389 ** 日 期: 2004年5月5日
390 **-------------------------------------------------------------------------------------------------------
391 ** 修改人:
392 ** 日 期:
393 **-------------------------------------------------------------------------------------------------------
394 *********************************************************************************************************/
395 uint8 EepromReadByte (uint16 address)
396 {
397 1 return(SM_Receive(CHIP_A, address));
398 1 }
399 /*********************************************************************************************************
400 ** 函数名称: EepromReadWord
401 ** 功能描述: 从指定的地址读出一个字节数据
402 ** 输 入: address,bytenumber
403 ** 输 出: 所读数据
404 ** 全局变量: 无
405 ** 调用模块: SM_Receive
406 ** 注 意:此函数不可重入,使用前要先申请信号量
407 ** 作 者: 刘宝贵
408 ** 日 期: 2004年5月5日
409 **-------------------------------------------------------------------------------------------------------
410 ** 修改人:
411 ** 日 期:
412 **-------------------------------------------------------------------------------------------------------
413 *********************************************************************************************************/
414 uint16 EepromReadWord (uint16 address)
415 {
416 1 uint16 data temp;
417 1 temp = EepromReadByte (address);
418 1 temp = temp<<8;
419 1 temp |= EepromReadByte (address+1);
420 1 return(temp);
421 1 }
422 /*********************************************************************************************************
423 ** 函数名称: EepromWriteByte
424 ** 功能描述: 在指定的地址写入指定的字节
425 ** 输 入: address,temp
426 ** 输 出: 无
C51 COMPILER V7.06 SMB_EX2 05/20/2004 15:09:37 PAGE 8
427 ** 全局变量:
428 ** 调用模块: SM_Send
429 ** 注 意:此函数不可重入,使用前要先申请信号量
430 ** 作 者: 刘宝贵
431 ** 日 期: 2004年5月5日
432 **-------------------------------------------------------------------------------------------------------
433 ** 修改人:
434 ** 日 期:
435 **-------------------------------------------------------------------------------------------------------
436 *********************************************************************************************************/
437 void EepromWriteByte(uint16 address ,uint8 temp)
438 {
439 1 SM_Send(CHIP_A, address, temp);
440 1 OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
441 1 }
442 /*********************************************************************************************************
443 ** 函数名称: EepromWriteWord
444 ** 功能描述: 在指定的地址写入指定的字节
445 ** 输 入: address,temp16
446 ** 输 出: 无
447 ** 全局变量:
448 ** 调用模块: SM_Send
449 ** 注 意:此函数不可重入,使用前要先申请信号量
450 ** 作 者: 刘宝贵
451 ** 日 期: 2004年5月5日
452 **-------------------------------------------------------------------------------------------------------
453 ** 修改人:
454 ** 日 期:
455 **-------------------------------------------------------------------------------------------------------
456 *********************************************************************************************************/
457 void EepromWriteWord(uint16 address ,uint16 temp16)
458 {
459 1 SM_Send(CHIP_A, address++, (uint8)(temp16>>8));
460 1 OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
461 1 SM_Send(CHIP_A, address, (uint8)(temp16));
462 1 OSWait(K_TMO,(15*OS_TICKS_PER_SEC)/1000);//delay15ms
463 1 }
464
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 500 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 7
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 + -