AT24C02的MSP430驱动

     IIC.c文件定义了AT24C02同MCU接口,并构造IIC协议底层函数,包括主机开始、停止、应答、非应答、读取、写入函数,主机读取从机应答信号。
     EEPROM.c文件针对AT24C02的操作特点,调用IIC.c文件底层函数构造读写AT24C02函数。

IIC.c文件

View Code
1 #include <msp430x14x.h>
2 typedef unsigned char uchar;
3 typedef unsigned int uint;
4
5  #define SCL_H P1OUT |= BIT2
6  #define SCL_L P1OUT &= ~BIT2
7 #define SDA_H P1OUT |= BIT3
8 #define SDA_L P1OUT &= ~BIT3
9
10 #define SDA_in P1DIR &= ~BIT3 //SDA改成输入模式
11 #define SDA_out P1DIR |= BIT3 //SDA变回输出模式
12 #define SDA_val P1IN&BIT3 //SDA的位值
13
14 #define TRUE 1
15 #define FALSE 0
16
17 /*******************************************
18 函数名称:delay
19 功 能:延时约15us的时间
20 参 数:无
21 返回值 :无
22 ********************************************/
23 void delay(void)
24 {
25 uchar i;
26
27 for(i = 0;i < 15;i++)
28 _NOP();
29 }
30 /*******************************************
31 函数名称:start
32 功 能:完成IIC的起始条件操作
33 参 数:无
34 返回值 :无
35 ********************************************/
36 void start(void)
37 {
38 SCL_H;
39 SDA_H;
40 delay();
41 SDA_L;
42 delay();
43 SCL_L;
44 delay();
45 }
46 /*******************************************
47 函数名称:stop
48 功 能:完成IIC的终止条件操作
49 参 数:无
50 返回值 :无
51 ********************************************/
52 void stop(void)
53 {
54 SDA_L;
55 delay();
56 SCL_H;
57 delay();
58 SDA_H;
59 delay();
60 }
61 /*******************************************
62 函数名称:mack
63 功 能:完成IIC的主机应答操作
64 参 数:无
65 返回值 :无
66 ********************************************/
67 void mack(void)
68 {
69 SDA_L;
70 _NOP(); _NOP();
71 SCL_H;
72 delay();
73 SCL_L;
74 _NOP();_NOP();
75 SDA_H;
76 delay();
77 }
78 /*******************************************
79 函数名称:mnack
80 功 能:完成IIC的主机无应答操作
81 参 数:无
82 返回值 :无
83 ********************************************/
84 void mnack(void)
85 {
86 SDA_H;
87 _NOP(); _NOP();
88 SCL_H;
89 delay();
90 SCL_L;
91 _NOP(); _NOP();
92 SDA_L;
93 delay();
94 }
95
96 /**********检查应答信号函数******************/
97 /*如果返回值为1则证明有应答信号,反之没有*/
98 /*******************************************
99 函数名称:check
100 功 能:检查从机的应答操作
101 参 数:无
102 返回值 :从机是否有应答:1--有,0--无
103 ********************************************/
104 uchar check(void)
105 {
106 uchar slaveack;
107
108 SDA_H;
109 _NOP(); _NOP();
110 SCL_H;
111 _NOP(); _NOP();
112 SDA_in;
113 _NOP(); _NOP();
114 slaveack = SDA_val; //读入SDA数值
115 SCL_L;
116 delay();
117 SDA_out;
118 if(slaveack) return FALSE;
119 else return TRUE;
120 }
121 /*******************************************
122 函数名称:write1
123 功 能:向IIC总线发送一个1
124 参 数:无
125 返回值 :无
126 ********************************************/
127 void write1(void)
128 {
129 SDA_H;
130 delay();
131 SCL_H;
132 delay();
133 SCL_L;
134 delay();
135 }
136 /*******************************************
137 函数名称:write0
138 功 能:向IIC总线发送一个0
139 参 数:无
140 返回值 :无
141 ********************************************/
142 void write0(void)
143 {
144 SDA_L;
145 delay();
146 SCL_H;
147 delay();
148 SCL_L;
149 delay();
150 }
151 /*******************************************
152 函数名称:write1byte
153 功 能:向IIC总线发送一个字节的数据
154 参 数:wdata--发送的数据
155 返回值 :无
156 ********************************************/
157 void write1byte(uchar wdata)
158 {
159 uchar i;
160
161 for(i = 8;i > 0;i--)
162 {
163 if(wdata & 0x80) write1();
164 else write0();
165 wdata <<= 1;
166 }
167
168 SDA_H;
169 _NOP();
170 }
171 /*******************************************
172 函数名称:writeNbyte
173 功 能:向IIC总线发送N个字节的数据
174 参 数:outbuffer--指向发送数据存放首地址
175 的指针
176 n--数据的个数
177 返回值 :发送是否成功的标志:1--成功,0--失败
178 ********************************************/
179 uchar writeNbyte(uchar * outbuffer,uchar n)
180 {
181 uchar i;
182
183 for(i = 0;i < n;i++)
184 {
185 write1byte(* outbuffer);
186 if(check())
187 {
188 outbuffer++;
189 }
190 else
191 {
192 stop();
193 return FALSE;
194 }
195 }
196
197 stop();
198 return TRUE;
199 }
200 /*******************************************
201 函数名称:read1byte
202 功 能:从IIC总线读取一个字节
203 参 数:无
204 返回值 :读取的数据
205 ********************************************/
206 uchar read1byte(void)
207 {
208 uchar rdata = 0x00,i;
209 uchar flag;
210
211 for(i = 0;i < 8;i++)
212 {
213 SDA_H;
214 delay();
215 SCL_H;
216 SDA_in;
217 delay();
218 flag = SDA_val;
219 rdata <<= 1;
220 if(flag) rdata |= 0x01;
221 SDA_out;
222 SCL_L;
223 delay();
224 }
225
226 return rdata;
227 }
228 /*******************************************
229 函数名称:readNbyte
230 功 能:从IIC总线读取N个字节的数据
231 参 数:inbuffer--读取后数据存放的首地址
232 n--数据的个数
233 返回值 :无
234 ********************************************/
235 void readNbyte(uchar * inbuffer,uchar n)
236 {
237 uchar i;
238
239 for(i = 0;i < n;i++)
240 {
241 inbuffer[i] = read1byte();
242 if(i < (n-1)) mack();
243 else mnack();
244 }
245
246 stop();
247 }

 IIC.h文件

