📄 main.lst
字号:
253 1 I2C_SDA = 0;
254 1 shift >>= 1;
255 1
256 1 // Disable interrupt where sending byte.
257 1 EA = 0;
258 1
259 1 //Release the CLOCK line to start/continue transfer
260 1 I2C_SCL = 1;
261 1
262 1 while(1)
263 1 {
264 2 if(I2C_SCL)
265 2 {
266 3 if(!old_scl)
267 3 {
268 4 //Read the Acknowledge bit.
269 4 if(byte_ok)
270 4 {
271 5 if(!I2C_SDA)
272 5 bits_wrote++;
273 5 }
274 4 else
275 4 {
276 5 bits_wrote++;
277 5 }
278 4 }
279 3 old_scl = 1;
280 3 }
281 2 else
282 2 {
283 3 if(old_scl)
284 3 {
285 4 if(byte_ok)
286 4 {
287 5 I2C_SCL = 0;
288 5
289 5 break;
290 5 }
291 4
292 4 if(shift)
293 4 {
294 5 if(c & shift)
295 5 I2C_SDA = 1;
296 5 else
297 5 I2C_SDA = 0;
298 5
299 5 shift >>= 1;
300 5 }
301 4 else
302 4 {
303 5 //Release SDA
C51 COMPILER V8.02 MAIN 05/25/2007 19:23:10 PAGE 6
304 5 I2C_SDA = 1;
305 5
306 5 byte_ok = true;
307 5 }
308 4
309 4 old_scl = 0;
310 4 }
311 3 }
312 2 }
313 1 // Enable interrupt when byte complete
314 1 EA = 1;
315 1
316 1 return bits_wrote;
317 1 }
318
319 static void i2cSendStop(void)
320 {
321 1 bool old_scl;
322 1 bool old_sda;
323 1
324 1 // Disable interrupt where sending stop.
325 1 EA = 0;
326 1
327 1 I2C_SCL = 1;
328 1
329 1 old_scl = I2C_SCL;
330 1
331 1 while(1)
332 1 {
333 2 if(I2C_SCL)
334 2 {
335 3 if(!old_scl)
336 3 {
337 4 I2C_SCL = 0;
338 4 I2C_SCL = 0;
339 4 I2C_SCL = 0;
340 4 I2C_SCL = 0;
341 4
342 4 I2C_SCL = 1;
343 4
344 4 old_scl = 1;
345 4 }
346 3 else
347 3 {
348 4 if(old_sda != I2C_SDA)
349 4 {
350 5 if(old_sda) //HIGH to LOW: Repeated START condition
351 5 {
352 6 i2c_start = true;
353 6 i2c_terminated = true;
354 6 }
355 5 else //LOW to HIGH: STOP condition
356 5 {
357 6 i2c_start = false;
358 6 i2c_terminated = true;
359 6 }
360 5 break;
361 5 }
362 4 }
363 3 old_sda = I2C_SDA;
364 3 break;
365 3 }
C51 COMPILER V8.02 MAIN 05/25/2007 19:23:10 PAGE 7
366 2 else
367 2 {
368 3 old_scl = 0;
369 3 }
370 2 }
371 1 // Enable interrupt when transfer complete.
372 1 EA = 1;
373 1 }
374
375 static void QueueI2cChar(uchar c)
376 {
377 1 // Force a character to be sent immediately.
378 1 while(i2c_buf_cnt + 1 >= I2C_BUFFER_SIZE)
379 1 {
380 2 if(UartPutChar(i2c_buf[i2c_buf_pos]))
381 2 {
382 3 i2c_buf_pos = (i2c_buf_pos + 1) % I2C_BUFFER_SIZE;
383 3 i2c_buf_cnt--;
384 3 }
385 2 }
386 1 // Queue the character to the i2c buffer
387 1 i2c_buf[(i2c_buf_pos + i2c_buf_cnt) % I2C_BUFFER_SIZE] = c;
388 1 i2c_buf_cnt = (i2c_buf_cnt + 1) % I2C_BUFFER_SIZE;
389 1 }
390
391 static void ProcessI2cTransfer(void)
392 {
393 1 ubyte i2c_addr;
394 1 ubyte c;
395 1
396 1 while(i2c_start)
397 1 {
398 2 //Receive address byte */
399 2 ubyte bits;
400 2 i2c_terminated = false;
401 2
402 2 bits = i2cReceiveByte(&i2c_addr);
403 2
404 2 if(bits == 9)
405 2 {
406 3 if(i2c_addr & 0x01) //Read mode
407 3 {
408 4 ubyte i;
409 4 ubyte bytes_wrote = 0;
410 4
411 4 if(num_packets)
412 4 {
413 5 ubyte pkt_size = s_buf[(s_buf_pos + 1) % UART_BUFFER_SIZE] + 1;
414 5 for(i = 1; i < pkt_size; i++)
415 5 {
416 6 ubyte bits = i2cSendByte(s_buf[(s_buf_pos + i) % UART_BUFFER_SIZE]);
417 6 if(bits >= 8)
418 6 bytes_wrote++;
419 6 if(bits <= 8)
420 6 break;
421 6 }
422 5 if(bytes_wrote == pkt_size - 1)
423 5 {
424 6 s_buf_pos = (s_buf_pos + pkt_size) % UART_BUFFER_SIZE;
425 6 s_buf_cnt -= pkt_size;
426 6 if((--num_packets) == 0)
427 6 I2C_INT = 0;
C51 COMPILER V8.02 MAIN 05/25/2007 19:23:10 PAGE 8
428 6 }
429 5 }
430 4 else
431 4 {
432 5 i2cSendByte(0);
433 5 }
434 4
435 4 if(!i2c_terminated)
436 4 i2cSendStop();
437 4 }
438 3 else //write mode
439 3 {
440 4 QueueI2cChar(PACKET_START);
441 4 while(1)
442 4 {
443 5 ubyte bits_read = i2cReceiveByte(&c);
444 5 if(bits_read == 9)
445 5 {
446 6 QueueI2cChar(c);
447 6 }
448 5 if(i2c_terminated)
449 5 {
450 6 break;
451 6 }
452 5 }
453 4 }
454 3 }
455 2 }
456 1
457 1 //Release the SCL line to enable I2C transfer
458 1 I2C_SCL = 1;
459 1
460 1 EX1 = 1;
461 1 //end i2c transfer
462 1 EA = 1; //Enable interrupt
463 1 }
464
465 void main(void)
466 {
467 1 InitUart();
468 1 InitI2c();
469 1
470 1 EA = 1;
471 1
472 1 while(1)
473 1 {
474 2 uchar c;
475 2 if(i2c_start)
476 2 {
477 3 ProcessI2cTransfer();
478 3 }
479 2 else if(UartGetChar(&c) > 0)
480 2 {
481 3 ProcessSerialEvent(c);
482 3 }
483 2 else if(i2c_buf_cnt > 0)
484 2 {
485 3 if(UartPutChar(i2c_buf[i2c_buf_pos]))
486 3 {
487 4 i2c_buf_pos = (i2c_buf_pos + 1) % I2C_BUFFER_SIZE;
488 4 i2c_buf_cnt--;
489 4 }
C51 COMPILER V8.02 MAIN 05/25/2007 19:23:10 PAGE 9
490 3 }
491 2 else
492 2 {
493 3 //Enter idle mode to save power.
494 3 PCON |= 1;
495 3 }
496 2 }
497 1 }
498
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 732 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 9
IDATA SIZE = 80 ----
BIT SIZE = 2 7
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -