📄 i2c.lst
字号:
C51 COMPILER V3.96, SN-83203013 I2C 09/12/05 17:49:31 PAGE 1
DOS C51 COMPILER V3.96, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN .\OUT\I2C.OBJ
COMPILER INVOKED BY: C:\C51\BIN\C51.EXE I2C.C-CODE-DEBUG-SMALL-OBJECTEXTEND-OJ(.\OUT\I2C.OBJ)
stmt 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 *
19 *******************************************************************/
20 #include "I2C.h"
21 #include "main.h"
22
23 #define uchar unsigned char
24 #define GENERATE_STOP 0x54 // 置位 STO, 复位 STA 、 SI
25 #define RELEASE_BUS_ACK 0x44 // 复位 STO,STA,SI 并置位 AA (ack)
26 #define RELEASE_BUS_NOACK 0x40 // 复位 STO,STA,SI 并置位 AA (noack)
27 #define RELEASE_BUS_STA 0x64 // 起动总线/重新起动总线, 置位 STA
28
29
30 /*******************************************************************
31 * 申请总线
32 * 功能:进行I2C总线的初始化--包括时钟选择,I2C使能,发送起始信号等等。
33 * I2EN为1,设置为主机;CRSEL位为0,使用内部SCL发生器。
34 *******************************************************************/
35 void GetBus()
36 {
37 1 I2SCLH = 15; // 设置SCL高电平的PCLK周期数
38 1 I2SCLL = 15; // 设置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 {
52 1 I2DAT = c;
53 1 I2CON = RELEASE_BUS_ACK; // 清除SI位等等
54 1 while( SI==0 ); // 等待数据的发送
55 1 }
C51 COMPILER V3.96, SN-83203013 I2C 09/12/05 17:49:31 PAGE 2
56
57
58
59 /*******************************************************************
60 * 向无子地址器件发送字节数据函数
61 * 功能:从启动总线到发送地址,数据,结束总线的全过程。
62 * 入口参数:sla 从器件地址
63 * c 待发送的数据
64 * 出口参数:返回1表示操作成功,否则操作有误。
65 ********************************************************************/
66 bit ISendByte(uchar sla, uchar c)
67 {
68 1 GetBus(); // 启动总线
69 1 SendByte(sla); // 发送器件地址,并接收应答位
70 1 if( I2STAT!=0X18 ) // 无从机应答则退出操作
71 1 { I2CON = GENERATE_STOP;
72 2 return(0);
73 2 }
74 1
75 1 SendByte(c); // 发送数据
76 1 if( I2STAT!=0X28 )
77 1 { I2CON = GENERATE_STOP;
78 2 return(0);
79 2 }
80 1 I2CON = GENERATE_STOP; // 结束总线
81 1 return(1);
82 1 }
83
84
85
86 /*******************************************************************
87 * 向有子地址器件发送多字节数据函数
88 * 功能:从启动总线到发送地址,子地址,数据,结束总线的全过程。
89 * 入口参数;sla 从器件地址
90 * suba 子地址
91 * s 发送内容的指针
92 * no 发送字节数
93 * 出口参数:返回1表示操作成功,否则操作有误。
94 ********************************************************************/
95 bit ISendStr(uchar sla, uchar suba, uchar *s, uchar no)
96 {
97 1 uchar i;
98 1
99 1 GetBus(); // 启动总线
100 1 SendByte(sla); // 发送器件地址
101 1 if( I2STAT!=0X18 )
102 1 { I2CON = GENERATE_STOP;
103 2 return(0);
104 2 }
105 1
106 1 SendByte(suba); // 发送器件子地址
107 1 if( I2STAT!=0X28 )
108 1 { I2CON = GENERATE_STOP;
109 2 return(0);
110 2 }
111 1
112 1 for(i=0; i<no; i++)
113 1 { SendByte(*s); // 发送数据
114 2 if( I2STAT!=0X28 )
115 2 { I2CON = GENERATE_STOP;
116 3 return(0);
117 3 }
C51 COMPILER V3.96, SN-83203013 I2C 09/12/05 17:49:31 PAGE 3
118 2 s++;
119 2 }
120 1
121 1 I2CON = GENERATE_STOP; // 结束总线
122 1 return(1);
123 1 }
124
125
126
127 /*******************************************************************
128 * 向无子地址器件读字节数据函数
129 *功能:从启动总线到发送地址,读数据,结束总线的全过程。
130 *入口参数:sla 从器件地址
131 * c 读出的数据(地址传送)
132 * 出口参数:函数返回1表示操作成功,否则操作有误。
133 ********************************************************************/
134 /*bit IRcvByte(uchar sla, uchar *c)
135 {
136 GetBus(); // 启动总线
137 SendByte(sla+1); // 发送器件地址
138 if( I2STAT!=0X40 )
139 { I2CON = GENERATE_STOP;
140 return(0);
141 }
142 I2CON = RELEASE_BUS_NOACK; // 接收一字节数据即发送非应答位
143 while( SI==0 ); // 等待接收数据/
144 if( I2STAT!=0X58 )
145 { I2CON = GENERATE_STOP;
146 return(0);
147 }
148 *c = I2DAT; // 读取数据
149 I2CON = GENERATE_STOP; // 结束总线
150 return(1);
151 }
152 */
153
154
155 /*******************************************************************
156 * 向有子地址器件读取多字节数据函数
157 *功能:从启动总线到发送地址,子地址,读数据,结束总线的全过程。
158 *入口参数:sla 从器件地址
159 * suba 子地址
160 * s 读出的内容存储区的指针
161 * no 读no个字节。
162 *出口参数:函数返回1表示操作成功,否则操作有误。
163 ********************************************************************/
164 /*bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
165 { uchar i;
166
167 GetBus(); // 启动总线
168 SendByte(sla); //发送器件地址
169 if( I2STAT!=0X18)
170 { I2CON = GENERATE_STOP;
171 return(0);
172 }
173 SendByte(suba); // 发送器件子地址
174 if( I2STAT!=0X28 )
175 { I2CON = GENERATE_STOP;
176 return(0);
177 }
178
179 I2CON = RELEASE_BUS_STA; // 重新启动总线
C51 COMPILER V3.96, SN-83203013 I2C 09/12/05 17:49:31 PAGE 4
180 while( SI==0 );
181 SendByte(sla+1);
182 if( I2STAT!=0X40 )
183 { I2CON = GENERATE_STOP;
184 return(0);
185 }
186
187 for(i=0; i<no-1; i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -