基于单片机的AT2402的I2C总线读写驱动程序

发布者:幸福旅程最新更新时间:2014-12-31 来源: 51hei关键字:单片机  AT2402  I2C总线读写 手机看文章 扫描二维码
随时随地手机看文章
//此部分为AT2402的驱动程序使用I2C总线连接
#include
 
//AT2402的功能函数
 
//                    向有子地址器件发送多字节数据函数              
//函数原型: bit  ISendStr(UCHAR sla,UCHAR suba,ucahr /s,UCHAR no); 
//功能:     从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件
//         地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。
//          如果返回1表示操作成功,否则操作有误。
//注意:    使用前必须已结束总线。
 
bit ISendStr(unsigned char  sla,unsigned char  suba,unsigned char  *s,unsigned char  no)
{
   unsigned char i;
 
   Start_I2c();               //启动总线//
   SendByte(sla);             //发送器件地址//
   if(ack==0)return(0);
   SendByte(suba);            //发送器件子地址//
   if(ack==0)return(0);       //此处表示内部ROM地址
 
   for(i=0;i
   {  
     SendByte(*s);            //发送数据//
     if(ack==0)return(0);
     s++;
   }
   Stop_I2c();                //结束总线//
 
   return(1);
}
 
//                    向有子地址器件读取多字节数据函数              
//函数原型: bit  RecndStr(UCHAR sla,UCHAR suba,ucahr /s,UCHAR no); 
//功能:     从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件
//         地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。
//           如果返回1表示操作成功,否则操作有误。
//注意:    使用前必须已结束总线。
bit IRcvStr(unsigned char  sla,unsigned char  suba,unsigned char  *s,unsigned char  no)
{
   unsigned char i;
 
   Start_I2c();                  //启动总线//
   SendByte(sla);                //发送器件地址//
   if(ack==0)return(0);
   SendByte(suba);               //发送器件子地址//
   if(ack==0)return(0);         //此处表示内部ROM地址
 
   Start_I2c();                 //重新启动总线//
   SendByte(sla+1);           //表示由主机处读取数据
   if(ack==0)return(0);
   for(i=0;i
   {  
     /s=RcvByte();               //发送数据//
      Ack_I2c(0);                //发送就答位// 
     s++;
   }
   /s=RcvByte();
   Ack_I2c(1);                   //发送非应位//
   Stop_I2c();                   //结束总线//
   return(1);
}
 
启动,停止,字节发送及应答位的程序参考:
 
I2C总线的驱动程序
//此部分为I2C总线的驱动程序/
 
#include
#include
#include
 
#define  NOP()   _nop_()   // 定义空指令
 
#define  _Nop()  _nop_()   //定义空指令 
sbit     SCL=P2^0;       //I2C  时钟
sbit     SDA=P2^1;       //I2C  数据
bit ack;                 //应答标志位/  
 
  //                起动总线函数  起动总线函数              
//函数原型: void  Start_I2c(); 
//功能:     启动I2C总线,即发送I2C起始条件. 
void Start_I2c()
{
  SDA=1;         //发送起始条件的数据信号 
 
 _Nop();
  SCL=1;
  _Nop();        //起始条件建立时间大于4.7us,延时 
 
 _Nop();
  _Nop();
  _Nop();
  _Nop();   
  SDA=0;         //发送起始信号
  _Nop();        // 起始条件锁定时间大于4μs
  _Nop();
  _Nop();
  _Nop();
  _Nop();      
  SCL=0;       //钳住I2C总线,准备发送或接收数据
  _Nop();
  _Nop();
}
 
 //                     结束总线函数              
//函数原型: void  Stop_I2c(); 
//功能:     结束I2C总线,即发送I2C结束条件. 
void Stop_I2c()
{
  SDA=0;      //发送结束条件的数据信号
  _Nop();       //发送结束条件的时钟信号
  SCL=1;      //结束条件建立时间大于4μs
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  _Nop();
  SDA=1;      //发送I2C总线结束信号
  _Nop();
  _Nop();
  _Nop();
  _Nop();
}
 
//                字节数据发送函数              
//函数原型: void  SendByte(UCHAR c);
//功能:     将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
 //         此状态位进行操作.(不应答或非应答都使ack=0)    
//           发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
void  SendByte(unsigned char  c)
{
 unsigned char  BitCnt;
 
 for(BitCnt=0;BitCnt<8;BitCnt++)  //要传送的数据长度为8位
    {
     if((c<
       else  SDA=0;               
     _Nop();
     SCL=1;               //置时钟线为高,通知被控器开始接收数据位
      _Nop();
      _Nop();             //保证时钟高电平周期大于4μs
      _Nop();
      _Nop();
      _Nop();        
     SCL=0;
    }
   
    _Nop();
    _Nop();
    SDA=1;                //8位发送完后释放数据线,准备接收应答位
    _Nop();
    _Nop();  
    SCL=1;
    _Nop();
    _Nop();
    _Nop();
    if(SDA==1)ack=0;    
       else ack=1;        //判断是否接收到应答信号
    SCL=0;
    _Nop();
    _Nop();
}
 
//                 字节数据接收函数              
//函数原型: UCHAR  RcvByte();
//功能:        用来接收从器件传来的数据,并判断总线错误(不发应答信号),
  //        发完后请用应答函数应答从机。    
unsigned char   RcvByte()
{
  unsigned char  retc;
  unsigned char  BitCnt;
 
  retc=0;
  SDA=1;                     //置数据线为输入方式
  for(BitCnt=0;BitCnt<8;BitCnt++)
      {
        _Nop();          
        SCL=0;                  //置时钟线为低,准备接收数据位
        _Nop();
        _Nop();                 //时钟低电平周期大于4.7μs
        _Nop();
        _Nop();
        _Nop();
        SCL=1;                  //置时钟线为高使数据线上数据有效
        _Nop();
        _Nop();
        retc=retc<<1;
        if(SDA==1)retc=retc+1;  //读数据位,接收的数据位放入retc中
        _Nop();
        _Nop();
      }
  SCL=0;   
  _Nop();
  _Nop();
  return(retc);
}
 
//                应答子函数
//函数原型:  void Ack_I2c(bit a);
//功能:      主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)
void Ack_I2c(bit a)
{
 
  if(a==0)SDA=0;              //在此发出应答或非应答信号
 
  else SDA=1;
  _Nop();
  _Nop();
  _Nop();     
  SCL=1;
  _Nop();
  _Nop();                    //时钟低电平周期大于4μs
 
  _Nop();
  _Nop();
  _Nop(); 
  SCL=0;                     //清时钟线,钳住I2C总线以便继续接收
  _Nop();
  _Nop();   
}
关键字:单片机  AT2402  I2C总线读写 引用地址:基于单片机的AT2402的I2C总线读写驱动程序

上一篇:单片机系统RAM的测试方法回顾与研究
下一篇:单片机存储器信息的断电保护

推荐阅读最新更新时间:2024-03-16 13:50

异种单片机共享片外存储器及其与微机通信方法
TMS320系列数字信号处理单片机(DSP)在测控、仪器仪表、图象处理、计算机视觉与声信号处理等领域得到了越来越广泛的应用。DSP获取原始采集数据和输出处理结果一般有两种途径:一是通过串行口,另一是通过数据总线读写片外存储器。本文介绍了基于DSP的信号处理目标板与基于单片机AT89C51的多路同步数据采集板通过共享片外随机存储器实现板间通信,来获取原始采集数据的方法,并给出了总线隔离硬件电路与软件控制流程。并介绍了把DSP的处理结果传送给基于MCS-51单片机或基于微机的控制系统的方法。文中还简要分析了AT89C51与微机进行串口通信的软硬件设计,通过扩展AT89C51间接实现了TMS320C32与单片机或微机之间的通信,比直接通
[单片机]
异种<font color='red'>单片机</font>共享片外存储器及其与微机通信方法
基于单片机的数控电流源设计
给出了一种基于 单片机 控制 的数控电流源设计。本设计以PIC16F877A 单片机 为核心部件,采用PID算法实现了量程可选、输出可调、步进精确、纹波电流极小的功能,而且可将输出电流预置值、实测值在LED上同时显示。经实验测试证明,此设计具有较高的 控制 精度。 1 引言 电源 技术尤其是数控 电源 技术是一门实践性很强的工程技术,涉及了电气、 电子 、系统集成、控制理论、材料等诸多学科领域。计算机和 通讯 技术的发展,给 电力 电子 技术提供了广阔的发展前景,同时也给电源提出了更高的要求。普通电源由于精确度不高等缺点已不能满足现实的需要。直到单片机技术及电压转换模块的出现,才使精确数控电源的发展有了可能。本文所设计的数控电
[电源管理]
AVR单片机控制LCD1602液晶显示
一、字符型LCD1602介绍 详情请进: http://q.163.com/longfei-mcu/ 以上是LCD1602的图片,这是市面上大多数使用的。LCD1602已很普遍了,市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样 字符型LCD的引脚定义如下: 图1 HD44780内置了DDRAM、CGROM和CGRAM。 DDRAM就是显示数据RAM,用
[单片机]
AVR<font color='red'>单片机</font>控制LCD1602液晶显示
51单片机四大误区怎么破?
  51指MCS-51系列单片机, CICS 指令集。由Intel公司开发,其结构增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源,内有128个RAM单元及4K的ROM。其代表型号是ATMEL公司的A系列,它广泛应用于工业之中。目前国内的 51单片机 市场主要为国产的产品STC系列其号称,稳定与廉价的。下面就随嵌入式小编一起来了解一下相关内容吧。    学习 51单片机 的误区   误区1: 51单片机 是学习的基础   “51单片机是学习的基础”这句话本身并没有错。在我读本科的时候,当时它无疑是学习的基础——毕竟那时没有更高级的单片
[嵌入式]
freescale飞思卡尔 HCS12 系列单片机bootloader详解(三)
在完成内存映射的内容后,接下来我们将进入一个简单Bootloader的实际设计中来。在第一节内容中,我们已经简单介绍了bootlaoder的作用,它实际上就是在单片机重启过程中的一个步骤:如果有bootloader的启动信号,则进入bootloader模式开始新程序的接收与flash的擦写,若没有bootloader的启动信号,则直接进入用户程序执行用户程序内容。 bootloader的启动信号一般有如下两种: 1)外部引脚接地或者拉高电平;每次启动时先监测某一已经设定的引脚是否已经被操作到了bootloader启动电平位,如果是希望bootloader启动的电平,则需要跳转入bootloader程序,否则直接进入用户程序
[单片机]
51单片机实现控制网卡芯片进行数据传输的设计
在网络技术应用日益广泛的今天,网络传输是最经济有效的数据传输方式。如何利用廉价的51单片机来控制网卡芯片进行数据传输,加载TCP/IP协议连接到互联网,实现网络通信成了众多设计者的目标。但由于指令及资源的限制,实施过程会有许多困难。我们在设计方案中舍弃了耗费资源的高级协议,采用发送小数据包的方式以避免分段,来简化TCP协议和UDP协议,实现互联接入。 硬件设计与实现 系统的硬件结构框图如图1所示。本系统的微控制器是Winbond公司的78E58,网络接口芯片是与NE2000系列兼容的ReaLTEk公司的RTL8019AS。RTL8019AS内置了10BASE-T收发器,外接一个隔离LPF滤波器,经RJ-45接口输出。外部RAM
[单片机]
51<font color='red'>单片机</font>实现控制网卡芯片进行数据传输的设计
基于SJA1000的CAN总线和AT89C51单片机实现运动控制系统的设计
1、引言 运动控制系统是以机械运动的驱动设备—电动机为控制对象, 以控制器为核心, 以电力电子、功率变换装置为执行机构, 在自动控制理论指导下组成的电气传动控制系统。在电气时代, 电动机一直在现代化的生产和生活中起着十分重要的作用。在近年来, 由于半导体制造设备等相关的电子制造设备市场大幅成长, 而使得机器设备上的运动控制系统出现了以下几点技术需求: ( 1) 多轴运动控制。机器设备因自动化程度提高而使得单一机器上所需要的轴数增多, 一台设备上十几轴是常见的事情。在轴数变多后, 如何协调各轴动作就是一个重要的课题。 ( 2) 体积要小。由于厂房空间的限制, 机器的体积要求越小越好, 机器内控制器的体积也就被要求愈来愈小, 相对
[单片机]
基于SJA1000的CAN总线和AT89C51<font color='red'>单片机</font>实现运动控制系统的设计
意法半导体的新8位微控制器降低车身应用的总体成本
新系列车用微控制器提高驾乘人员的舒适度和便利性 目前各种各样的机电解决方案正在推动汽车工业增长,车用机电解决方案的技术先锋意法半导体(纽约证券交易所: STM )19日公布一系列新的 8 位微控制器产品,新产品让雨刷、恒温空调、车门锁、天窗、电动车窗升降机等各种成本敏感的车身应用同时具有灵活性和可靠性。 ST7FL 系列内置一个 EEPROM 参数存储器、一个 1.5KB 到 8KB 的代码存储器以及一个 RC 振荡器,有了这些特性,用户可将其用于开发更细微的应用,设计变得更加容易。 新微控制器基于 ST 的增强型 ST7 架构,包含一个可靠性很高的 EEPROM 存储库,用于保存配置参数
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved