• 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);
  • 相关阅读:
    Unity3D Asset文件导出3DMax 可编辑格式
    Android 内存管理
    常见面试之机器学习算法思想简单梳理
    最短的计算大数乘法的c程序
    MQTT---HiveMQ源代码具体解释(一)概览
    ZMQ源代码分析(一)-- 基础数据结构的实现
    JavaScript 性能分析新工具 OneProfile
    firefox关于about:config的常用配置
    postgres数据库中的数据转换
    postgres的强制类型转换与时间函数
  • 原文地址:https://www.cnblogs.com/yuesheng/p/2102085.html
Copyright © 2020-2023  润新知