2010-04-24 12:58:00

注:如果要读24c128或264,地址位为16位的。现在的地址位为8位。

protues仿真图

源程序如下:

#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#define I2C_DDR     DDRB
#define I2C_PORT    PORTB
#define I2C_PIN     PINB
#define SDA         PB1
#define SCL         PB0

#define SDA_OUT()  
(I2C_DDR |= (1<<SDA))
#define SCL_OUT()   (I2C_DDR |= (1<<SCL))
// 释放SDA,上拉输入
#define SDA_RLS()   do{ I2C_PORT |= (1<<SDA); I2C_DDR &=
~(1<<SDA); }while(0)  
#define SCL_RLS()   do{ I2C_PORT |= (1<<SCL); I2C_DDR &=
~(1<<SCL); }while(0)
#define SDA_SET()   (I2C_PORT |= (1<<SDA))
#define SDA_CLR()   (I2C_PORT &= ~(1<<SDA))
#define SCL_SET()   (I2C_PORT |= (1<<SCL))
#define SCL_CLR()   (I2C_PORT &= ~(1<<SCL))
#define READ_SDA()  ((I2C_PIN & (1<<SDA)) ? 1 : 0)

#define
i2c_delay() delay_us(1)       // 根据系统时钟进行调整
#define AT24C02_WRITE_ADDR  0xA0
#define AT24C02_READ_ADDR   0xA1
#define PAGE_SIZE   8
#define PAGE_MASK   (PAGE_SIZE-1)
// 发送起始信号
void i2c_start(void)
{
        SDA_SET();
  i2c_delay();
        SCL_SET();
        i2c_delay();
        SDA_CLR();
        i2c_delay();
        SCL_CLR();
  //i2c_delay();
}

// 发送停止信号
void i2c_stop(void)
{
    SDA_CLR();
    i2c_delay();
    SCL_SET();
    i2c_delay();
    SDA_SET();
   // i2c_delay();
}

// 向总线写1字节,并返回从机有无应答
unsigned char i2c_write(unsigned char byte)
{
    unsigned char i, ack;
    ack = 0;
    for( i = 0; i < 8; ++i ){
        if ( byte & 0x80)
            SDA_SET();
        else
               
SDA_CLR();
        byte <<= 1;
        SCL_SET();
        i2c_delay();
        SCL_CLR();
    }

SDA_RLS();
    i2c_delay();
    SCL_SET();
    i2c_delay();
    ack = READ_SDA();
    SCL_CLR();
    i2c_delay();
 SDA_OUT();
    return ack;
}

// 读1字节,ack=1时,发送ACK,ack=0,发送nACK
unsigned char i2c_read(unsigned char ack)
{
    unsigned char i, r = 0;

SDA_RLS();
    for( i = 0; i < 8; i++ ){
        SCL_SET();
        i2c_delay();
        r <<= 1;
        if ( READ_SDA() == 1)
        {
            r |= 1;
        }
        SCL_CLR();
        i2c_delay();
    }
   
    SDA_OUT();
    // Send ACK
    if (!ack)
       
SDA_SET();      // Send nACK
    else
       
SDA_CLR();      // Send ACK
    i2c_delay();
    SCL_SET();
    i2c_delay();
    SCL_CLR();
    i2c_delay();
    return r;
}

void at24c02_write1byte(unsigned
int byte_addr, unsigned char byte)
{
    i2c_start();
    i2c_write(AT24C02_WRITE_ADDR);
 //i2c_write(byte_addr>>8);      //输入15-9高位
    i2c_write(byte_addr);
    i2c_write(byte);
    i2c_stop();
    delay_ms(20);      // 等待10ms,保证24C02内部写操作完成
}

void at24c02_page_write(unsigned
char byte_addr, unsigned char *buff, unsigned char num)
{
    unsigned char i;
    i2c_start();
    i2c_write(AT24C02_WRITE_ADDR);
    i2c_write(byte_addr);
    for( i = 1; i <= num; ++i )
    {
        i2c_write(*buff);
        buff++;
    }
    i2c_stop();
    delay_ms(20);
}

void at24c02_writenbytes(unsigned
char byte_addr, unsigned char *buff, unsigned char num)
{
    unsigned char n_tmp;
    n_tmp = PAGE_SIZE - (unsigned char)(byte_addr &
PAGE_MASK); // 本页内剩余空间数量
    if ((num > n_tmp) && (n_tmp != 0))
    {
        // 先将本页剩余空间写满
        at24c02_page_write(byte_addr, buff,
n_tmp);
        byte_addr += n_tmp;
        num -= n_tmp;
        buff += n_tmp;
    }
    while( num >= PAGE_SIZE ){
        at24c02_page_write(byte_addr, buff,
PAGE_SIZE);
        byte_addr += PAGE_SIZE;
        num -= PAGE_SIZE;
        buff += PAGE_SIZE;
    }
    if (num != 0)
    {
        at24c02_page_write(byte_addr, buff,
num);
    }
}

unsigned char
at24c02_read_curr_addr(void)
{
    unsigned char data;
    i2c_start();
    i2c_write(AT24C02_READ_ADDR);
    data = i2c_read(0);     // 读1字节,返回nACK
    i2c_stop();
    return data;
}

unsigned char
at24c02_read1byte(unsigned char byte_addr)
{
    unsigned char data;
    i2c_start();
    i2c_write(AT24C02_WRITE_ADDR);
 //i2c_write(byte_addr>>8);       //输入15-9高位
    i2c_write(byte_addr);
    i2c_start();
    i2c_write(AT24C02_READ_ADDR);
    data = i2c_read(0);     // 读1字节,返回nACK
    i2c_stop();
    return data;

}

