📄 iic_rw.lst
字号:
C51 COMPILER V7.50 IIC_RW 09/29/2006 10:54:50 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE IIC_RW
OBJECT MODULE PLACED IN IIC_RW.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE IIC_RW.c BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 //*********************************************************************
2 // IIC_RW.c 1828 的通讯程序文件
3 // by hibernate 2005.9.29
4 // ShenZhen Challenge Technology Co.,Ltd
5 //remarks:本文件根据vxis原参考程序中func_shi文件改写
6 // 修改:IIC改了死循环
7 //*********************************************************************
8 #include <reg51.h>
9 #include <intrins.h>
10 #include <stdio.h>
11
12 #include "vxis1828.h"
13 #include "config.h"
14
15 //IIC_RW.c文件中的分开的读写函数定义
16 char read1828(char address);
17 void write1828(char address,char buf_data);
18
19 //函数定义
20 void delay_nop();
21 void stop_IIC();
22 void start_IIC();
23 void nack_IIC();
24 //void ack_IIC();
25 bit send_IIC(char bytedata);
26 char receive_IIC();
27
28 //读写口定义
29 sbit sda = SDA_PORT; //to 1828 serial data/address
30 sbit scl = SCL_PORT; //to 1828 serial clock
31
32 //****************************************
33 // 函数:char read1828(char address)
34 // 作用:从1828的寄存器中读取一个8位数据
35 // 参数:address => 8 bits , Reg address
36 // remarks: 程序的写法可以参考SPEC,
37 //***************************************
38 char read1828(char address)
39 {
40 1 char buffer;
41 1 unsigned char i = 0;
42 1 bit ack = 0; // 1 => Acknowledge,0 => No Acknowledge
43 1
44 1 char device = VX1828;
45 1
46 1 for(i = 0;i < 10 && !ack;i++) // 读成功可以返回,最多的重试次数为10次
47 1 {
48 2 stop_IIC();
49 2 delay_nop();
50 2 start_IIC(); // Master send command Stop =>Start
51 2
52 2 if ((ack = send_IIC(device++)) == 1) // Send the device number and Set the R/W bit
53 2 ack = send_IIC(address);
54 2
55 2 if(!ack)
C51 COMPILER V7.50 IIC_RW 09/29/2006 10:54:50 PAGE 2
56 2 continue; // 没有响应时进入下次重试
57 2
58 2 // Ready for receive data
59 2 buffer = 0x00;
60 2 stop_IIC();
61 2 delay_nop();
62 2 start_IIC(); // Master send command Stop =>Start
63 2
64 2 if((ack = send_IIC(device++)) == 1) // Send the device number and Set the R/W bit
65 2 {
66 3 buffer = receive_IIC(); // Save received data to buf_data
67 3 nack_IIC();
68 3 }
69 2 } //设备没有响应时重新尝试读数据
70 1
71 1 delay_nop();
72 1 stop_IIC();
73 1 delay_nop();
74 1
75 1 return buffer;
76 1 }
77
78 //****************************************
79 // 函数:void write1828(char address,unsigned char count,char *buf_data)
80 // 作用:向1828写count个数据
81 // 参数:address => 8 bits , Reg address
82 // remarks:程序的写法可以参考SPEC,
83 //***************************************
84 void write1828(char address,char buf_data)
85 {
86 1 //unsigned char i = 0;
87 1
88 1 //for(i = 0;i < ;i++) // 写成功可以返回,最多的重试次数为10次
89 1 //{
90 1 stop_IIC();
91 1 delay_nop();
92 1 start_IIC(); // Master send command Stop =>Start
93 1
94 1 send_IIC(VX1828); // Send the device number and Set the R/W bit
95 1 send_IIC(address); // Send the address of reg
96 1 send_IIC(buf_data); // Send the data pointed the buf_data index
97 1 //}
98 1 }
99
100 //********************************************
101 // 函数:void send_IIC(char data)
102 // 作用:IIC 向 1828 发送数据
103 // 参数:bytedata =>8位,要发送的数据
104 // remarks: 1、发送数据通过移位一位一位的发送,当位是1时sda写1,位是0时sda写0
105 // 2、发送成功返回1,否则返回0
106 //********************************************
107 bit send_IIC(char bytedata)
108 {
109 1 char i = 0;
110 1 bit ack; // 0 => Acknowledge,1 => No Acknowledge
111 1
112 1 scl = 0;
113 1 delay_nop();
114 1
115 1 for (i = 8;i > 0;i--)
116 1 {
117 2 //sda = 0; // sda low
C51 COMPILER V7.50 IIC_RW 09/29/2006 10:54:50 PAGE 3
118 2 if (bytedata & 0x80)
119 2 sda = 1; // sda high
120 2 else
121 2 sda = 0;
122 2 delay_nop();
123 2 bytedata <<= 1; // bytedata left shift
124 2
125 2 // Generate SCLK
126 2 scl = 1;
127 2 delay_nop(); // scl high
128 2 scl = 0;
129 2 delay_nop(); // scl low
130 2 }
131 1 delay_nop();
132 1
133 1 sda = 1;
134 1 delay_nop(); // sda high
135 1 scl = 1;
136 1 delay_nop(); // scl high
137 1 ack = sda;
138 1 delay_nop(); // Read ack 0:Acknowledge; 1:No Acknowledge
139 1 scl = 0;
140 1 delay_nop(); // scl low
141 1
142 1 return !ack;
143 1 }
144
145 //********************************************
146 //函数:char receive_IIC()
147 //作用:从IIC(1828||EEPROM)接收数据
148 //参数:
149 //remarks:
150 //********************************************
151 char receive_IIC()
152 {
153 1 unsigned char i = 0;
154 1 char receive = 0; // 8 bits buffer for receive
155 1
156 1 for (i = 0x08;i > 0;i--) // 8位
157 1 {
158 2 receive <<= 1;
159 2 scl = 1; // scl high
160 2 delay_nop();
161 2 if (sda)
162 2 receive |= 0x01;
163 2
164 2 scl = 0; // scl low
165 2 delay_nop();
166 2 }
167 1 return receive;
168 1 }
169
170 //********************************************
171 //函数:void ack_IIC()
172 //作用:IIC响应时的设置(Acknowledge Function)
173 //rekmarks:进行多个字节的读取时要使用本函数
174 //*********************************************
175 /*
176 void ack_IIC()
177 {
178 sda = 0;
179 delay_nop(); // sda low
C51 COMPILER V7.50 IIC_RW 09/29/2006 10:54:50 PAGE 4
180 scl = 1;
181 delay_nop(); // scl high
182 scl = 0;
183 delay_nop(); // scl low
184 sda = 1;
185 delay_nop(); // sda high
186 }
187 */
188 //********************************************
189 //函数:void nack_IIC()
190 //作用:IIC没有响应时的设置( Not Acknowledge Function)
191 //*********************************************
192 void nack_IIC()
193 {
194 1 // Acknowledge active
195 1 sda = 0;
196 1 delay_nop(); // sda low
197 1 scl = 1;
198 1 delay_nop(); // scl high
199 1 //Stop active
200 1 sda = 1;
201 1 delay_nop(); // sda high
202 1 scl = 0;
203 1 delay_nop(); // scl low
204 1 }
205
206
207 //********************************************
208 //函数:void start_IIC()
209 //作用:命令IIC开始时的设置(Start Function)
210 //*********************************************
211 void start_IIC()
212 {
213 1 sda = 1; // sda high
214 1 delay_nop();
215 1 scl = 1; // scl high
216 1 delay_nop();
217 1 sda = 0; // sda low
218 1 delay_nop();
219 1 scl = 0; // scl low
220 1 delay_nop();
221 1 }
222
223 //********************************************
224 //函数:void start_IIC()
225 //作用:命令IIC开始时的设置(Start Function)
226 //*********************************************
227 void stop_IIC()
228 {
229 1 scl = 0;
230 1 delay_nop(); // scl low
231 1 sda = 0;
232 1 delay_nop(); // sda low
233 1 scl = 1;
234 1 delay_nop(); // scl high
235 1 sda = 1;
236 1 delay_nop(); // sda high
237 1 }
238
239 //********************************************
240 // 函数:void delay_nop()
241 // 作用:延时
C51 COMPILER V7.50 IIC_RW 09/29/2006 10:54:50 PAGE 5
242 // remarks:
243 // Machine cycle = 24x2 + 12x3 = 84
244 // Crystal Frequency = 20 MHz
245 // Delay Time: 4.2us
246 //********************************************
247 void delay_nop()
248 {
249 1 //_nop_ ();
250 1 //_nop_ ();
251 1 //_nop_ ();
252 1 }
253
254
255
C51 COMPILER V7.50 IIC_RW 09/29/2006 10:54:50 PAGE 6
ASSEMBLY LISTING OF GENERATED OBJECT CODE
; FUNCTION _read1828 (BEGIN)
; SOURCE LINE # 38
0000 8F00 R MOV address,R7
; SOURCE LINE # 39
; SOURCE LINE # 41
0002 E4 CLR A
0003 F500 R MOV i,A
; SOURCE LINE # 42
0005 C200 R CLR ack
; SOURCE LINE # 44
0007 7500DE R MOV device,#0DEH
; SOURCE LINE # 46
000A F500 R MOV i,A
000C ?C0001:
000C 200046 R JB ack,?C0002
; SOURCE LINE # 47
; SOURCE LINE # 48
000F 120000 R LCALL stop_IIC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -