📄 i2ceeprom.lst
字号:
C51 COMPILER V8.05a I2CEEPROM 11/26/2007 12:48:20 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE I2CEEPROM
OBJECT MODULE PLACED IN I2CEEPROM.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2CEEPROM.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include"Reg935.h"
2 #include"UserDef.h"
3
4 /*******************************************************************
5 * 申请总线
6 * 功能: 进行I2C总线的初始化----包括时钟选择,
7 I2C使能,发送起始信号等等。
8 * I2EN为1,设置为主机;
9 CRSEL位为0,使用内部SCL发生器
10 *******************************************************************/
11
12 void GetBus()
13 {
14 1 I2SCLH = 15; // 设置SCL高电平的PCLK周期数
15 1 I2SCLL = 15; //设置SCL低电平的PCLK周期数,6MHz 时为100Kbit/S
16 1
17 1 //申请成为主机,起动总线。使用内部SCL发生器,I2EN 和AA 置位
18 1 I2CON = RELEASE_BUS_STA; //I2CON = 0110 0100B = 0x64
19 1 while( SI==0 ); // 等待起始位的发送
20 1 }
21
22
23 /*******************************************************************
24 * 发送数据函数
25 * 功能:用于向总线发送数据
26 * 入口参数:C 待发送的数据
27 *******************************************************************/
28
29 void SendByte(uchar c)
30 {
31 1 I2DAT = c;
32 1 I2CON = RELEASE_BUS_ACK; //I2CON = 0100 0100B = 0x44 ,清除SI位等等
33 1 while( SI==0 ); // 等待数据的发送
34 1 }
35
36
37 /*******************************************************************
38 * 向有子地址器件发送多字节数据函数
39 * 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
40 * 入口参数: slvAddr-- 从器件地址
41 * subAddr-- 子地址(从器件装载数据的地址)
42 * s -- 发送内容的指针
43 * num-- 发送字节数
44 * 出口参数: 返回1 表示操作成功,否则操作有误。
45 ********************************************************************/
46
47 bit ISendStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
48 {
49 1 uchar i;
50 1 uchar subAddrH, subAddrL;
51 1
52 1 subAddrL = (subAddr & 0x00FF);
53 1 subAddrH = (subAddr & 0xFF00)>>8;
54 1
55 1 GetBus(); //启动总线
C51 COMPILER V8.05a I2CEEPROM 11/26/2007 12:48:20 PAGE 2
56 1
57 1 SendByte(slvAddr & WRITE_DATA_COM); //发送器件地址,WRITE_DATA_COM = 0 写控制
58 1
59 1 if( I2STAT!=0x18 ) //已发送器件地址和写信号,并已接收应答信号
60 1 {
61 2 I2CON = GENERATE_STOP;
62 2 return(0);
63 2 }
64 1
65 1 SendByte(subAddrH); //发送器件子地址高位
66 1 if( I2STAT!=0x28 ) //已发送数据,并已接收应答信号
67 1 {
68 2 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
69 2 return(0);
70 2 }
71 1
72 1 SendByte(subAddrL); //发送器件子地址低位
73 1 if( I2STAT!=0x28 ) //已发送数据,并已接收应答信号
74 1 {
75 2 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
76 2 return(0);
77 2 }
78 1
79 1 for(i=0; i<num; i++)
80 1 {
81 2 SendByte(*s); //发送数据
82 2 if(I2STAT!=0x28) //已发送数据,并已接收应答信号
83 2 {
84 3 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
85 3 return(0);
86 3 }
87 2 s++;
88 2 }
89 1
90 1 I2CON = GENERATE_STOP; // 结束总线
91 1 return(1);
92 1 }
93
94
95 /*******************************************************************
96 * 向有子地址器件读取多字节数据函数
97 *功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
98 *入口参数:slvAddr--从器件地址
99 * subAddr--子地址(从器件装载数据的地址)
100 * s -- 读出的内容存储区的指针
101 * num-- 读num个字节。
102 *出口参数:函数返回1表示操作成功,否则操作有误。
103 ********************************************************************/
104
105 bit IRcvStr(uchar slvAddr, uint subAddr, uchar *s, uchar num)
106 {
107 1 uchar i;
108 1 uchar subAddrH, subAddrL;
109 1
110 1 subAddrL = (subAddr & 0x00FF);
111 1 subAddrH = (subAddr & 0xFF00)>>8;
112 1
113 1 GetBus(); //启动总线
114 1
115 1 SendByte(slvAddr & WRITE_DATA_COM); //发送器件地址
116 1 if( I2STAT!=0X18) //已发送器件地址和写信号,并已接收应答信号
117 1 {
C51 COMPILER V8.05a I2CEEPROM 11/26/2007 12:48:20 PAGE 3
118 2 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
119 2 return(0);
120 2 }
121 1
122 1 SendByte(subAddrH); //发送器件子地址高位
123 1 if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
124 1 {
125 2 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
126 2 return(0);
127 2 }
128 1
129 1 SendByte(subAddrL); //发送器件子地址低位
130 1 if( I2STAT!=0X28 ) //已发送数据,并已接收应答信号
131 1 {
132 2 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
133 2 return(0);
134 2 }
135 1
136 1 I2CON = RELEASE_BUS_STA; //I2CON = 0110 0100B = 0x64 ,重新启动总线
137 1 while( SI==0 );
138 1
139 1 SendByte(slvAddr | READ_DATA_COM); //发送读数据信号
140 1
141 1 if( I2STAT!=0X40 ) //已发送器件地址和读信号,并已接收应答信号
142 1 {
143 2 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
144 2 return(0);
145 2 }
146 1
147 1 for(i=0; i<num-1; i++)
148 1 {
149 2 I2CON = RELEASE_BUS_ACK; //I2CON = 0100 0100B = 0x44 ,接收一字节数据并发送应答位
150 2 while( SI==0 ); //等待接收数据
151 2
152 2 if( I2STAT!=0X50 ) //已接收数据字节,已返回应答信号
153 2 {
154 3 I2CON = GENERATE_STOP; //I2CON = 0101 0100B = 0x54 ,产生停止信号
155 3 return(0);
156 3 }
157 2 *s = I2DAT; //读取数据
158 2 }
159 1
160 1 s++;
161 1 I2CON = RELEASE_BUS_NOACK; //I2CON = 0100 0000B = 0x40 ,接收最后一字节数据并发送非应答位
162 1 while( SI==0 );
163 1 *s = I2DAT;
164 1 I2CON = GENERATE_STOP; //结束总线
165 1 return(1);
166 1
167 1 }
168
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 235 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 16
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILER V8.05a I2CEEPROM 11/26/2007 12:48:20 PAGE 4
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -