📄 hi2c_c51.lst
字号:
C51 COMPILER V8.08 HI2C_C51 04/16/2008 11:17:07 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE HI2C_C51
OBJECT MODULE PLACED IN HI2C_C51.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE HI2C_C51.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************
2 * P89LPC932硬件I2C软件包(主)
3 * 1 使用I2C总线软件包时P1.2,P1.3切勿写为0,并要设置为开漏输出。
4 * 2 总线定义为P1.2=SCL,P1.3=SDA,需外接上拉电阻2-10k。
5 * 3 相应寄存器:
6 * 地址寄存器 I2ADR 用于存放自身从地址(从方式时才有用)
7 * 数据寄存器 I2DAT 接收/发送数据用
8 * 控制寄存器 I2CON 用于硬件I2C的设置、使能、启动、结束,
9 * 应答控制,中断标志等。
10 * 状态寄存器 I2STAT 指示I2C总线的操作状态码,高5位有效,
11 * 若I2C中断志置位,可查询此寄存器判断
12 * 总线情况。
13 * SCL占空比寄存器 I2SCLH、I2SCLL 设置SCL的频率发生。
14 *
15 * 此软件包是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并
16 * 使用看门狗,以防等待总线而造成死机。
17 * 文件名:HI2C_C51.C
18 * 更新时间:2002.11.05
19 *******************************************************************/
20 #include <REG931.H>
21 #include"HI2C_C51.H"
22 //#include"main.h"
23
24 #define uchar unsigned char
25 #define GENERATE_STOP 0x54 /* 置位 STO, 复位 STA 、 SI */
26 #define RELEASE_BUS_ACK 0x44 /* 复位 STO,STA,SI 并置位 AA (ack) */
27 #define RELEASE_BUS_NOACK 0x40 /* 复位 STO,STA,SI 并置位 AA (noack) */
28 #define RELEASE_BUS_STA 0x64 /* 起动总线/重新起动总线, 置位 STA */
29
30
31 /*******************************************************************
32 * 申请总线
33 * 功能:进行I2C总线的初始化--包括时钟选择,I2C使能,发送起始信号等等。
34 * I2EN为1,设置为主机;CRSEL位为0,使用内部SCL发生器。
35 *******************************************************************/
36 void GetBus()
37 { I2SCLH = 100; /* 设置SCL高电平的PCLK周期数 */
38 1 I2SCLL = 100; /* 设置SCL低电平的PCLK周期数,6MHz时为100Kbit/S */
39 1 /* 申请成为主机,起动总线。使用内部SCL发生器,I2EN和AA置位。 */
40 1 I2CON = RELEASE_BUS_STA;
41 1 while( SI==0 ); /* 等待起始位的发送 */
42 1 }
43
44
45 /*******************************************************************
46 * 发送数据函数
47 * 功能:用于向总线发送数据
48 * 入口参数:ACC 待发送的数据
49 *******************************************************************/
50 void SendByte(uchar c)
51 { I2DAT = c;
52 1 I2CON = RELEASE_BUS_ACK; /* 清除SI位等等 */
53 1 while( SI==0 ); /* 等待数据的发送 */
54 1 }
55
C51 COMPILER V8.08 HI2C_C51 04/16/2008 11:17:07 PAGE 2
56
57
58 /*******************************************************************
59 * 向无子地址器件发送字节数据函数
60 * 功能:从启动总线到发送地址,数据,结束总线的全过程。
61 * 入口参数:sla 从器件地址
62 * c 待发送的数据
63 * 出口参数:返回1表示操作成功,否则操作有误。
64 ********************************************************************/
65 bit ISendByte(uchar sla, uchar c)
66 { GetBus(); /* 启动总线 */
67 1 SendByte(sla); /* 发送器件地址,并接收应答位 */
68 1 if( I2STAT!=0X18 ) /* 无从机应答则退出操作 */
69 1 { I2CON = GENERATE_STOP;
70 2 return(0);
71 2 }
72 1
73 1 SendByte(c); /* 发送数据 */
74 1 if( I2STAT!=0X28 )
75 1 { I2CON = GENERATE_STOP;
76 2 return(0);
77 2 }
78 1 I2CON = GENERATE_STOP; /* 结束总线 */
79 1 return(1);
80 1 }
81
82
83
84 /*******************************************************************
85 * 向有子地址器件发送多字节数据函数
86 * 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
87 * 入口参数;sla 从器件地址
88 * suba 子地址
89 * s 发送内容的指针
90 * no 发送字节数
91 * 出口参数:返回1表示操作成功,否则操作有误。
92 ********************************************************************/
93 bit ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
94 { uchar i;
95 1
96 1 GetBus(); /* 启动总线 */
97 1 SendByte(sla); /* 发送器件地址 */
98 1 if( I2STAT!=0X18 )
99 1 { I2CON = GENERATE_STOP;
100 2 return(0);
101 2 }
102 1
103 1 SendByte(suba); /* 发送器件子地址 */
104 1 if( I2STAT!=0X28 )
105 1 { I2CON = GENERATE_STOP;
106 2 return(0);
107 2 }
108 1
109 1 for(i=0; i<no; i++)
110 1 { SendByte(*s); /* 发送数据 */
111 2 if( I2STAT!=0X28 )
112 2 { I2CON = GENERATE_STOP;
113 3 return(0);
114 3 }
115 2 s++;
116 2 }
117 1
C51 COMPILER V8.08 HI2C_C51 04/16/2008 11:17:07 PAGE 3
118 1 I2CON = GENERATE_STOP; /* 结束总线 */
119 1 return(1);
120 1 }
121
122
123
124 /*******************************************************************
125 * 向无子地址器件读字节数据函数
126 *功能:从启动总线到发送地址,读数据,结束总线的全过程。
127 *入口参数:sla 从器件地址
128 * c 读出的数据(地址传送)
129 * 出口参数:函数返回1表示操作成功,否则操作有误。
130 ********************************************************************/
131 bit IRcvByte(uchar sla, uchar *c)
132 { GetBus(); /* 启动总线 */
133 1 SendByte(sla+1); /* 发送器件地址 */
134 1 if( I2STAT!=0X40 )
135 1 { I2CON = GENERATE_STOP;
136 2 return(0);
137 2 }
138 1 I2CON = RELEASE_BUS_NOACK; /* 接收一字节数据即发送非应答位 */
139 1 while( SI==0 ); /* 等待接收数据 */
140 1 if( I2STAT!=0X58 )
141 1 { I2CON = GENERATE_STOP;
142 2 return(0);
143 2 }
144 1 *c = I2DAT; /* 读取数据 */
145 1 I2CON = GENERATE_STOP; /* 结束总线 */
146 1 return(1);
147 1 }
148
149
150
151 /*******************************************************************
152 * 向有子地址器件读取多字节数据函数
153 *功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
154 *入口参数:sla 从器件地址
155 * suba 子地址
156 * s 读出的内容存储区的指针
157 * no 读no个字节。
158 *出口参数:函数返回1表示操作成功,否则操作有误。
159 ********************************************************************/
160 bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
161 { uchar i;
162 1
163 1 GetBus(); /* 启动总线 */
164 1 SendByte(sla); /* 发送器件地址 */
165 1 if( I2STAT!=0X18)
166 1 { I2CON = GENERATE_STOP;
167 2 return(0);
168 2 }
169 1 SendByte(suba); /* 发送器件子地址 */
170 1 if( I2STAT!=0X28 )
171 1 { I2CON = GENERATE_STOP;
172 2 return(0);
173 2 }
174 1
175 1 I2CON = RELEASE_BUS_STA; /* 重新启动总线 */
176 1 while( SI==0 );
177 1 SendByte(sla+1);
178 1 if( I2STAT!=0X40 )
179 1 { I2CON = GENERATE_STOP;
C51 COMPILER V8.08 HI2C_C51 04/16/2008 11:17:07 PAGE 4
180 2 return(0);
181 2 }
182 1
183 1 for(i=0; i<no-1; i++)
184 1 { I2CON = RELEASE_BUS_ACK; /* 接收一字节数据并发送应答位 */
185 2 while( SI==0 ); /* 等待接收数据 */
186 2 if( I2STAT!=0X50 )
187 2 { I2CON = GENERATE_STOP;
188 3 return(0);
189 3 }
190 2 *s = I2DAT; /* 读取数据 */
191 2 s++;
192 2 }
193 1 I2CON = RELEASE_BUS_NOACK; /* 接收最后一字节数据并发送非应答位 */
194 1 while( SI==0 );
195 1 *s = I2DAT;
196 1 I2CON = GENERATE_STOP; /* 结束总线 */
197 1 return(1);
198 1 }
199
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 276 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -