1534|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

AT24C02的MSP430驱动 [复制链接]

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

IIC.c文件


复制代码
  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 = read1byte();
242         if(i < (n-1))    mack();
243         else            mnack();
244     }
245      
246     stop();
247 }
 

IIC.h文件


复制代码
 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文件


复制代码
  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文件



 

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);

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表