📄 i2c.lst
字号:
165 1 val1=_cror_(val1,1);
166 1 return val1;
167 1 }
168
169
170 void Delay1ms(unsigned char T);
171
172 void I2c_init(void )
173 {
174 1 unsigned char var ;
175 1 P0MDOUT |= 0x1D;
176 1 P1MDOUT |= 0x01;
177 1
178 1 SMB0CN = 0x44; // Enable SMBus with ACKs on acknowledge cycle
179 1 SMB0CR = -80; // SMBus clock rate = 100kHz.
C51 COMPILER V6.12 I2C 05/24/2006 15:23:18 PAGE 4
180 1
181 1 EIE1 |= 2; // SMBus interrupt enable
182 1 EA = 1; // Global interrupt enable
183 1
184 1 SM_BUSY = 0;
185 1 // Free SMBus for first transfer.
186 1 var = GetRealClockStatus();
187 1 ResetRealClock();
188 1 var = GetRealClockStatus();
189 1 SetRealClockStatus(0xc2);
190 1 var = GetRealClockStatus();
191 1 GetRealClock();
192 1 RealTime.RT.Year=0x02;
193 1 RealTime.RT.Month=0x12;
194 1 RealTime.RT.Day=0x010;
195 1 RealTime.RT.Week=0x05;
196 1 RealTime.RT.Hour=0x12;
197 1 RealTime.RT.Minute=0x59;
198 1 RealTime.RT.Second=0x58;
199 1 SetRealClock();
200 1 }
201
202 void TestI2C (void)
203 {
204 1 char year,month,day,week,hour,minute,second ;
205 1
206 1
207 1
208 1 Delay1ms(100);
209 1 Delay1ms(100);
210 1 Delay1ms(100);
211 1 Delay1ms(100);
212 1 Delay1ms(100);
213 1 Delay1ms(100);
214 1 Delay1ms(100);
215 1 Delay1ms(100);
216 1 Delay1ms(100);
217 1
218 1 GetRealClock();
219 1
220 1 year=RealTime.RT.Year;
221 1 month=RealTime.RT.Month;
222 1 day=RealTime.RT.Day;
223 1 week=RealTime.RT.Week;
224 1 hour=RealTime.RT.Hour&0x1f;
225 1 minute=RealTime.RT.Minute;
226 1 second=RealTime.RT.Second;
227 1
228 1
229 1 }
230
231
232 //------------------------------------------------------------------------------------
233 // Interrupt Service Routine
234 //------------------------------------------------------------------------------------
235 void SMBUS_ISR (void) interrupt 7
236 {
237 1 switch (SMB0STA)
238 1 { // SMBus 状态码SMB0STA 寄存器
239 2 // 主发送器/接收器起始条件已发送
240 2 case SMB_START:
241 2 SMB0DAT = COMMAND ; // 装入要访问的从器件的地址
C51 COMPILER V6.12 I2C 05/24/2006 15:23:18 PAGE 5
242 2 STA = 0; // 手动清除START 位
243 2 break;
244 2 //主发送器/接收器重复起始条件已发送
245 2 // 该状态只应在读操作期间出现在存储器地址已发送并得到确认之后 ?
246 2 case SMB_RP_START:
247 2 SMB0DAT = COMMAND; // COMMAND 中应保持从地址 + R.
248 2 STA = 0;
249 2 break;
250 2 // 主发送器从地址 + WRITE 已发送收到ACK
251 2 case SMB_MTADDACK:
252 2 // 主发送器数据字节已发送收到ACK
253 2 case SMB_MTDBACK:
254 2 if (BYTE_NUMBER)
255 2 {
256 3 SMB0DAT = revolve(*I2CDataBuff); // If R/W=WRITE, load byte to write.
257 3 I2CDataBuff++;
258 3 BYTE_NUMBER--;
259 3 }
260 2 else
261 2 {
262 3 STO = 1; SM_BUSY = 0; // Free SMBus
263 3 }
264 2 break;
265 2 // 主发送器从地址 + WRITE 已发送收到NACK
266 2 // 从器件不应答发送STOP + START 重试
267 2 case SMB_MTADDNACK:
268 2 STO = 1; STA = 1;
269 2 break;
270 2 // 主发送器数据字节已发送收到NACK
271 2 // 从器件不应答发送STOP + START 重试
272 2 case SMB_MTDBNACK:
273 2 STO = 1; STA = 1;
274 2 break;
275 2 // 主发送器竞争失败
276 2 // 不应出现如果出现重新开始传输过程
277 2 case SMB_MTARBLOST:
278 2 STO = 1; STA = 1;
279 2 break;
280 2
281 2 // 主接收器从地址 + READ 已发送,收到ACK
282 2 case SMB_MRADDACK:
283 2 AA = 1; // 在应答周期ACK
284 2 if (!BYTE_NUMBER)
285 2 {
286 3 STO = 1; SM_BUSY = 0; // 释放SMBus
287 3 }
288 2 break;
289 2 // 主接收器从地址 + READ 已发送收到NACK
290 2 // 从器件不应答发送重复起始条件重试
291 2 case SMB_MRADDNACK:
292 2 STA = 1;
293 2 break;
294 2 // 收到数据字节ACK 已发送
295 2 // 该状态不应出现因为AA 已在前一状态被清0 如果出现发送停止条件
296 2 case SMB_MRDBACK:
297 2 if (BYTE_NUMBER)
298 2 {
299 3 *I2CDataBuff=revolve(SMB0DAT);
300 3 I2CDataBuff++;
301 3 BYTE_NUMBER--;
302 3 }
303 2 if (!BYTE_NUMBER) AA= 0;
C51 COMPILER V6.12 I2C 05/24/2006 15:23:18 PAGE 6
304 2 break;
305 2 // 收到数据字节NACK 已发送
306 2 // 读操作已完成读数据寄存器后发送停止条件
307 2 case SMB_MRDBNACK:
308 2 STO = 1;
309 2 SM_BUSY = 0; // 释放SMBus
310 2 break;
311 2 // 在本应用中所有其它状态码没有意义通信复位
312 2 default:
313 2 STO = 1; // 通信复位
314 2 SM_BUSY = 0;
315 2 break;
316 2 }
317 1 SI=0; // 清除中断标志
318 1 }
319
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 576 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 14 9
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 + -