📄 i2c.lst
字号:
14 1 if(port==I2C0) I2C0SDA=0;
15 1 if(port==I2C1) I2C1SDA=0;
16 1 }
17
18 void SETSCL(uchar port)
19 {
20 1 if(port==I2C0) I2C0SCL=1;
21 1 if(port==I2C1) I2C1SCL=1;
22 1 }
23
24 void CLRSCL(uchar port)
25 {
26 1 if(port==I2C0) I2C0SCL=0;
27 1 if(port==I2C1) I2C1SCL=0;
28 1 }
29 /*******************************************************************************************
30 启动I2C总线.
31 *******************************************************************************************/
32 void Start_I2c(uchar port)
33 {
34 1 setSCL;
35 1 setSDA;
36 1 delay(0);
37 1 clrSDA;
38 1 delay(0);
39 1 }
40
41 /*******************************************************************************************
42 结束I2C总线
43 ********************************************************************************************/
44 void Stop_I2c(uchar port)
45 {
46 1 setSCL;
47 1 clrSDA;
48 1 delay(0);
49 1 setSDA;
50 1 delay(0);
C51 COMPILER V7.07 I2C 07/08/2005 10:08:22 PAGE 5
51 1 }
52
53 /*******************************************************************
54 发送一个字节
55 ********************************************************************/
56 bit SendByte(uchar c, uchar port)
57 {
58 1 uchar BitCnt;
59 1 bit ack;
60 1
61 1 for(BitCnt=0;BitCnt<8;BitCnt++) /*数据长度为8位*/
62 1 {
63 2 clrSCL;
64 2 if((c<<BitCnt)&0x80) setSDA; /*设置数据位*/
65 2 else clrSDA;
66 2 delay(0);
67 2 setSCL; /*置时线为高电平,通知接收方读数据*/
68 2 delay(0);
69 2 }
70 1
71 1 clrSCL;
72 1 setSDA; /*8位数据发送完毕,释放数据线,准备接收应答。*/
73 1 delay(0);
74 1 setSCL;
75 1 if(port==I2C0)
76 1 {
77 2 if(I2C0SDA==1) ack=0; /*检查是否收到了确认信号。ack==0,不确认*/
78 2 else ack=1; /* ack==1,确认。*/
79 2 }
80 1 if(port==I2C1)
81 1 {
82 2 if(I2C1SDA==1) ack=0; /*检查是否收到了确认信号。ack==0,不确认*/
83 2 else ack=1; /*ack==1,确认。*/
84 2 }
85 1 delay(0);
86 1 clrSCL;
87 1 clrSDA;
88 1 delay(0);
89 1 if(ack==1) return(1); /*如果成功写入了数据,返回1*/
90 1 else return(0);
91 1 }
92
93 /*******************************************************************
94 读一个字节,读完数据要应答
95 ********************************************************************/
96 uchar RcvByte(uchar port)
97 {
98 1 uchar retc;
99 1 uchar BitCnt;
100 1
101 1 retc=0;
102 1 for(BitCnt=0;BitCnt<8;BitCnt++)
103 1 {
104 2 clrSCL; /*准备接收数据*/
105 2 setSDA; /*把数据线输出寄存器设为1,为输入数据作准备。*/
106 2 delay(0);
107 2 setSCL; /*置时钟线为高是平,使数据线上的数据有效*/
108 2 retc=retc<<1;
109 2 if(port==I2C0)
110 2 {
111 3 if(I2C0SDA==1)retc=retc+1; /*读数据位 */
112 3 }
C51 COMPILER V7.07 I2C 07/08/2005 10:08:22 PAGE 6
113 2 if(port==I2C1)
114 2 {
115 3 if(I2C1SDA==1)retc=retc+1; /*读数据位*/
116 3 }
117 2 delay(0);
118 2 }
119 1 return(retc); /*返回收到的数据*/
120 1 }
121
122 /********************************************************************
123 应答函数
124 ********************************************************************/
125 void Ack_I2c(bit a, uchar port)
126 {
127 1 clrSCL;
128 1 if(a==0)clrSDA; /*确认信号*/
129 1 else setSDA; /*不确认*/
130 1 delay(0);
131 1 setSCL;
132 1 delay(0);
133 1 }
134
135 /********************************************************************************************
136 多字节数据写函数
137 功能: 通过"port"总线,向器件地址为"sla"的E2PROM从子地址"suba"开始写入"no"个数据,要发送的数据在指钟"s"所指
-向的地址中。返回值为1表示操作成功。
138 ********************************************************************************************/
139 bit WriteStr(uchar sla,uchar suba,uchar *s,uchar no, uchar port)
140 {
141 1 uchar i;
142 1
143 1 Start_I2c(port); /*I2C Start*/
144 1 if(SendByte(sla, port)==0) return(0); /*发送器件地址*/
145 1 if(SendByte(suba, port)==0) return(0); /*发送子地址*/
146 1
147 1 for(i=0;i<no;i++)
148 1 {
149 2 if(SendByte(*s, port)==0) return(0); /*发送数据*/
150 2 s++;
151 2 }
152 1 Stop_I2c(port); /*I2C Stop*/
153 1 return(1);
154 1 }
155
156 /********************************************************************************************
157 多字节数据读函数
158 功能: 通过"port"总线,从器件地址为"sla"的E2PROM的子地址"suba"开始读取"no"个数据,读取的数据放在指钟"s"所指
-向的地址中。返回值为1表示操作成功。
159 ********************************************************************************************/
160 bit ReadStr(uchar sla,uchar suba,uchar *s,uchar no, uchar port)
161 {
162 1 uchar i;
163 1
164 1 Start_I2c(port); /*I2C Start*/
165 1 if(SendByte(sla, port)==0) return(0); /*发送器件地址*/
166 1 if(SendByte(suba,port)==0) return(0); /*发送子地址*/
167 1
168 1 Start_I2c(port); /*ReStart*/
169 1 if(SendByte(sla+1, port)==0) return(0);
170 1
171 1 for(i=0;i<no-1;i++)
172 1 {
C51 COMPILER V7.07 I2C 07/08/2005 10:08:22 PAGE 7
173 2 *s=RcvByte(port); /*接收最后一位数据*/
174 2 Ack_I2c(0, port); /*发送应答位*/
175 2 s++;
176 2 }
177 1 *s=RcvByte(port); /*接收最后一位数据*/
178 1 Ack_I2c(1, port); /*发送应答位*/
179 1 Stop_I2c(port); /*结束总线*/
180 1 return(1);
181 1 }
182
183 /********************************************************************************************
184 延时函数,没有返回值。
185 ********************************************************************************************/
186 void delay(int us)
187 {
188 1 int i;
189 1 for(i=0;i<us;i++) _Nop();
190 1 }
191
192 bit Wait(uchar sla, uchar port)
193 {
194 1 int i;
195 1 bit ack;
196 1
197 1 i=0;
198 1 do
199 1 {
200 2 Start_I2c(port);
201 2 i++;
202 2 if(i>30000) return(0); /*如果等待时间超过30ms,结束等待,以免死循环*/
203 2 ack=SendByte(sla, port); /*发送器件地址*/
204 2 } while(!ack);
205 1 Start_I2c(port);
206 1 Stop_I2c(port);
207 1 return(1);
208 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 634 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 29
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -