📄 at24c02.lst
字号:
C51 COMPILER V8.08 AT24C02 01/30/2008 22:54:20 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE AT24C02
OBJECT MODULE PLACED IN AT24C02.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.exe AT24C02.C DB OE
line level source
1 //参考程序A:AT24C02.C SMBUS 24C02 读/写 2005.12.25
2
3 #include <c8051f020.h> // SFR declarations
4 #include <intrins.h>
5 #include "AT24C02.h"
6 #include "GlobeDef.h"
7
8 INT8 data SLAW; // 保存从地址+ WRITE 位
9 INT8 data SLAR; // 保存从地址+ WRITE 位
10 INT8 data WORD,WORDADR; // 保存被收/发的数据字节
11 INT8 data nSendNums; // 保存被收/发的数据字节的数目
12 INT8U data SENDMODE; // SENDMODE作读/写控制字
13 bit SM_BUSY=0; // 忙碌标志位
14
15 extern void SMBUS_ISR(void); // 中断服务程序
16 extern char SLA_READ(char nWordAddr, char nNumber);
17 extern void SLA_SEND(char nWordAddr, char nWord, char nNumber);
18
19 void SLA_SEND(char nWordAddr, char nWord, char nNumber)
20 {
21 1 SENDMODE = 0x01;
22 1 nSendNums = nNumber + 1;
23 1 while (SM_BUSY); // 若SMBUS忙碌就等待
24 1 SM_BUSY = 1; // 置SM_BUSY位(忙碌标志位)为1
25 1 SLAW = SMB_ADDRESS | SMB_WRITE; // COMMAND = 7 个地址位 + 一位WRITE.
26 1 WORD = nWord; // WORD中存放要送到24C02中去的数据(8位)
27 1 WORDADR = nWordAddr; // OP_CODE 中存放被传送数据送入24C02的首地址.
28 1 STO = 0;
29 1 STA = 1; // 启动数据传输
30 1 while (SM_BUSY); // 等待传输完成
31 1 }
32
33 char SLA_READ(char nWordAddr, char nNumber)
34 {
35 1 nSendNums = nNumber;
36 1 SENDMODE = 0x00;
37 1 while (SM_BUSY); // 若SMBUS忙碌就等待
38 1 SM_BUSY = 1; // 置SM_BUSY位(忙碌标志位)为1
39 1 SLAR = SMB_ADDRESS | SMB_READ; // COMMAND = 7 个地址位 + 一位READ
40 1 WORDADR = nWordAddr; // OP_CODE 中存放从24C02读出数据的的首地址.
41 1 STO = 0;
42 1 STA = 1; // 启动传输
43 1 while (SM_BUSY); // 等待传输完成
44 1 return WORD; // 返回读出来的数据(一个字节)
45 1 }
46
47 void SMBUS_ISR (void) interrupt INT_I2C // 中断服务程序
48 {
49 1 switch (SMB0STA) // 根据中断状态码跳转,SMB0STA 是中断状态寄存器
50 1 {
51 2 case SMB_START: // 0x08, (MT & MR) 发送起始位
52 2 SMB0DAT = SLAW ; // 装入被访问的从芯片的写地址
53 2 STA = 0; // 人工清除 STA 位
54 2 SI = 0; // 清除中断标志位
55 2 break;
C51 COMPILER V8.08 AT24C02 01/30/2008 22:54:20 PAGE 2
56 2 case SMB_RP_START: // 0x10,(MT & MR) 重复发送起始位
57 2 SMB0DAT = SLAR; // 装入被访问的从芯片的读地址
58 2 STA = 0; // 人工清除 STA 位
59 2 SI = 0; // 清除中断标志位
60 2 break;
61 2 case SMB_MTADDACK: // 0x18 ,(MT) 发送从地址 + W 后收到ACK
62 2 SMB0DAT = WORDADR;
63 2 SI = 0; // 清除中断标志位
64 2 break;
65 2 case SMB_MTADDNACK: // 0x20,(MT) 发送从地址 + W 后收到NACK
66 2 STO = 1;
67 2 STA = 1;
68 2 SI = 0; // 清除中断标志位
69 2 break;
70 2 case SMB_MTDBACK: // 0x28,(MT) 发送数据后收到ACK
71 2 switch (SENDMODE) // 检查低1位
72 2 {
73 3 case 1:
74 3 nSendNums--;
75 3 if (nSendNums)
76 3 SMB0DAT = WORD;
77 3 else
78 3 {
79 4 STO = 1;
80 4 SM_BUSY = 0;
81 4 }
82 3 break;
83 3 case 0:
84 3 STO = 0;
85 3 STA = 1;
86 3 break;
87 3 default:
88 3 STO = 1;
89 3 SM_BUSY = 0;
90 3 break;
91 3 }
92 2 SI = 0;
93 2 break;
94 2 case SMB_MTDBNACK: // 0x30
95 2 STO = 1;
96 2 STA = 1;
97 2 SI = 0; // 清除中断标志
98 2 break;
99 2 case SMB_MRADDACK: // 0x40
100 2 AA = 0;
101 2 SI = 0;
102 2 break;
103 2 case SMB_MRADDNACK: // 0x48
104 2 STO = 0;
105 2 STA = 1;
106 2 SI = 0;
107 2 break;
108 2 case SMB_MRDBNACK: // 0x58
109 2 WORD = SMB0DAT;
110 2 STO = 1;
111 2 SM_BUSY = 0;
112 2 AA = 1;
113 2 SI = 0;
114 2 break;
115 2 default:
116 2 STO = 1;
117 2 SM_BUSY = 0;
C51 COMPILER V8.08 AT24C02 01/30/2008 22:54:20 PAGE 3
118 2 break;
119 2 }
120 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 207 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 ----
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 + -