View Code
1 void delay(void);
2 void start(void);
3 void stop(void);
4 void mack(void);
5 void mnack(void);
6 unsigned char check(void);
7 void write1(void);
8 void write0(void);
9 void write1byte(unsigned char wdata);
10 unsigned char writeNbyte(unsigned char * outbuffer,unsigned char n);
11 unsigned char read1byte(void);
12 void readNbyte(unsigned char * inbuffer,unsigned char n);

EEPROM.c文件

View Code
1 #include "IIC.h"
2 typedef unsigned char uchar;
3 typedef unsigned int uint;
4
5 #define deviceaddress 0xa0 //AT24C02的设备地址
6
7 /*******************************************
8 函数名称:delay_10ms
9 功 能:延时约6ms,等待EEPROM完成内部写入
10 参 数:无
11 返回值 :无
12 ********************************************/
13 void delay_10ms(void)
14 {
15 uint i = 1000;
16 while(i--);
17 }
18 /*******************************************
19 函数名称:Write_1Byte
20 功 能:向EEPROM中写入1个字节的数据
21 参 数:Wdata--写入的数据
22 dataaddress--数据的写入地址
23 返回值 :写入结果:1--成功,0--失败
24 ********************************************/
25 uchar Write_1Byte(uchar wdata,uchar dataaddress)
26 {
27 start();
28 write1byte(deviceaddress);
29 if(check())
30 write1byte(dataaddress);
31 else
32 return 0;
33 if(check())
34 write1byte(wdata);
35 else
36 return 0;
37 if(check()) stop();
38 else return 0;
39
40 delay_10ms(); //等待EEPROM完成内部写入
41 return 1;
42 }
43 /*******************************************
44 函数名称:Write_NByte
45 功 能:向EEPROM中写入N个字节的数据
46 参 数:outbuf--指向写入数据存放首地址的指针
47 n--数据个数,最大不能超过8,由页地址
48 决定其最大长度
49 dataaddress--数据写入的首地址
50 返回值 :写入结果:1--成功,0--失败
51 ********************************************/
52 uchar Write_NByte(uchar * outbuf,uchar n,uchar dataaddress)
53 {
54 uchar flag;
55
56 start();
57 write1byte(deviceaddress); //写入器件地址
58 if(check() == 1)
59 write1byte(dataaddress); //写入数据字地址
60 else
61 return 0;
62 if(check())
63 flag=writeNbyte(outbuf,n);
64 else
65 return 0;
66 delay_10ms(); //等待EEPROM完成内部写入
67 if(flag) return 1;
68 else return 0;
69
70 }
71 /*******************************************
72 函数名称:Read_1Byte_currentaddress
73 功 能:从EEPROM的当前地址读取1个字节的数据
74 参 数:无
75 返回值 :读取的数据
76 ********************************************/
77 uchar Read_1Byte_currentaddress(void)
78 {
79 uchar temp;
80
81 start();
82 write1byte((deviceaddress|0x01));
83 if(check())
84 temp = read1byte();
85 else
86 return 0;
87 mnack();
88 stop();
89 return temp;
90 }
91 /*******************************************
92 函数名称:Read_NByte_currentaddress
93 功 能:从EEPROM的当前地址读取N个字节的数据
94 参 数:readbuf--指向保存数据地址的指针
95 n--读取数据的个数
96 返回值 :读取结果:1--成功,0--失败
97 ********************************************/
98 uchar Read_NByte_currentaddress(uchar * readbuf,uchar n)
99 {
100 start();
101 write1byte((deviceaddress|0x01));
102 if(check())
103 readNbyte(readbuf,n);
104 else
105 return 0;
106
107 return 1;
108 }
109
110 /*******************************************
111 函数名称:Read_1Byte_Randomaddress
112 功 能:从EEPROM的指定地址读取1个字节的数据
113 参 数:dataaddress--数据读取的地址
114 返回值 :读取的数据
115 ********************************************/
116 uchar Read_1Byte_Randomaddress(uchar dataaddress)
117 {
118 uchar temp;
119
120 start();
121 write1byte(deviceaddress);
122 if(check())
123 write1byte(dataaddress);
124 else
125 return 0;
126 if(check())
127 {
128 start();
129 write1byte((deviceaddress|0x01));
130 }
131 else
132 return 0;
133 if(check())
134 temp = read1byte();
135 else
136 return 0;
137
138 mnack();
139 stop();
140 return temp;
141 }
142 /*******************************************
143 函数名称:Read_NByte_Randomaddress
144 功 能:从EEPROM的指定地址读取N个字节的数据
145 参 数:readbuf--指向保存数据地址的指针
146 n--读取数据的个数
147 dataaddress--数据读取的首地址
148 返回值 :读取结果:1--成功,0--失败
149 ********************************************/
150 uchar Read_NByte_Randomaddress(uchar * readbuf,uchar n,uchar dataaddress)
151 {
152 start();
153 write1byte(deviceaddress);
154 if(check())
155 write1byte(dataaddress);
156 else
157 return 0;
158 if(check())
159 {
160 start();
161 write1byte(deviceaddress|0x01);
162 }
163 else
164 return 0;
165 if(check())
166 readNbyte(readbuf,n);
167 else
168 return 0;
169
170 return 1;
171 }

EERPOM.h文件

View Code
1 unsigned char Write_1Byte(unsigned char wdata,unsigned char dataaddress);
2 unsigned char Write_NByte(unsigned char * outbuf,unsigned char n,unsigned char dataaddress);
3 unsigned char Read_1Byte_currentaddress(void);
4 unsigned char Read_NByte_currentaddress(unsigned char * readbuf,unsigned char n);
5 unsigned char Read_1Byte_Randomaddress(unsigned char dataaddress);
6 unsigned char Read_NByte_Randomaddress(unsigned char * readbuf,unsigned char n,unsigned char dataaddress);
原文地址:https://www.cnblogs.com/yuesheng/p/2102085.html