DS1337 时钟芯片在 C8051F 上的实现
1337_MONTH_REG);
54 bcd_year = Read_DS1337(DS1337_YEAR_REG);
55
56 Time.second = bcd2bin(bcd_sec);
57 Time.minute = bcd2bin(bcd_min);
58 Time.hour = bcd2bin(bcd_hrs);
59 Time.day = bcd2bin(bcd_day);
60 Time.date = bcd2bin(bcd_date);
61 Time.month = bcd2bin(bcd_mon);
62 Time.year = bcd2bin(bcd_year);
63 }
第1行的函数为初始化DS1337,读取状态寄存器,如果最高位不为0,则初始化时间。第23行的函数为设置时间,包括年月日星期时分秒。第44行的函数为读取时间。
1 #ifdef eclipse
2 void SMBUS_ISR(void)
3 #else
4 void SMBUS_ISR (void) interrupt ESMB0_VECTOR
5 #endif
6 {
7 switch (SMB0STA)
8 {
9 case SMB_START: //起始条件已发送
10 SMB0DAT = (COMMAND & 0xFE);
11 STA = 0;
12 break;
13 case SMB_RP_START: //重复起始条件已发送
14 SMB0DAT = COMMAND;
15 STA = 0;
16 break;
17 case SMB_MTADDACK: //地址 + WRITE已发送,收到ACK
18 SMB0DAT = wr_data[0];
19 break;
20 case SMB_MTADDNACK: //地址 + WRITE已发送,收到NACK。
21 STO = 1; //发送STOP + START重试
22 STA = 1;
23 break;
24 case SMB_MTDBACK: //数据字节已发送,收到ACK。
25 switch(Mode)
26 {
27 case 1:
28 wrnumber--;
29 if(wrnumber)
30 SMB0DAT = wr_data[1];
31 else
32 {
33 STO = 1;
34 SMB_BUSY=0;
35 }
36 break;
37 case 0:
38 STA = 1;
39 break;
40 default:
41 STO = 1;
42 SMB_BUSY = 0;
43 break;
44 }
45 break;
46 case SMB_MTDBNACK: //数据字节
46 case SMB_MTDBNACK: //数据字节已发送,收到NACK。
47 STO = 1;
48 STA = 1;
49 break;
50 case SMB_MTARBLOST: //竞争失败
51 STO = 1;
52 STA = 1;
53 break;
54 case SMB_MRADDACK: //地址 + READ 已发送。收到ACK
55 AA = 0;
56 break;
57 case SMB_MRADDNACK: //地址 + READ 已发送。收到NACK
58 STO = 0;
59 STA = 1;
60 break;
61 case SMB_MRDBACK: //收到数据字节。ACK已发送
62 get_data = SMB0DAT;
63 SMB_BUSY = 0; //完成
64 STO = 1;
65 break;
66 case SMB_MRDBNACK: //收到数据字节。NACK已发送
67 get_data = SMB0DAT;
68 SMB_BUSY = 0;
69 STO = 1;
70 break;
71 default:
72 STO = 1;
73 break;
74 }
75 SI = 0;
76 }
SMBus中断,需要手动清除中断标志。
3.3 实物

- 芯片I2C通信异常无法读写寄存器破解(08-20)
- 基于C8051F330的便携式生理参数监测仪设计(06-17)
- 基于USB接口的高增益数据采集系统的设计(04-03)
- 便携式设备的低功耗MCU系统设计方法及应用(06-10)
- MC8051 IP核基本结构及原理(04-22)
- 基于C8051F120核心的嵌入式彩色显示系统设计(05-04)