void at24c02_readnbytes(unsigned
char byte_addr, unsigned char *buff, unsigned char num)
{
    unsigned char i;
    i2c_start();
    i2c_write(AT24C02_WRITE_ADDR);
    i2c_write(byte_addr);
    i2c_start();
    i2c_write(AT24C02_READ_ADDR);
    for( i = 1; i <= num-1; ++i )
    {
        *buff =
i2c_read(1);        // 读1字节返回ack
        buff++;
    }
    *buff = i2c_read(0);
    i2c_stop();
}

void port_init(void)
{
 PORTA=0xff;
 DDRA=0xff;
 SDA_OUT();
 SCL_OUT();
}

void main(void)
{
    unsigned char temp1[8]={1,2,3,4,5,6,7,8};
    unsigned char temp2[8]={0};
 port_init();
    at24c02_writenbytes(0x03,temp1,8);// write the byte 01h at
address 03h
    at24c02_readnbytes(0x03,temp2,8);  // read the
byte 01h at address 03h
     //SDA_RLS() ;
  //SCL_RLS() ;
    while (1)
    {     
  if(temp2[0]==1)
     {
      PORTA=0XFE;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }

if(temp2[1]==2)
     {
      PORTA=0XFD;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }
    
      if(temp2[2]==3)
     {
      PORTA=0XFB;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }
    
      if(temp2[3]==4)
     {
      PORTA=0XF7;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }
    
      if(temp2[4]==5)
     {
      PORTA=0XEF;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }
    
      if(temp2[5]==6)
     {
      PORTA=0XDF;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }
    
       if(temp2[6]==7)
     {
      PORTA=0XBF;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }
    
      if(temp2[7]==8)
     {
      PORTA=0X7F;
      delay_ms(100);
      PORTA=0XFF;
   delay_ms(50);
     }
  }
}

移植并修改成功的模拟iic读写EEPROM at24c02的更多相关文章

  1. STM32F10x_模拟I2C读写EEPROM

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

  2. MSP430F149模拟IIC读写24C02程序

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

  3. 软件模拟IIC实现EEPROM

    ....妈的太难.    反正就是控制引脚的高低电平 实现数据的读取....参考 I2C的协议层和物理层的那个几个图,个个信号产生的电平 自己看源码去把. 头疼

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

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

  5. STM32F10x_模拟I2C读写_硬件I2C读写

    STM32F10x_模拟I2C读写EEPROM STM32F10x_硬件I2C读写EEPROM(标准外设库版本) STM32F10x_硬件I2C主从通信(轮询发送,中断接收)

  6. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是“STM32F10x_模拟I2C读写EEPROM”,讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要内容:I2C协议.模 ...

  7. IIC协议建模——读写EEPROM

    案例采用明德扬设计思想完成.IIC协议是非常常用的接口协议,在电子类岗位招聘要求中经常出现它的身影.关于IIC协议这里只做简要介绍,详细信息请自行百度或查阅相关Datasheet,网上资料非常多.该篇 ...

  8. 第十六章 IIC协议详解+UART串口读写EEPROM

    十六.IIC协议详解+Uart串口读写EEPROM 本文由杭电网友曾凯峰根据小梅哥FPGA IIC协议基本概念公开课内容整理并最终编写Verilog代码实现使用串口读写EEPROM的功能. 以下为原文 ...

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

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

随机推荐

  1. (1.8)mysql中的trace

    (1.8)mysql中的trace 以json格式存储

  2. 帝国cms系统限制的登录次数不得超过5次请等60分钟过后方可重新登录

    朋友的网站是帝国cms建的,他好久没登录有点忘记密码了,后面再登录就提示系统限制的登录次数不得超过5次请等60分钟过后方可重新登录,这个如何解决呢?其实只要修改一下配置文件就可以了:修改e/class ...

  3. linux搭建PHP开发环境

    因为PHP是一门易于上手的开发语言,所以现在越来越多的初创公司选择PHP作为前期项目的主要开发语言. 工欲善其事,必先利其器! 现在我们就从最基本的环境搭建开始,PHP环境的搭建是非常简单的: 环境: ...

  4. 010-ThreadGroup线程组

    线程组ThreadGroup表示一组线程的集合,一旦一个线程归属到一个线程组之中后,就不能再更换其所在的线程组.那么为什么要使用线程组呢?个人认为有以下的好处:方便统一管理,线程组可以进行复制,快速定 ...

  5. 014-通过JDB调试,通过HSDB来查看HotSpot VM的运行时数据

    一.JDB调试        在预发环境下进行debug时,时常因为工具和环境的限制,导致debug体验非常差,那么有什么方法能够简化我们进行debug的体验吗?JDB就是一种.        JDB ...

  6. Vue-selller 饿了吗 - 准备工作

    安装脚手架vue-cli npm install -g vue-cli 建立项目 vue init webpack sell(sell是项目名称) 进入项目目录 cd sell 可以看目录结构: ls ...

  7. koa : Express出品的下一代基于Node.js的web框架

    https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434501579966a ...

  8. ipfs私链服务

    cd /lib/systemd/system vi ipfs.service [Unit]Description=IPFS[Service]ExecStart=/usr/bin/ipfs daemon ...

  9. 基于Extjs+SpringMVC+MyBatis+Oracle的B/S信息系统简化开发思路

    要在上层简化就得有下层强大的架构作为支撑,通过采用企业级的各种框架,虽然学习成本高一些,但用好了效率也自然高. 数据层简化: 首先所有表都有名称为ID的主键字段.有与表同名的序列作为自增key. 数据 ...

  10. js图的数据结构处理---弗洛伊德算法

    function Graph() { this.graph = [ [0, 2, 4, 0, 0, 0], [0, 0, 1, 4, 2, 0], [0, 0, 0, 0, 3, 0], [0, 0, ...