📄 i2c.lst
字号:
C51 COMPILER V8.01 I2C 09/30/2007 11:14:56 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE I2C
OBJECT MODULE PLACED IN I2C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE I2C.c LARGE BROWSE DEBUG OBJECTEXTEND CODE SYMBOLS
line level source
1 #define __I2C_H__
2
3 #include "Config.h"
4
5 #define SLA24CL04 0xA4 //1010,0(A2)1(A1)0(高半叶)0 低256字节
6
7 #define SLA3104Mem 0xA0 //1010,*(无关位)0(A1)0(A0)0
8 #define SLA3104RTC 0xD0 //1101,*(无关位)0(A1)0(A0)0
9
10 /********************************************************************************************************
11 函数名称:I2CMasterInit
12 函数功能:初始化I2C模块
13 输 入:无
14 输 出:无
15 ********************************************************************************************************/
16 void I2CMasterInit(void)
17 {
18 1 PERIPHEN1 |= BIT5; //使能I2C外设模块
19 1
20 1 I2CTIMING = 0x0C; //大概100KHz
21 1 I2CCONFIG = 0x01; //主模式
22 1
23 1 }
24 /********************************************************************************************************
25 函数名称:WaitTxEmpty
26 函数功能:等待发送空
27 输 入:无
28 输 出:无
29 ********************************************************************************************************/
30 void WaitTxEmpty(void)
31 {
32 1 #ifdef DOWNLOAD
33 1 while((I2CSTATUS & BIT0) == 0x00);
34 1 #endif
35 1 }
36
37 /********************************************************************************************************
38 函数名称:WaitRxAvailable
39 函数功能:等待接收完毕
40 输 入:无
41 输 出:无
42 ********************************************************************************************************/
43 void WaitRxAvailable(void)
44 {
45 1 #ifdef DOWNLOAD
46 1 while((I2CSTATUS & BIT1) == 0x00);
47 1 #endif
48 1 }
49
50 /********************************************************************************************************
51 函数名称:WaitI2CIdle
52 函数功能:等待I2C总线空闲
53 输 入:无
54 输 出:无
55 ********************************************************************************************************/
C51 COMPILER V8.01 I2C 09/30/2007 11:14:56 PAGE 2
56 void WaitI2CIdle(void)
57 {
58 1 #ifdef DOWNLOAD
59 1 while((I2CSTATUS & BIT3) == 0x00);
60 1 #endif
61 1 }
62
63 /********************************************************************************************************
64 **函数名称:I2CNByteRecv
65 **函数功能:I2C总线向有子地址器件读取多字节数据函数
66 **输 Sla 从机地址;
67 ** SubAddr 丛机子地址;
68 ** pRecvBuf 待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
69 ** Num 待发送数据的字节数
70 **输 出:返回0表示操作失败,返回1表示操作成功
71 ********************************************************************************************************/
72 uchar I2CNByteRecv(uchar Sla, uint SubAddr, uchar *pRecvBuf, uint Num)
73 {
74 1 I2CRXTX = Sla; //写从机地址,发送写命令
75 1 WaitTxEmpty(); //等待发送完成
76 1 I2CRXTX = (uchar)(SubAddr >> 8);
77 1 WaitTxEmpty(); //等待发送完成
78 1 I2CRXTX = (uchar)(SubAddr & 0xFF);
79 1 WaitTxEmpty(); //等待发送完成
80 1
81 1 WaitI2CIdle(); //等待总线空闲(这将产生一个停止)
82 1
83 1 I2CRXTX = Sla + 1; //发送读命令,重新启动总线
84 1 WaitTxEmpty(); //等待发送完成
85 1
86 1 for(; Num > 1; Num --)
87 1 {
88 2 WaitRxAvailable(); //等待接收数据完成
89 2 *pRecvBuf = I2CRXTX;
90 2 pRecvBuf ++;
91 2 }
92 1
93 1 I2CCONFIG |= BIT1; //接收完最后一个数据发送非应答
94 1 WaitRxAvailable(); //等待接收数据完成
95 1 *pRecvBuf = I2CRXTX;
96 1
97 1 I2CCONFIG &= ~BIT1; //接收完最后一个数据发送非应答
98 1 WaitI2CIdle();
99 1
100 1 return 1;
101 1 }
102
103 /********************************************************************************************************
104 **函数名称:I2CNByteSend
105 **函数功能:I2C 总线向有子地址器件发送多字节数据函数
106 **输 入: Sla 从机地址;
107 ** SubAddr 丛机子地址;
108 ** pStr 待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
109 ** Num 待发送数据的字节数
110 **输 出: 返回0表示操作失败,返回1表示操作成功
111 ********************************************************************************************************/
112 uchar I2CNByteSend(uchar Sla, uint SubAddr, uchar *pSendBuf, uint Num)
113 {
114 1 I2CRXTX = Sla; //写从机地址,发送写命令
115 1 WaitTxEmpty(); //等待发送完成
116 1 I2CRXTX = (uchar)(SubAddr >> 8);
117 1 WaitTxEmpty(); //等待发送完成
C51 COMPILER V8.01 I2C 09/30/2007 11:14:56 PAGE 3
118 1 I2CRXTX = (uchar)(SubAddr & 0xFF);
119 1 WaitTxEmpty(); //等待发送完成
120 1
121 1 for(; Num > 0; Num --)
122 1 {
123 2 I2CRXTX = *pSendBuf;
124 2 pSendBuf ++;
125 2 WaitTxEmpty(); //等待发送完成
126 2 }
127 1
128 1 WaitI2CIdle();
129 1 return 1;
130 1 }
131
132
133 /********************************************************************************************************
134 24CL04的读写有一些特殊故单写出来
135 ********************************************************************************************************/
136 /********************************************************************************************************
137 **函数名称:FM24CL04NByteRecv
138 **函数功能:I2C总线向有子地址器件读取多字节数据函数
139 **输 入:Sla 从机地址;
140 * SubAddr 丛机子地址;
141 * pRecvBuf 待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
142 * Num 待发送数据的字节数
143 **输 出:返回0表示操作失败,返回1表示操作成功
144 ********************************************************************************************************/
145 uchar FM24CL04NByteRecv(uchar Sla, uint SubAddr, uchar *pRecvBuf, uint Num)
146 {
147 1 uchar UserSla;
148 1
149 1 if(SubAddr <= 0xFF) //写低页数据
150 1 {
151 2 UserSla = Sla; //保存从机地址
152 2
153 2 I2CRXTX = Sla; //写从机地址,发送写命令
154 2 WaitTxEmpty(); //等待发送完成
155 2 I2CRXTX = (uchar)(SubAddr & 0xFF);
156 2 WaitTxEmpty(); //等待发送完成
157 2 }
158 1 else
159 1 {
160 2 UserSla = (Sla | BIT1); //保存从机地址
161 2
162 2 I2CRXTX = (Sla | BIT1); //写从机地址,发送写命令,选择低半页,256字节
163 2 WaitTxEmpty(); //等待发送完成
164 2 I2CRXTX = (uchar)(SubAddr & 0xFF); //低八位地址
165 2 WaitTxEmpty(); //等待发送完成
166 2 }
167 1
168 1 WaitI2CIdle();
169 1
170 1 I2CRXTX = UserSla + 1; //发送读命令,重新启动总线
171 1
172 1 WaitTxEmpty(); //等待发送完成
173 1
174 1 for(; Num > 1; Num --)
175 1 {
176 2 WaitRxAvailable(); //等待接收数据完成
177 2 *pRecvBuf = I2CRXTX;
178 2 pRecvBuf ++;
179 2 }
C51 COMPILER V8.01 I2C 09/30/2007 11:14:56 PAGE 4
180 1
181 1 I2CCONFIG |= BIT1; //接收完最后一个数据发送非应答
182 1 WaitRxAvailable(); //等待接收数据完成
183 1 *pRecvBuf = I2CRXTX;
184 1
185 1 I2CCONFIG &= ~BIT1; //接收完最后一个数据发送非应答
186 1 WaitI2CIdle();
187 1 return 1;
188 1 }
189
190 /********************************************************************************************************
191 **函数名称:FM24CL04NByteSend
192 **函数功能:I2C 总线向有子地址器件发送多字节数据函数
193 **输 入:Sla 从机地址;
194 * SubAddr 丛机子地址;
195 * pStr 待发送的数据缓冲头指针,若是发送单字节则直接取变量地址即可;
196 * Num 待发送数据的字节数
197 **输 出:返回0表示操作失败,返回1表示操作成功
198 ********************************************************************************************************/
199 uchar FM24CL04NByteSend(uchar Sla, uint SubAddr, uchar *pSendBuf, uint Num)
200 {
201 1 if(SubAddr <= 0xFF) //写低页数据
202 1 {
203 2 I2CRXTX = Sla; //写从机地址,发送写命令
204 2 WaitTxEmpty(); //等待发送完成
205 2 I2CRXTX = (uchar)(SubAddr & 0xFF);
206 2 WaitTxEmpty(); //等待发送完成
207 2 }
208 1 else
209 1 {
210 2 I2CRXTX = (Sla | BIT1); //写从机地址,发送写命令,选择低半页,256字节
211 2 WaitTxEmpty(); //等待发送完成
212 2 I2CRXTX = (uchar)(SubAddr & 0xFF); //低八位地址
213 2 WaitTxEmpty(); //等待发送完成
214 2 }
215 1
216 1 for(; Num > 0; Num --)
217 1 {
218 2 I2CRXTX = *pSendBuf;
219 2 pSendBuf ++;
220 2 WaitTxEmpty(); //等待发送完成
221 2 }
222 1
223 1 WaitI2CIdle();
224 1 return 1;
225 1 }
226 /********************************************************************************************************
227 **函数名称:FM24CL04Test
228 **函数功能:24CL04数据存储器测试
229 **输 入:无
230 **输 出:无
231 ********************************************************************************************************/
232 void FM24CL04Test(void)
233 {
234 1 //------------------------------------------------------------
235 1 //I2C接口存储器FM24CL04测试使用到的变量
236 1 //------------------------------------------------------------
237 1 uint Addr;
238 1 uchar DatWR; //写入的数据
239 1 uchar xdata WRStore[512] = {0}; //写入数据存储的数组
240 1 uchar xdata RDStore[512] = {0}; //读取的数据存储殊组
241 1 //------------------------------------------------------------
C51 COMPILER V8.01 I2C 09/30/2007 11:14:56 PAGE 5
242 1
243 1 Addr = 0x0000; //24CL04的地址计数器
244 1
245 1 UART0_Printf("\n ->FM24CL04 test begin! \n");
246 1 //------------------------------------------------------------
247 1 //先将待写的数据存储,方便用写多字节的方法一次写入
248 1 //------------------------------------------------------------
249 1 for(Addr = 0x00; Addr < 512; Addr ++)
250 1 {
251 2 DatWR = (int)rand();
252 2 WRStore[Addr] = DatWR;
253 2 }
254 1 FM24CL04NByteSend(SLA24CL04, 0x00, WRStore, 512);
255 1
256 1 #ifdef FM24CL04DATASHOW
UART0_Printf("\n\n Write to 0x:%x \n",0x0000);
for(Addr = 0x00; Addr < 512; Addr ++)
{
UART0_Printf(" %d ",(int)WRStore[Addr]);
}
#endif
263 1
264 1 //------------------------------------------------------------
265 1 //读出所有的数据并存起来,下面将其写入的数据挨个比较
266 1 //------------------------------------------------------------
267 1 FM24CL04NByteRecv(SLA24CL04, 0x00, RDStore, 512);
268 1
269 1 #ifdef FM24CL04DATASHOW
UART0_Printf("\n\n Read from 0x:%x \n",0x0000);
for(Addr = 0x00; Addr < 512; Addr ++)
{
UART0_Printf(" %d ",(int)RDStore[Addr]);
}
#endif
276 1 for(Addr = 0x00; Addr < 512; Addr ++) //检查是否有错误
277 1 {
278 2 if(RDStore[Addr] == WRStore[Addr])
279 2 {;}
280 2 else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -