📄 iic.lst
字号:
127 void IIC_Write(BYTE id,BYTE addr,BYTE *databuf,WORD number)
128 {
129 1 int i;
130 1 BYTE count = 0;
131 1
132 1 do
133 1 {
134 2 count++;
135 2
136 2 // Stop
137 2 byMTV_IIC_CTR = 0x00;
138 2 byMTV_IIC_CTR = 0x02;
139 2 Short_Delay(20);
140 2
141 2 byMTV_IIC_INTFLG = 0x00;
142 2
143 2 // Slave ID
144 2 byMTV_IIC_MBUF = id;
145 2
146 2 // Start
147 2 byMTV_IIC_CTR = 0x00;
148 2 byMTV_IIC_CTR = 0x01;
149 2
150 2 Wait_IIC_Ack();
151 2
152 2 if (bNoAck)
153 2 continue;
154 2
155 2 // Address
156 2 byMTV_IIC_MBUF = addr;
157 2
158 2 Wait_IIC_Ack();
159 2
160 2 if (bNoAck)
161 2 continue;
162 2
163 2 // data
164 2 for(i = 0; i < number; i++)
165 2 {
166 3 byMTV_IIC_MBUF = databuf[i];
167 3
168 3 Wait_IIC_Ack();
169 3 if(bNoAck)
170 3 break;
C51 COMPILER V6.10 IIC 12/02/2004 10:58:52 PAGE 18
171 3 }
172 2
173 2 if (bNoAck)
174 2 continue;
175 2
176 2 // Stop
177 2 byMTV_IIC_CTR = 0x00;
178 2 byMTV_IIC_CTR = 0x02;
179 2 }
180 1 //while(bNoAck);
181 1 while(bNoAck && count < IICRetry);
182 1
183 1 }
184
185 //--------------------------------------------------------
186 // IIC Read address
187 //--------------------------------------------------------
188 void IIC_Read(BYTE id,BYTE addr,BYTE *databuf,WORD number)
189 {
190 1 int i;
191 1 BYTE count = 0;
192 1
193 1 do
194 1 {
195 2 count++;
196 2
197 2 // Stop
198 2 byMTV_IIC_CTR = 0x00;
199 2 byMTV_IIC_CTR = 0x02;
200 2 Short_Delay(20);
201 2
202 2 byMTV_IIC_INTFLG = 0x00;
203 2
204 2 // Slave ID
205 2 byMTV_IIC_MBUF = id;
206 2
207 2 // Start
208 2 byMTV_IIC_CTR = 0x00;
209 2 byMTV_IIC_CTR = 0x01;
210 2
211 2 Wait_IIC_Ack();
212 2
213 2 if (bNoAck)
214 2 continue;
215 2
216 2 // Address
217 2 byMTV_IIC_MBUF = addr;
218 2
219 2 Wait_IIC_Ack();
220 2
221 2 if (bNoAck)
222 2 continue;
223 2
224 2 // Stop
225 2 byMTV_IIC_CTR = 0;
226 2 byMTV_IIC_CTR = 0x2;
227 2 Short_Delay(20);
228 2
229 2 // Slave ID
230 2 byMTV_IIC_MBUF = id | 0x01;
231 2
232 2 // Start
C51 COMPILER V6.10 IIC 12/02/2004 10:58:52 PAGE 19
233 2 byMTV_IIC_CTR = 0x0;
234 2 byMTV_IIC_CTR = 0x1;
235 2
236 2 Wait_IIC_Ack();
237 2
238 2 if (bNoAck)
239 2 continue;
240 2
241 2 // useless data
242 2 databuf[0] = byMTV_IIC_MBUF;
243 2
244 2 // data
245 2 for(i = 0; i < number-1; i++)
246 2 {
247 3 Wait_IIC_Ack();
248 3 if(bNoAck)
249 3 break;
250 3 databuf[i] = byMTV_IIC_MBUF;
251 3 }
252 2
253 2 if(bNoAck)
254 2 continue;
255 2
256 2 byMTV_IIC_CTR = 0x05;
257 2
258 2 Wait_IIC_Ack();
259 2
260 2 if (bNoAck)
261 2 continue;
262 2
263 2 databuf[i] = byMTV_IIC_MBUF;
264 2
265 2 // Stop
266 2 byMTV_IIC_CTR = 0x00;
267 2 byMTV_IIC_CTR = 0x02;
268 2 }
269 1 while(bNoAck && count < IICRetry);
270 1
271 1 }
272 #endif
273
274
275 #ifdef IIC_SW_2526
//--------------------------------------------------------
void IIC_Start(void)
{
ResSDA;
ResSCL;
}
void IIC_Stop(void)
{
SetSDA;
ResSDA;
SetSCL;
while(!GetSCL);
SetSDA;
}
void Initial_I2C(void)
{
EEP_Wait = 0;
C51 COMPILER V6.10 IIC 12/02/2004 10:58:52 PAGE 20
IIC_Stop();
}
void IIC_Send1Byte(BYTE senddata)
{
BYTE i;
for(i = 0; i < 8; i++)
{
if(senddata & 0x80)
SetSDA;
else
ResSDA;
senddata <<=1;
SetSCL;
while(!GetSCL);
ResSCL;
}
ResSCL;
SetSDA;
SetSCL;
while(!GetSCL);
if (GetSDA)
bNoAck = 1;
else
bNoAck = 0;
ResSCL;
}
BYTE IIC_Read1Byte(BIT noack)
{
BYTE i,readdata=0;
for(i = 0; i < 8; i++)
{
readdata <<= 1;
SetSDA;
SetSCL;
while(!GetSCL);
if(GetSDA)
readdata |= 0x01;
ResSCL;
}
if(noack)
SetSDA;
else
ResSDA;
SetSCL;
while(!GetSCL);
ResSCL;
C51 COMPILER V6.10 IIC 12/02/2004 10:58:52 PAGE 21
return readdata;
}
//--------------------------------------------------------
// IIC write address
//--------------------------------------------------------
void IICSW_Write(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
{
count++;
// Stop
IIC_Stop();
Short_Delay(20);
// Start
IIC_Start();
// Slave ID
IIC_Send1Byte(id);
if (bNoAck)
continue;
// Address
IIC_Send1Byte(addr);
if (bNoAck)
continue;
// data
for(i = 0; i < number; i++)
{
IIC_Send1Byte(databuf[i]);
if(bNoAck)
break;
}
if (bNoAck)
continue;
// Stop
IIC_Stop();
}
while(bNoAck && count < 10);
}
//--------------------------------------------------------
// IIC Read address
//--------------------------------------------------------
void IICSW_Read(BYTE id,BYTE addr,BYTE *databuf,WORD number)
{
int i;
BYTE count = 0;
do
C51 COMPILER V6.10 IIC 12/02/2004 10:58:52 PAGE 22
{
count++;
// Stop
IIC_Stop();
Short_Delay(20);
// Start
IIC_Start();
// Slave ID
IIC_Send1Byte(id);
if (bNoAck)
continue;
// Address
IIC_Send1Byte(addr);
if (bNoAck)
continue;
// IIC_Stop();
// Short_Delay(20);
SetSDA;
SetSCL;
while(!GetSCL);
// IIC_Start();
// Start
IIC_Start();
// Slave ID
IIC_Send1Byte(id | 0x01);
if (bNoAck)
continue;
// data
for(i = 0; i < number-1; i++)
{
databuf[i] = IIC_Read1Byte(0);
}
databuf[i] = IIC_Read1Byte(1);
// Stop
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -