AT24C02的MSP430驱动

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

IIC.c文件

ContractedBlock.gif ExpandedBlockStart.gif 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文件

ContractedBlock.gif ExpandedBlockStart.gif 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文件

ContractedBlock.gif ExpandedBlockStart.gif 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文件

ContractedBlock.gif ExpandedBlockStart.gif 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/archive/2011/07/10/2102085.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值