You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

886 lines
32 KiB

C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 1
C51 COMPILER V9.54, COMPILATION OF MODULE MSP_IICMX
OBJECT MODULE PLACED IN ..\out\msp_iicMx.obj
COMPILER INVOKED BY: E:\KeilC51\C51\BIN\C51.EXE ..\source\msp\msp_iicMx.c LARGE OMF2 OPTIMIZE(0,SIZE) BROWSE ORDER NOINT
-PROMOTE INCDIR(..\source\bsp;..\source\msp;..\source\app;..\source\clib;..\source\cpu;..\source\ctask;..\source\tpc;..\s
-ource\asp;..\source\debug;..\source\msp\uart;..\source\msp\simiic;..\source\bsp\oled;..\source\bsp\TTSSbsp) DEBUG PRINT(
-..\out\msp_iicMx.lst) TABS(2) OBJECT(..\out\msp_iicMx.obj)
line level source
1 //////////////////////////////////////////////////////////////////////////
2 /// COPYRIGHT NOTICE
3 /// Copyright (c) 2023 CCSENS
4 /// All rights reserved.
5 ///
6 /// @file iic_sim
7 /// @brief iic 模拟io 版本, 和cpu无关,唯一需要修改的就是头函数中的管��
-�定义
8 /// @info 如无必要请勿修改
9 ///(本文件实现的功能的详述)
10 ///
11 /// @version 1.1 CCsens technology
12 /// @author CC
13 /// @date 20180102
14 /// @version 1.2 CCsens technology
15 /// @author CC
16 /// @date 20230312
17
18 //
19 //////////////////////////////////////////////////////////////////////////
20
21 #include "msp_iicMx.h"
*** WARNING C320 IN LINE 51 OF ..\source\bsp\TTSSbsp\bsp_config.h: "MainFre_22M"
22 #include "stc_8_delay.h"
23
24 TS_iicm_ ts_iicm;
25
26 /*------------------------------------------------
27 端口定义
28 在I2C总线传输数据过程中,每传输一个字节,
29 都要跟一个应答状态位。接收器接收数据的情况
30 可以通过应答位来告知发送器。应答位的时钟脉冲
31 仍由主机产生,而应答位的数据状态则遵循“谁
32 接收谁产生”的原则,即总是由接收器产生应答位,
33 在响应的时钟脉冲期间接收器必须将SDA 线拉
34 低,使它在这个时钟脉冲的高电平期间保持稳定的低电平(见图9) ,
35 当然必须考虑建立和保持时间
36 (详细请查阅表6) 。主机向从机发送数据时,
37 应答位由从机产生;主机从从机接收数据时,应答位
38 由主机产生。
39 I2C总线标准规定: 应答位为0表示接收器应答 (ACK) ,
40 常常简记为A; 为1则表示非应答 (NACK) ,
41 常简记为NA。发送器发送LSB之后,应当释放SDA线(拉高SDA) ,
42 以等待接收器产生应答位。
43 如果接收器在接收完最后一个字节的数据,
44 或者不能再接收更多的数据时,应当产生非应答信
45 号来通知发送器。发送器如果发现接收器产生了非应答状态,
46 则应当终止发送。
47
48 ------------------------------------------------*/
49 ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
50
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 2
51
52 void L0_IICMx_SDA_outin(vtype ch,vtype v)
53 {
54 1 if(v)///输出
55 1 {
56 2 switch (ch)
57 2 {
58 3 case D_iicch_0:
59 3 L0_IICM0_SDA_OUT();
60 3 break;
61 3 case D_iicch_1:
62 3 L0_IICM1_SDA_OUT();
63 3 #ifdef D_SIIC_USE_2
case D_iicch_2:
L0_IICM2_SDA_OUT();
break;
#endif
68 3 #ifdef D_SIIC_USE_3
case D_iicch_3:
L0_IICM3_SDA_OUT();
break;
#endif
73 3 #ifdef D_SIIC_USE_4
case D_iicch_4:
L0_IICM4_SDA_OUT();
break;
#endif
78 3 #ifdef D_SIIC_USE_5
case D_iicch_5:
L0_IICM5_SDA_OUT();
break;
#endif
83 3 #ifdef D_SIIC_USE_6
case D_iicch_6:
L0_IICM6_SDA_OUT();
break;
#endif
88 3 #ifdef D_SIIC_USE_7
case D_iicch_7:
L0_IICM7_SDA_OUT();
break;
#endif
93 3 #ifdef D_SIIC_USE_8
case D_iicch_8:
L0_IICM8_SDA_OUT();
break;
#endif
98 3 default:
99 3 break;
100 3
101 3 }
102 2 // L0_slc_1_delay();
103 2 }
104 1 else
105 1 {
106 2 switch (ch)
107 2 {
108 3 case D_iicch_0:
109 3 L0_IICM0_SDA_IN();
110 3 break;
111 3 case D_iicch_1:
112 3 L0_IICM1_SDA_IN();
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 3
113 3 break;
114 3 #ifdef D_SIIC_USE_2
case D_iicch_2:
L0_IICM2_SDA_IN();
break;
#endif
119 3 #ifdef D_SIIC_USE_3
case D_iicch_3:
L0_IICM3_SDA_IN();
break;
#endif
124 3 #ifdef D_SIIC_USE_4
case D_iicch_4:
L0_IICM4_SDA_IN();
break;
#endif
129 3 #ifdef D_SIIC_USE_5
case D_iicch_5:
L0_IICM5_SDA_IN();
break;
#endif
134 3 #ifdef D_SIIC_USE_6
case D_iicch_6:
L0_IICM6_SDA_IN();
break;
#endif
139 3 #ifdef D_SIIC_USE_7
case D_iicch_7:
L0_IICM7_SDA_IN();
break;
#endif
144 3 #ifdef D_SIIC_USE_8
case D_iicch_8:
L0_IICM8_SDA_IN();
break;
#endif
150 3 default:
151 3 break;
152 3
153 3 }
154 2 // L0_slc_f_delay();
155 2 }
156 1
157 1 }
158
159
160 void L0_IICMx_SDA(vtype ch,vtype v)
161 {
162 1 if(v)
163 1 {
164 2 switch (ch)
165 2 {
166 3 case D_iicch_0:
167 3 L0_IICM0_SDA_ON();
168 3 break;
169 3 case D_iicch_1:
170 3 L0_IICM1_SDA_ON();
171 3 break;
172 3 #ifdef D_SIIC_USE_2
case D_iicch_2:
L0_IICM2_SDA_ON();
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 4
break;
#endif
177 3 #ifdef D_SIIC_USE_3
case D_iicch_3:
L0_IICM3_SDA_ON();
break;
#endif
182 3 #ifdef D_SIIC_USE_4
case D_iicch_4:
L0_IICM4_SDA_ON();
break;
#endif
187 3 #ifdef D_SIIC_USE_5
case D_iicch_5:
L0_IICM5_SDA_ON();
break;
#endif
192 3 #ifdef D_SIIC_USE_6
case D_iicch_6:
L0_IICM6_SDA_ON();
break;
#endif
197 3 #ifdef D_SIIC_USE_7
case D_iicch_7:
L0_IICM7_SDA_ON();
break;
#endif
202 3 #ifdef D_SIIC_USE_8
case D_iicch_8:
L0_IICM8_SDA_ON();
break;
#endif
207 3 default:
208 3 break;
209 3
210 3 }
211 2 // L0_slc_1_delay();
212 2 }
213 1 else
214 1 {
215 2 switch (ch)
216 2 {
217 3 case D_iicch_0:
218 3 L0_IICM0_SDA_OFF();
219 3 break;
220 3 case D_iicch_1:
221 3 L0_IICM1_SDA_OFF();
222 3
223 3 break;
224 3 #ifdef D_SIIC_USE_2
case D_iicch_2:
L0_IICM2_SDA_OFF();
break;
#endif
229 3 #ifdef D_SIIC_USE_3
case D_iicch_3:
L0_IICM3_SDA_OFF();
break;
#endif
234 3 #ifdef D_SIIC_USE_4
case D_iicch_4:
L0_IICM4_SDA_OFF();
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 5
break;
#endif
239 3 #ifdef D_SIIC_USE_5
case D_iicch_5:
L0_IICM5_SDA_OFF();
break;
#endif
244 3 #ifdef D_SIIC_USE_6
case D_iicch_6:
L0_IICM6_SDA_OFF();
break;
#endif
249 3 #ifdef D_SIIC_USE_7
case D_iicch_7:
L0_IICM7_SDA_OFF();
break;
#endif
254 3 #ifdef D_SIIC_USE_8
case D_iicch_8:
L0_IICM8_SDA_OFF();
break;
#endif
259 3 default:
260 3 break;
261 3
262 3 }
263 2 // L0_slc_f_delay();
264 2 }
265 1
266 1 }
267
268 void L0_IICMx_SCL(vtype ch,vtype v)
269 {
270 1 if(v)
271 1 {
272 2 switch (ch)
273 2 {
274 3 case D_iicch_0:
275 3 L0_IICM0_SCL_ON();
276 3 break;
277 3 case D_iicch_1:
278 3 L0_IICM1_SCL_ON();
279 3 break;
280 3 #ifdef D_SIIC_USE_2
case D_iicch_2:
L0_IICM2_SCL_ON();
break;
#endif
286 3 #ifdef D_SIIC_USE_3
case D_iicch_3:
L0_IICM3_SCL_ON();
break;
#endif
291 3 #ifdef D_SIIC_USE_4
case D_iicch_4:
L0_IICM4_SCL_ON();
break;
#endif
296 3 #ifdef D_SIIC_USE_5
case D_iicch_5:
L0_IICM5_SCL_ON();
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 6
break;
#endif
301 3 #ifdef D_SIIC_USE_6
case D_iicch_6:
L0_IICM6_SCL_ON();
break;
#endif
306 3 #ifdef D_SIIC_USE_7
case D_iicch_7:
L0_IICM7_SCL_ON();
break;
#endif
311 3 #ifdef D_SIIC_USE_8
case D_iicch_8:
L0_IICM8_SCL_ON();
break;
#endif
316 3 default:
317 3 break;
318 3 }
319 2 L0_slc_1_delay(ts_iicm.t1[ch]);
320 2 }
321 1 else
322 1 {
323 2 switch (ch)
324 2 {
325 3 case D_iicch_0:
326 3 L0_IICM0_SCL_OFF();
327 3 break;
328 3 case D_iicch_1:
329 3 L0_IICM1_SCL_OFF();
330 3 break;
331 3 #ifdef D_SIIC_USE_2
case D_iicch_2:
L0_IICM2_SCL_OFF();
break;
#endif
337 3 #ifdef D_SIIC_USE_3
case D_iicch_3:
L0_IICM3_SCL_OFF();
break;
#endif
342 3 #ifdef D_SIIC_USE_4
case D_iicch_4:
L0_IICM4_SCL_OFF();
break;
#endif
347 3 #ifdef D_SIIC_USE_5
case D_iicch_5:
L0_IICM5_SCL_OFF();
break;
#endif
352 3 #ifdef D_SIIC_USE_6
case D_iicch_6:
L0_IICM6_SCL_OFF();
break;
#endif
357 3 #ifdef D_SIIC_USE_7
case D_iicch_7:
L0_IICM7_SCL_OFF();
break;
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 7
#endif
362 3 #ifdef D_SIIC_USE_8
case D_iicch_8:
L0_IICM8_SCL_OFF();
break;
#endif
367 3 default:
368 3 break;
369 3 }
370 2
371 2 L0_slc_0_delay(ts_iicm.t0[ch]);
372 2 }
373 1
374 1 }
375
376 /*
377
378 void L0_IICMX_SCL(unsigned char v)
379 {
380 if(v)
381 {
382 L0_IICM1_SCL_ON();/// L0_SCL_ON();
383 L0_slc_1_delay();
384 }
385 else
386 {
387 L0_IICM1_SCL_OFF();///L0_SCL_OFF();
388 L0_slc_f_delay();
389 }
390 }
391 void L0_IICM1_SDA(unsigned char v)
392 {
393 if(v)
394 {
395 L0_IICM1_SDA_ON();
396 L0_slc_1_delay();
397 }
398 else
399 {
400 L0_IICM1_SDA_OFF();
401 L0_slc_f_delay();
402 }
403 }
404 */
405 void L0_IICMx_INIT(vtype ch ,vtype v)
406 {
407 1 if (v)
408 1 {
409 2 switch(ch)
410 2 {
411 3 case D_iicch_0:
412 3 L0_IICM0_SCL_init();
413 3 L0_IICM0_SDA_init();
414 3 break;
415 3 case D_iicch_1:
416 3 L0_IICM1_SCL_init();
417 3 L0_IICM1_SDA_init();
418 3 break;
419 3 #ifdef D_SIIC_USE_2
case D_iicch_2:
L0_IICM2_SCL_init();
L0_IICM2_SDA_init();
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 8
break;
#endif
425 3 #ifdef D_SIIC_USE_3
case D_iicch_3:
L0_IICM3_SCL_init();
L0_IICM3_SDA_init();
break;
#endif
431 3 #ifdef D_SIIC_USE_4
case D_iicch_4:
L0_IICM4_SCL_init();
L0_IICM4_SDA_init();
break;
#endif
437 3 #ifdef D_SIIC_USE_5
case D_iicch_5:
L0_IICM5_SCL_init();
L0_IICM5_SDA_init();
break;
#endif
443 3 #ifdef D_SIIC_USE_6
case D_iicch_6:
L0_IICM6_SCL_init();
L0_IICM6_SDA_init();
break;
#endif
449 3 #ifdef D_SIIC_USE_7
case D_iicch_7:
L0_IICM7_SCL_init();
L0_IICM7_SDA_init();
break;
#endif
455 3 #ifdef D_SIIC_USE_8
case D_iicch_8:
L0_IICM8_SCL_init();
L0_IICM8_SDA_init();
break;
#endif
461 3 default:
462 3 break;
463 3 }
464 2 L0_IICMx_SDA(ch,v);
465 2 L0_IICMx_SCL(ch,v);
466 2 }
467 1 else
468 1 {
469 2
470 2
471 2 }
472 1 }
473
474 unsigned char L0_IICMx_SDA_get(vtype ch)
475 {
476 1
477 1 switch(ch)
478 1 {
479 2 case D_iicch_0:
480 2 return L0_IICM0_SDA_AT();
481 2 case D_iicch_1:
482 2 return L0_IICM1_SDA_AT();
483 2
484 2 #ifdef D_SIIC_USE_2
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 9
case D_iicch_2:
return L0_IICM2_SDA_AT();
#endif
489 2 #ifdef D_SIIC_USE_3
case D_iicch_3:
return L0_IICM3_SDA_AT();
#endif
494 2 #ifdef D_SIIC_USE_4
case D_iicch_4:
return L0_IICM4_SDA_AT();
#endif
499 2 #ifdef D_SIIC_USE_5
case D_iicch_5:
return L0_IICM5_SDA_AT();
#endif
504 2 #ifdef D_SIIC_USE_6
case D_iicch_6:
return L0_IICM6_SDA_AT();
#endif
509 2 #ifdef D_SIIC_USE_7
case D_iicch_7:
return L0_IICM7_SDA_AT();
#endif
514 2 #ifdef D_SIIC_USE_8
case D_iicch_8:
return L0_IICM8_SDA_AT();
#endif
518 2 default:
519 2 break;
520 2 }
521 1 return 0;
522 1
523 1 }
524
525 #define L0_IIC_SIM_INIT(x)
526 #define L0_IIC_SIM_close(x)
527 //**********************************************
528 //送起始位 IO_SDA=1->0
529 void L0_IICMx_Start(vtype ch)
530 {
531 1 ///L0_IIC_SIM_INIT();
532 1
533 1 L0_IICMx_SDA_outin(ch,1);
534 1 L0_IICMx_SDA(ch,1);
535 1 L0_IICMx_SCL(ch,1);
536 1 L0_IICMx_SDA(ch,0);
537 1 L0_slc_1_delay(ts_iicm.t1[ch]);
538 1 L0_slc_1_delay(ts_iicm.t1[ch]);
539 1 L0_IICMx_SCL(ch,0);
540 1
541 1 }
542 //************************************************
543 //送停止位 IO_SDA = 0->1
544 void L0_IICMx_Stop(vtype ch)
545 {
546 1
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 10
547 1 L0_IICMx_SDA(ch,0);
548 1
549 1 L0_IICMx_SCL(ch,1);
550 1
551 1 L0_IICMx_SDA(ch,1);
552 1 L0_IIC_SIM_INIT();
553 1 L0_IIC_SIM_close();
554 1 }
555
556
557 //************************************************
558 //主应答(包含ack:IO_SDA = 0和no_ack:IO_SDA = 0)
559 void L0_IICMx_Ack(vtype ch)
560 { //设置SDA 口为输出
561 1 L0_IICMx_SCL(ch,0);
562 1
563 1 L0_IICMx_SDA(ch,0);
564 1
565 1 L0_IICMx_SCL(ch,1);
566 1 L0_IICMx_SCL(ch,0);
567 1 L0_IICMx_SDA(ch,1);
568 1 }
569
570 void L0_IICMx_NoAck(vtype ch)
571 { //设置SDA 口为输出
572 1 L0_IICMx_SCL(ch,0);
573 1 L0_IICMx_SDA(ch,1);
574 1 L0_IICMx_SCL(ch,1);
575 1 L0_IICMx_SCL(ch,0);
576 1
577 1 }
578 /******
579 I2C总线标准规定: 应答位为0表示接收器应答 (ACK) , 常常简记为A;
580 为1则表示非应答 (NACK) ,常简记为NA。
581 发送器发送LSB之后,应当释放SDA线(拉高SDA) ,
582 以等待接收器产生应答位。
583 如果接收器在接收完最后一个字节的数据,
584 或者不能再接收更多的数据时,应当产生非应答信
585 号来通知发送器。发送器如果发现接收器产生了非应答状态,
586 则应当终止发送。
587 // 检测 SDA是否回ACK
588 bit L0_I2C_Test_Ack(void)
589 { //设置SDA 口为输入
590 bit ACK_Flag = 0;
591 L0_I2C_SCL(0);
592 L0_I2C_SDA(1);
593 L0_I2C_SCL(1);
594
595
596 if(IO_SDA = 0)
597 ACK_Flag = 1;
598 else
599 ACK_Flag = 0;
600 L0_I2C_SCL(0);
601 return ACK_Flag;
602 // return 1;// debug
603 }
604 *******/
605 //*************************************************
606 //字节发送程序
607 //发送c(可以是数据也可是地址),送完后接收从应答
608 //不考虑从应答位
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 11
609 void L0_IICMx_SendData(vtype ch,unsigned char c )
610 {
611 1 unsigned char ack=8;
612 1 unsigned char BitCnt=8;//一字节8位
613 1 //设置SDA 口为输出
614 1
615 1 for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位
616 1 {
617 2 if((c << BitCnt ) & 0x80)
618 2 L0_IICMx_SDA(ch,1); //判断发送位
619 2 else
620 2 L0_IICMx_SDA(ch,0);
621 2 L0_IICMx_SCL(ch,1); //置时钟线为高,通知被控器开始接收数据位
622 2 L0_IICMx_SCL(ch,0);
623 2 }//8clk
624 1
625 1 L0_IICMx_SDA(ch,1); //8位发送完后释放数据线,准备接收应答位
626 1 L0_IICMx_SDA_outin(ch,0);
627 1 L0_IICMx_SCL(ch,1);
628 1 ///gRccUs05 += L0_I2C_SDA_ask();
629 1 L0_IICMx_SCL(ch,0);
630 1
631 1 L0_IICMx_SDA_outin(ch,1);
632 1 //// L0_IICMx_delay(ts_iicm.t[ch]);
633 1 }
634 //**************************************************
635 //字节接收程序
636 //接收器件传来的数据,此程序应配合|主应答函数|i2c_ack_main(void)使用
637 //return: uchar型1字节
638 unsigned char L0_IICMx_ReceiveData(vtype ch)
639 {
640 1 unsigned char BitCnt=8,IIC_RX_Data = 0;
641 1 L0_IICMx_SDA(ch,1); //读入数据 设置SDA 口为输入
642 1 L0_IICMx_SDA_outin(ch,0);
643 1 for(BitCnt = 0;BitCnt<8;BitCnt++)
644 1 {
645 2 L0_IICMx_SCL(ch,0); //置时钟线为低,准备接收数据位
646 2 L0_IICMx_SCL(ch,1); //置时钟线为高使数据线上数据有效
647 2 IIC_RX_Data = IIC_RX_Data << 1;
648 2 if(1 == L0_IICMx_SDA_get(ch))
649 2 IIC_RX_Data = IIC_RX_Data + 1; //读数据位,接收的数据位放入retc中
650 2 }// 8clk up
651 1 L0_IICMx_SCL(ch,0);
652 1 L0_IICMx_SDA_outin(ch,1);
653 1 return IIC_RX_Data;
654 1 }
655 /// 读取 n个数据 放入p中
656 void L1_IICMx_ReadNByte(vtype ch,unsigned char Sal, unsigned char *p,unsigned char n)
657 {
658 1 unsigned char i;
659 1 L0_IICMx_Start(ch); // 启动I2C
660 1 L0_IICMx_SendData(ch,(Sal)| 0x01); //发送器件地址
661 1
662 1 for(i = 0;i < n-1;i ++) //读取字节数据
663 1 {
664 2 *(p + i) = L0_IICMx_ReceiveData(ch); //读取数据
665 2 ///printf("%x ",(int)(*(p + i)));
666 2
667 2 L0_IICMx_Ack(ch); //__/```\__
668 2 }
669 1 *(p + n - 1) = L0_IICMx_ReceiveData(ch);
670 1
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 12
671 1 L0_IICMx_NoAck(ch);
672 1 L0_IICMx_Stop(ch);
673 1 }
674
675 #if 0
主机从从设备读取多个字节
Master ST SAD+W SUB SR SAD+R MAK MAK NMAK SP
Slave SAK SAK SAK DATA DATA DATA
0x19
0001 1001
0011 001R
#endif
688
689 ///////////////////////////////
690 ///写入一个reg 为后续的写命令或者读取服务
691 void L1_IICMx_WriteReg(vtype ch,unsigned char sla,unsigned char reg )
692 {
693 1 L0_IICMx_Start(ch); //启动I2C
694 1 L0_IICMx_SendData(ch,sla);//发送器件地址
695 1 L0_IICMx_SendData(ch,reg);
696 1 }
697
698 ///写入一个 s+sla+reg
699 void L2_IICMx_Write1Reg(vtype ch,unsigned char sla,unsigned char reg )
700 {
701 1 L1_IICMx_WriteReg(ch,sla,reg);
702 1 L0_IICMx_Stop(ch);
703 1 }
704
705
706
707 // sla.(reg)=cmd
708 void L2_IICMx_WriteCmd(vtype ch,unsigned char sla,unsigned char reg,unsigned char cmd )
709 {
710 1 L1_IICMx_WriteReg(ch,sla,reg);
711 1 L0_IICMx_SendData(ch,cmd);
712 1 L0_IICMx_Stop(ch);
713 1 /*****************
714 1 if(gRccUs05 >0)///测试iic有效否 发现没有结果
715 1 {
716 1 L0_uart0_uc(gRccUs05);gRccUs05 = 0;
717 1 }
718 1 ***************/
719 1 }
720
721 //读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n)
722 void L2_IICMx_ReadReg(vtype ch,unsigned char sla,unsigned char reg,
723 unsigned char *r,unsigned char n)
724 {
725 1 // U8 d[1];
726 1 //S ADD W A REG A
727 1 L1_IICMx_WriteReg(ch,sla,reg);
728 1 //S ADD R A D1 A D2 A.....DX N P
729 1 L1_IICMx_ReadNByte(ch,sla,r,n);
730 1 }
731
732 //读取reg地址的n个数据 sla.(reg) sla.(reg+1)................ sla.(reg+n)
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 13
733 unsigned char L2_IICMx_Read1Reg1D(vtype ch,unsigned char sla,unsigned char reg)
734 {
735 1 U8 d;
736 1 // U8 d[1];
737 1 //S ADD W A REG A
738 1 L1_IICMx_WriteReg(ch,sla,reg);
739 1 //S ADD R A D1 A D2 A.....DX N P
740 1 L1_IICMx_ReadNByte(ch,sla,&d,1);
741 1 return d;
742 1 }
743
744
745
746
747 #if 0////不可删除
///S 80H A Register Address A S 81H A Data NA P
void L2_tws_ReadReg000(unsigned char sla,unsigned char reg,
unsigned char *v)
{
unsigned char ack=8;
unsigned char BitCnt=8;//一字节8位
// U8 d[1];
//S ADD W A REG A
//// L1_I2C_WriteReg(sla,reg);
//step 1----
L0_I2C_Start(); //启动I2C
//step 2----L0_I2C_SendData(sla);//发送器件地址
//设置SDA 口为输出
for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位
{
if((sla << BitCnt ) & 0x80)
L0_I2C_SDA(1); //判断发送位
else
L0_I2C_SDA(0);
L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位
L0_I2C_SCL(0);
}//8clk
L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位
L0_I2C_SCL(1);
L0_I2C_SCL(0);
//step 3---L0_I2C_SendData(reg);
for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位
{
if((reg << BitCnt ) & 0x80)
L0_I2C_SDA(1); //判断发送位
else
L0_I2C_SDA(0);
L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位
L0_I2C_SCL(0);
}//8clk
L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位
L0_I2C_SCL(1);
L0_I2C_SCL(0);
//step 4----
L0_I2C_Start(); //启动I2C
//step 5---
//设置SDA 口为输出
sla|=0x01;
for(BitCnt = 0;BitCnt < 8;BitCnt ++) //要传送的数据长度为8位
C51 COMPILER V9.54 MSP_IICMX 09/06/2024 11:24:46 PAGE 14
{
if((sla << BitCnt ) & 0x80)
L0_I2C_SDA(1); //判断发送位
else
L0_I2C_SDA(0);
L0_I2C_SCL(1); //置时钟线为高,通知被控器开始接收数据位
L0_I2C_SCL(0);
}//8clk
L0_I2C_SDA(1); //8位发送完后释放数据线,准备接收应答位
L0_I2C_SCL(1);
L0_I2C_SCL(0);
//step 6---receive data
//设置SDA 口为输出
*v = L0_I2C_ReceiveData();
L0_I2C_SCL(1);
L0_I2C_SCL(0);/// send NA
//step 7--- P
L0_I2C_Stop();
}
///S 80H A Register Address A S 81H A Data NA P
#endif
825
826
827
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1471 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 56 ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)