板子上设置了EEPROM存储器,型号为AT24C02。
板子的硬件连接为:SCL--->P2.4,SDA--->P2.5。
直接了当,贴上程序!

========================24cxx.h文件=========================

#ifndef _24CXX_H_
#define _24CXX_H_

#include <msp430x14x.h>

#define WRITE_ADDR  0xA0  //A0 A1 A2均接地
#define READ_ADDR   0xA1  //A0 A1 A2均接地

#define SDA_BIT   BIT5
#define SCL_BIT   BIT4
#define IIC_PORT_DIR P2DIR
#define IIC_PORT_DATA P2OUT
#define SDA_BIT_DATA  (P2IN & BIT5)

#define SDA_OUT  (IIC_PORT_DIR |= SDA_BIT)
#define SDA_IN    (IIC_PORT_DIR &= ~SDA_BIT)
#define SDA_1     (IIC_PORT_DATA |= SDA_BIT)
#define SDA_0     (IIC_PORT_DATA &= ~SDA_BIT)

#define SCL_IN    (IIC_PORT_DIR &= ~SCL_BIT)
#define SCL_OUT  (IIC_PORT_DIR |= SCL_BIT)
#define SCL_1     (IIC_PORT_DATA |= SCL_BIT)
#define SCL_0     (IIC_PORT_DATA &= ~SCL_BIT)

void init_iic(void);
void iic_start(void);
void iic_stop(void);
void iic_ack(void);
void iic_no_ack(void);
unsigned char iic_test_ack(void);
void iic_write(unsigned char data);
unsigned char iic_read(void);

unsigned char iic_write_data(unsigned char StartAddress,unsigned char *date,unsigned char bytes);
unsigned char iic_read_data(unsigned char StartAddress,unsigned char *date,unsigned char bytes);

#endif
========================24cxx.c文件=========================

#include "24cxx.h"
#include "main.h"    //实际上需要包含延时#define CPU_F ((double)8000000)
                    //#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
                    //#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

/*
*IIC端口初始化
*/
void init_iic(void)
{
    SCL_OUT;    //SCL管脚为输出
    SDA_IN;        //SDA管脚为输入
    SCL_0;
    iic_stop();
}

/*
*IIC起始状态
*/
void iic_start(void)
{
    SDA_OUT;
    SDA_1;
    delay_us();
    SCL_1;
    delay_us();
    SDA_0;
    delay_us();
    SCL_0;
    delay_us();
}

/*
*IIC停止状态
*/
void iic_stop(void)
{
    SDA_OUT;
    SCL_0;
    delay_us();
    SDA_0;
    delay_us();
    SCL_1;
    delay_us();
    SDA_1;
    delay_us();
}

/*
*IIC应答
*/
void iic_ack(void)
{
    SDA_OUT;
    SDA_0;
    delay_us();
    SCL_1;
    delay_us();
    SCL_0;
    delay_us();
    SDA_1;
}

/*
*IIC无应答
*/
void iic_no_ack(void)
{
    SDA_OUT;
    SDA_1;
    delay_us();
    SCL_1;
    delay_us();
    SCL_0;
    delay_us();
}

/*
*IIC检测回应
*/
unsigned char iic_test_ack(void )
{
    unsigned char tmp;
    SDA_IN;                //设为输入
    delay_us();
    SCL_1;
    delay_us();
    tmp = SDA_BIT_DATA>>;
    delay_us();
    SCL_0;
    delay_us();
    return(tmp);
}

/*
*IIC写字节
*/
void iic_write(unsigned char data)
{
    SDA_OUT;
    unsigned char i,temp;
    ; i<; i++)
    {
        SDA_OUT;
        temp = data&0x80;
        if(temp == 0x80)
            SDA_1;            //判断发送位,送数据到数据线上
        else
            SDA_0;
        delay_us();
        SCL_1;                //置时钟信号为高电平,使数据有效
        delay_us();
        SCL_0;
        delay_us();
        data=data<<;
    }
    SDA_IN;
    delay_us();
}

