历史上的今天
返回首页

历史上的今天

今天是:2025年07月21日(星期一)

正在发生

2018年07月21日 | C51IO口模拟I2C总线驱动AT24C16 (I2C协议部分)

2018-07-21 来源:eefocus

/* 

名称:C51IO口模拟I2C总线驱动EEPROM(AT24C16)


说明:I2C总线是由Philips公司开发的一种简单、半双工同步串行总线。它只需要两根线(SCL、SDA)即可在连接于总线上的器件之间传送信息。其中SCL时钟总线用于同步数据,SDA数据总线用来发送数据(或地址)。


和SPI总线不同的是,I2C总线通过在SDL上发送存储器的地址用来选中总线上对应的设备。关于具体的通信协议这里就不说了,无非是通过IO口模拟产生所需信号 

(如通信开始信号是SCL为高时,SDA产生一个下降沿信号。) 驱动程序中有 具体的说明。 

*/



//定义I2C相关变量

sbit     SCL=P2^1;     //I2C  时钟 

sbit     SDA=P2^0;     //I2C  数据 


bit ack;                 /*应答标志位*/



static void Delay_I2C() /*延时函数*/

{

    _Nop();

    _Nop();

    _Nop();

    _Nop();

    _Nop();

}



//启动I2C总线,即发送I2C起始条件:SCL为高电平期间,SDA出现下降沿

void Start_I2C()

{

    SDA = 1;

    Delay_I2C();            //延时一段时间

    SCL = 1;

    Delay_I2C();

    SDA = 0;

    Delay_I2C();


    SCL = 0;                //???           /*钳住I2C总线,准备发送或接收数据 */

    Delay_I2C();        



}


//停止I2C总线信号,即发送I2C停止条件:SCL为高电平期间,SDA出现上升沿

void Stop_I2C()

{

    SDA = 0;

    Delay_I2C();            //延时一段时间

    SCL = 1;

    Delay_I2C();

    SDA = 1;

    Delay_I2C();

}



//检验应答信号

bit CheckAck(void)

{

        bit val;

        /*发送完一个字节后检验设备的应答信号*/

        SDA=1;

        SCL=1;

        Delay_I2C();

        val=SDA;

        Delay_I2C();

        SCL=0;

        Delay_I2C();


        return val;

}



//通过I2C总线发送一个字节

bit  SendByte_I2C(unsigned char  c)

{

    unsigned char i = 0;


    SCL = 0;                //???           /*钳住I2C总线,准备发送或接收数据 */

    Delay_I2C();        


    for(i = 0;i<8;++i)

    {

        if(c<

            SDA = 1;

        else

            SDA = 0;


            SCL = 1;    /*置时钟线为高,通知被控器开始接收数据位*/

            Delay_I2C();    

            SCL = 0;

            Delay_I2C();            //???


    }


    return CheckAck();      //返回接收方的确认结果

}



//从I2C总线中接收一个字节的数据

unsigned char RecByte_I2C()

{

    unsigned char  retc;

  unsigned char  BitCnt;


  retc=0; 

  SDA=1;                       /*释放总线*/

  for(BitCnt=0;BitCnt<8;BitCnt++)

    {


        SCL=0;                  /*置时钟线为低,准备接收数据位*/

        Delay_I2C();

        SCL=1;                  /*置时钟线为高使数据线上数据有效*/

        Delay_I2C();

        retc=retc<<1;

        if(SDA==1)retc=retc+1;  /*读数据位,接收的数据位放入retc中 */

        Delay_I2C(); 

    }

        SCL=0;    

        Delay_I2C();

        return(retc);

}



//发送应答信号

void Ack_I2C(bit ack)

{

    if(ack==0)

        SDA=0;              /*在此发出应答或非应答信号 */

  else

        SDA=1;

  Delay_I2C();     

  SCL=1;

  Delay_I2C();

  SCL=0;                     /*清时钟线,钳住I2C总线以便继续接收*/

  Delay_I2C(); 

}


推荐阅读

史海拾趣

岑科(CENKER)公司的发展小趣事

在过去,国内企业在车载信号传输领域的共模电感选择有限,主要依赖进口品牌。岑科意识到这一市场的巨大空缺后,决定借助自主研发设备的优势进行研发工作。经过两三年的攻关,岑科成功研发出了ACML系列共模电感。这一系列产品在温度特性上表现优异,可在-40℃到150℃的范围内正常工作,并适用于CAN-BUS、CAN-FD、A2B及以太网等多种场景。岑科的这一研发成果不仅填补了国内市场空白,还实现了国产替代,为汽车电子行业的发展做出了重要贡献。

Digital Voice Systems Inc公司的发展小趣事

Digital Voice Systems, Inc.(DVSI)于1988年成立,当时正值数字通信技术的兴起阶段。公司创始人凭借对语音编解码技术的深刻理解和前瞻性的市场洞察力,决定投身于这一领域。他们开发出了具有专利保护的基于鲁棒性多带激励模型(MBE Model)的低码率语音压缩算法,如IMBE和AMBE编解码系统。这些算法在当时的市场上独树一帜,为DVSI赢得了第一桶金。

在创立初期,DVSI面临着资金、技术、市场等多方面的挑战。然而,他们凭借着坚定的信念和不懈的努力,逐步克服了这些困难。他们不断投入研发,优化算法,提高产品的性能和稳定性;同时,他们积极开拓市场,与各大通信设备制造商建立合作关系,将产品推向市场。

随着时间的推移,DVSI的产品逐渐在市场上获得了认可。他们的编解码系统被广泛应用于移动通信、卫星通信、军事通信等领域,为客户提供了高效、稳定的语音通信解决方案。DVSI也因此逐渐崭露头角,成为了电子行业中一颗耀眼的明星。

故事二至五框架概述

  1. 技术创新与突破:DVSI在语音编解码技术方面的持续创新,如推出新一代的高效压缩算法,进一步提升了产品的竞争力。
  2. 市场拓展与国际化:随着公司实力的增强,DVSI开始拓展国际市场,与全球多家知名企业建立合作关系,实现了国际化发展。
  3. 合作与竞争:在电子行业中,DVSI与其他企业的合作与竞争并存。他们通过合作共赢的方式,共同推动行业的发展;同时,也面临着来自竞争对手的挑战和竞争压力。
  4. 企业文化与团队建设:DVSI注重企业文化建设,倡导创新、协作、共赢的价值观。他们注重团队建设,吸引了一批优秀人才加入公司,为公司的发展提供了有力的人才保障。

以上故事和框架概述仅供参考,您可以根据这些线索进一步挖掘和编写关于DVSI公司的故事。

Brilliance公司的发展小趣事

Brilliance公司起源于科技创新的热潮之中,由一群充满激情的电子工程师和创业者共同创立。公司成立之初,便致力于研发具有创新性和实用性的电子产品。通过不断的技术攻关和市场调研,Brilliance成功推出了一系列受到消费者欢迎的产品,逐步在电子行业中崭露头角。

AirBorn公司的发展小趣事

随着电子行业的竞争日益激烈,AirBorn面临着来自同行的压力和挑战。为了保持领先地位,AirBorn加强了与客户的沟通与合作,深入了解市场需求和变化趋势。同时,公司还加大了对新技术和新材料的研发投入,不断推出具有创新性和竞争力的新产品。这些举措使得AirBorn在激烈的市场竞争中保持了稳健的发展态势。

E Connector Solutions公司的发展小趣事

E Connector Solutions公司始终坚持以客户需求为导向的产品创新策略。公司密切关注市场动态和客户需求变化,及时调整产品策略。例如,随着新能源汽车市场的兴起,公司迅速研发出适用于新能源汽车的专用连接器产品,满足了客户对高可靠性、高安全性的需求。这种以客户需求为导向的产品创新策略使得公司能够保持市场的领先地位。

DALLAS公司的发展小趣事

Dallas公司一直将技术研发作为公司发展的核心驱动力。公司投入大量资源用于半导体领域的技术研发,不断探索新的技术方向和产品应用。这种持续的技术研发投入使得Dallas公司能够不断推出具有创新性和竞争力的产品,保持了在市场中的领先地位。

问答坊 | AI 解惑

零基础学单片机视频教程——03讲 寄存器仿真实例

零基础学单片机视频教程——03讲  寄存器仿真实例     51系列单片机包含有4组通用工作寄存器,寄存器组0~3。每组通用工作寄存器包含8个寄存器R0~R7。本讲演示了如何在程序中选择不同的通用寄存器组,以及如何在程序调试运行 ...…

查看全部问答>

res 文件 到 mui 文件

修改后的res 文件怎么编译或者变成 .mui(不知道是不是 dll) 文件?…

查看全部问答>

如何使用WINIO实现键盘的监控?

本人工作之用,决无其他用意,谢谢。…

查看全部问答>

ARM+Linux开发平台模拟器(含测试代码)

下载地址 http://download.csdn.net/source/2640670 最快的ARM指令集模拟器(性能是qemu的两倍),支持ARM7,ARM9,ARM11,Cortex/Thumb,可直接运行ELF和WINCE程序。(含测试代码, ELF测试程序用armcc或者arm gcc编译,WINCE程序用pb等编译) This is ...…

查看全部问答>

做STM32IAP的时候,下载后不能引导应用程序运行

请教:做STM32 IAP的时候,用官方的例子下载后可以引导应用程序运行,自己写的不行 同一个bin文件,都是从0x8002000地址处编程 现在想读出来看看是不是我的根官方的编进去的数据不一样,有什么工具可以读出flash里的数据吗?&n ...…

查看全部问答>

读卡器整套资料(Mifare卡)

整理电脑发现里面还有自己整理的一些资料,招了一个比较齐全的发上来分享给大家。 这个文件夹里是一套制作读卡器的整套资料,包括电路图PCB、源代码程序和相关的datasheet和资料。需要的朋友拿去吧。…

查看全部问答>

请问:这个(void *) &PieVectTableInit;是什么语法结构?(void *) 到底什么意思?

void InitPieVectTable(void) {         int16        i;         Uint32 *Source = (void *) &PieVectTableInit;  //这是怎么指向的,能否说明一下?谢谢。 &nb ...…

查看全部问答>

团购的TI工业级模拟套片周一已收到上图

本帖最后由 dontium 于 2015-1-23 13:16 编辑   …

查看全部问答>

基于msp430g2553按键

#include \"msp430g2553.h\"void main(){  // Stop watchdog timer to prevent time out reset        WDTCTL = WDTPW + WDTHOLD;        //主系统时钟切换为外部高 ...…

查看全部问答>

关于电子节气门的问题

今天看了看电子节气门    里面提到  一个名词   叫做 节气门控制单元。。。。。这个所谓的节气门控制单元是不是  单片机啊??(我猜的啊)   还有个驱动电路模块   这是什么啊??? ...…

查看全部问答>