/*
*IIC读字节
*/
unsigned char iic_read(void)
{
    unsigned char i,tmp;
    unsigned ;
    SDA_IN;                    //置数为输入
    ; i<; i++)
    {
        SCL_1;
        delay_us();
        ;
        SDA_IN;
        tmp = SDA_BIT_DATA;
        if(tmp == SDA_BIT)
            byte = (byte|0x01);
        delay_us();
        SCL_0;
        delay_us();
    }
    return(byte);
}

/*
*IIC写数据
*输入:start_addr起始地址
*  n_bytes写入字节数
*  dest_date写入的数据源
*输出:无
*/
unsigned char iic_write_data(unsigned char start_addr, unsigned char *dest_date, unsigned char n_bytes)
{
    unsigned ;
    iic_start();                //启动IIC
    iic_write(WRITE_ADDR);        //写24C02地址以
    )        //检测应答
     ;
    iic_write(start_addr);        //写对24C02操作的地址
    )
     ;
    ; i<n_bytes; i++)
    {
        iic_write(*dest_date);    //向24C02中写数据
        )
        ;
        dest_date++;
        start_addr++;
    }
    iic_stop();
    ;
}

/*
*IIC读数据
*输入:start_addr起始地址
*  n_bytes读出字节数
*输出:dest_date读出并保存的数据目的
*/
unsigned char iic_read_data(unsigned char start_addr, unsigned char *dest_date, unsigned char n_bytes)
{
    unsigned char i;
    iic_start();
    iic_write(WRITE_ADDR);
    )
        ;
    iic_write(start_addr);
    )
        ;
    iic_start();
    iic_write(READ_ADDR);
    )
        ;
    ; i<n_bytes; i++)
    {
        *dest_date = iic_read();
        iic_ack();
        dest_date++;
    }
    *dest_date = iic_read();
    iic_no_ack();
    iic_stop();
    ;
}

测试结果采用串口输出方式,main包含下面的步骤。

unsigned ] = {],ret = ;

init_iic();
printf("24c02 iic init ok\r\n");
printf(],iic_buf[],iic_buf[],iic_buf[]);
ret = iic_write_data(,iic_buf,);
printf( ? "err" : "ok");
ret = iic_read_data(,iic_rdbuf,);
printf( ? "err" : "ok");
printf(],iic_rdbuf[],iic_rdbuf[],iic_rdbuf[]);

实际测试显示:

/*
页写函数,写入起始地址,数据,字节数
*/
unsigned char EepromPageWrite(EEPROM_ADDR_TYPE address, unsigned char *pdata, unsigned char num)
{
    unsigned ;    //计算起始页
    unsigned ;        //计算结束页-1
    unsigned ;        //页写总循环数

    unsigned char pagebyte;            //页剩余字节数寄存器

    unsigned ;

    pagestart = EEPROM_PAGE_CAL(address);    //at24c01,02
    pageend = EEPROM_PAGE_CAL(address+num-);

    //页写
    ; pageloop <= (pageend-pagestart); pageloop++)
    {
        //计算本次写入的字节数
        pagebyte = (address|(EEPROM_PAGE_SIZE-)) - address + ;
        if (num <= pagebyte)
            pagebyte = num;

        num -= pagebyte; //剩余字节数

        I2cSendStart();
         == I2cSendByte(EEPROM_WRITE))
            );

    ...
}

MSP430F149模拟IIC读写24C02程序的更多相关文章

  1. 移植并修改成功的模拟iic读写EEPROM at24c02

    2010-04-24 12:58:00 注:如果要读24c128或264,地址位为16位的.现在的地址位为8位. protues仿真图 源程序如下: #include <iom16v.h> ...

  2. 【STM32】IIC的基本原理(实例:普通IO口模拟IIC时序读取24C02)(转载)

     版权声明:本文为博主原创文章,允许转载,但希望标注转载来源. https://blog.csdn.net/qq_38410730/article/details/80312357 IIC的基本介绍 ...

  3. STM32F10X -- 模拟IIC程序

    听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...

  4. STM32F10x_模拟I2C读写EEPROM

    Ⅰ.写在前面 说到IIC,大家都应该不会陌生,我们初学单片机的时候或多或少都知道或了解过,甚至使用I2C控制过器件.但是,有多少人真正去深入理解,或者深入研究过I2C通信协议呢? 1.我们有必要学习I ...

  5. stm32软件模拟IIC读取PX4FLOW光流传感器数据

    这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模 ...

  6. STM32F10x_SPI(硬件接口 + 软件模拟)读写Flash(25Q16)

    推荐 分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来! http://www.captainbed.net/strongerhuang Ⅰ.写在前 ...

  7. 模拟IIC总线多设备挂载(12864OLED屏幕+GY30光照传感器)

    最终效果展示 OLED屏幕和GY30光照传感器(BH1750FVI)都连接在一个IIC(I2C)总线上,所以只需要接4根线即可.获取到的光照强度可以在OLED上实时显示并通过串口打印.IIC是IO模拟 ...

  8. C51—模拟IIC总线实现EEPROM存取数据

    a - 什么是IIC总线 -什么是EEPROM -IIC总线的通信格式 模块化设计注解 整体代码 - 什么是IIC总线 IIC总线是同步通信的一种特殊形式,具有接线口少.控制简单.器件封装形式小.通信 ...

  9. GPIO模拟IIC接口信号质量分析

    信号质量有问题的波形001: 信号质量有问题的波形002: 从上图可以看出,GPIO口模拟的I2C接口,电平都存在半高的情况. 因为I2C的接口是通过GPIO模拟实现的,该时钟信号线SCL内部默认为下 ...

随机推荐

  1. 有空可以对C#尝一下鲜,WCF看上去很诱人(跨进程、跨机器、跨子网,跨企业网乃至跨Internet的分布式服务)

    说道底不还是要借助NGNIX实现,PHP自身呢?C#的WCF可以脱离IIS就可以实现跨进程.跨机器.跨子网,跨企业网乃至跨Internet的分布式服务,宿主可以是IIS,WinForm,WPF, Wi ...

  2. eclipsecdt添加自动补全功能

    自动代码补全完全是一个改善生活质量的功能呀!cdt拥有自动代码补全功能,只是我们没有打开而已 1. 绑定快捷方式 1. windows -> preferences ->general-& ...

  3. Jquery 概念性内容编辑器

      概念性jQuery内容编辑器,这是一款非常有特色的jQuery编辑器,该编辑器支持文字.列表.视频.引用等功能,是一款小巧简洁,富有个性化的jQuery内容编辑器插件. 代码: <!doct ...

  4. ECharts JavaScript图表库 ECharts

    ECharts开源来自百度商业前端数据可视化团队,基于html5 Canvas,是一个纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据可视化图表.创新的拖拽重计算.数据视图.值 ...

  5. Compiled Language vs Scripting Language

    Referrence: Blog Compiled Languages Example: C, C++, Java Source code needs to be compiled into bits ...

  6. HDU1841——KMP算法

    这个题..需要对KMP的模板理解的比较透彻,以前我也只是会套模板..后来才知道..之会套模板是不行的..如果不能把握模板的每一个细节`,至少能搞清楚模板的每一个模块大体是什么意思.. 题意是给出两个串 ...

  7. DBA 经典面试题(5)

    国外公司的Oracle DBA试题 Oracle DBA Interview Questions 1. How many memory layers are in the shared pool? 2 ...

  8. hdu 5256 序列变换(LIS最长上升子序列)

    Problem Description 我们有一个数列A1,A2...An,你现在要求修改数量最少的元素,使得这个数列严格递增.其中无论是修改前还是修改后,每个元素都必须是整数. 请输出最少需要修改多 ...

  9. jquery倒计时(仿团购)转至 http://justcoding.iteye.com/blog/2210962

    倒计时一般是用来表示未来某一时刻距现在时刻还剩多少时间.倒计时在WEB上应用非常广泛,如考试系统倒计时,团购网站中的优惠活动倒计时等等.今天,我们来使用jQuery实现一个简单的倒计时功能.

  10. Oracle 方法

    1.递归 select zxdept from (select d.id, d.zxdept, d.RANK, d.fatherId from web_dept d start with d.id = ...