历史上的今天
返回首页

历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2020年10月14日 | 24c08 I2C总线协议操作程序汇编和C语言2个版本详解

2020-10-14 来源:51hei


;24c08操作时序为:起始信号sclk拉高情况下sda由高变低,表示起始

;                 结束信号sclk拉高情况下sda由低变高,表示结束

;                 字节由高位向低位依次发送

;                第一个字节是地址和读写控制,第二个是存储地址,第三个是数据,每个数据结束器件都会发送 ack应答信号;

;  I2C 总线协议

;I2C 总线协议定义如下

;1 只有在总线空闲时才允许启动数据传送

;2 在数据传送过程中当时钟线为高电平时数据线必须保持稳定状态不允许有跳变时钟线

;为高电平时数据线的任何电平变化将被看作总线的起始或停止信号

;起始信号

;时钟线保持高电平期间数据线电平从高到低的跳变作为I2C 总线的起始信号

;停止信号

;时钟线保持高电平期间数据线电平从低到高的跳变作为I2C 总线的停止信号

;

ORG 0000H

SCL EQU P2.6

SDA EQU P2.7

AJMP MAIN

ORG 00030H

MAIN:LCALL INIT   ;主函数,

     LCALL WRITE2408

  LCALL DELAY1

  LCALL READ2408

  MOV P0,A

  AJMP $      


INIT: SETB SCL    ;初始化

    LCALL  DELAY

SETB SDA

LCALL DELAY

RET


START:SETB SDA  ;起始信号

     LCALL DELAY

  SETB SCL

  LCALL DELAY

  CLR SDA

  LCALL DELAY

  RET

STOP:CLR SDA ;   停止信号

     LCALL DELAY

  SETB SCL

  LCALL DELAY

  SETB SDA

  RET

ACK:SETB SCL  ;应答信号

     LCALL DELAY

JB SDA,$

     CLR  SCL

LCALL DELAY

SETB SDA

LCALL DELAY

RET

WRITE:     MOV R4,#08H  ;写

     LOOP:  CLR SCL

     LCALL DELAY

     RLC A

     MOV SDA,C

     LCALL DELAY

     SETB SCL

     LCALL DELAY

     DJNZ R4,LOOP

      

    CLR SCL      ;哎呀吃大亏了,我说怎么就是写一个A0算完了而且还有一个停止信号,娘了个逼我程序里不是这样的啊,奥今天我才看透,原来A0的最低位是0

     LCALL DELAY  ;这里以前是先把SDA释放,再拉低SCL ,相当于一个停止信号啊,所以U820受到后把总线禁止了,也难怪写不出了,哈哈哈又学一招

     SETB SDA   ;原来这么细微的变动都会是你的程序白搭,即使你其他的都是对的;

     LCALL DELAY  ;加油;2010年7月22日午与天津宿舍

     RET    ;EEPROM的成功读取时很有意义的,嘿嘿


READ:MOV R4,#08H     ;读

         SETB SDA

   LCALL DELAY

LOP:   CLR SCL

   LCALL DELAY

   SETB SCL

   LCALL DELAY

   MOV C,SDA

   RLC A

   DJNZ R4,LOP

    CLR SCL

    RET

DELAY:       ;数据稳定

NOP

NOP

NOP

NOP

NOP

RET


WRITE2408:LCALL START

       MOV A,#0A0H

    LCALL WRITE

    LCALL ACK    ;向U820的00H单元写0x88;

    MOV A,#00H

    LCALL WRITE

    LCALL ACK

    MOV A,#88H

    LCALL WRITE

    LCALL ACK

    LCALL STOP

   RET

READ2408:LCALL START

          MOV A,#0A0H

    LCALL WRITE

    LCALL ACK

   MOV A,#00H  ;从U820的00H单元读出数据

       LCALL WRITE

       LCALL ACK

    LCALL START

    MOV A,#0A1H

    LCALL WRITE

    LCALL ACK

    LCALL READ

    LCALL STOP

    RET

DELAY1:        ;延时1S,在应用中这个可以是主程序啊哈哈,真他妈了噶比的爽老子也做出来了;爽啊

    MOV R7,#0A7H

DL1:

    MOV R6,#0ABH

DL0:

    MOV R5,#10H

    DJNZ R5,$

    DJNZ R6,DL0

    DJNZ R7,DL1

    NOP

    RET

    END



#include

#define uchar unsigned char

sbit sda=P2^7;

sbit scl=P2^6;


void delay1(uchar z)

{

uchar j,k;

    for(k=0;k                     

       {           

                      for(j=0;j<100;j++) ;  //此处j不得小于27否则读不出数据

        

        }        

}

void delay()

{


;;

}

void init()

{

sda=1;

delay();

scl=1;

delay();

}

void start()

{

sda=1;

  delay();

scl=1;

delay();

sda=0;

delay();

}

void stop()

{

sda=0;

delay();

scl=1;

  delay();

  sda=1;

   delay();


}

void ack()

{

scl=1;

   delay();

  if(sda==1)

  {  delay1(1000);


  }

scl=0;

  delay();

sda=1;

delay();

}

void write_24c08(uchar add)

{

uchar a,i;

      i=add;

    scl=0;

  delay();

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

  {  

  i=i<<1;

  sda=CY;

   delay();

   scl=1;

    delay();

      scl=0;

  delay();

}

scl=0;

delay();

sda=1;

delay();

}

uchar read_24c08()

{

   uchar a,readdate;

    scl=0;

   delay();

  sda=1;

    delay();

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

{


  scl=1;

   delay();  

readdate=(readdate<<1)|sda;  //这里注意啊,不要换成别的

scl=0;

  delay();


}

return readdate;

}



void main()

{

init();

start();

write_24c08(0xa0);

ack();

write_24c08(0x21);

ack();

write_24c08(0xf0);

ack();

stop();


    delay1(100);

  start();

write_24c08(0xa0);

ack();

write_24c08(0x21);

ack();

start();

  write_24c08(0xa1);

ack();

P0=read_24c08();

  stop();

while(1);

}


推荐阅读

史海拾趣

D3公司的发展小趣事

在电子行业的激烈竞争中,D3公司凭借其对技术创新的不懈追求,逐渐崭露头角。公司创始人李先生深知,在电子产品日新月异的今天,只有不断创新才能立于不败之地。他带领团队潜心研发,推出了一系列具有创新功能的电子产品,如集成了先进人工智能技术的智能音箱、采用全新电池技术的超薄笔记本等。这些产品一经上市,便受到了市场的热烈追捧,D3公司的市场份额也迅速扩大。

ABLIC公司的发展小趣事

2020年4月,ABLIC成为MinebeaMitsumi集团的一员。这一合作对于ABLIC来说具有重要意义。MinebeaMitsumi集团作为一家在电子元器件领域具有强大实力的企业,为ABLIC提供了更广阔的发展空间和资源支持。通过融入MinebeaMitsumi集团的“八矛战略”,ABLIC的模拟半导体业务得到了进一步提升,其在集团内部的地位也愈发重要。

晨晶电子(Chenjing Electronics)公司的发展小趣事

随着国内市场的不断饱和,晨晶电子积极寻求海外市场的发展机遇。公司凭借优质的产品和服务,成功打开了国际市场的大门。通过与国外客户的深入合作,晨晶电子的产品逐渐走向世界,其品牌影响力也日益增强。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的国际竞争力。

Etron公司的发展小趣事

1991年,台湾的电子行业正蓬勃发展,钰创科技(Etron)在这一时期应运而生,创始人凭借对市场敏锐的洞察力,决定专注于利基型缓冲记忆体产品与系统晶片的设计与生产。初创时期,公司面临着技术、资金和市场等多重挑战。然而,钰创科技凭借其团队的技术实力和创新精神,成功开发出了一系列具有竞争力的产品,逐渐在市场上崭露头角。

Dean Technology公司的发展小趣事

近年来,随着电子行业的快速发展和市场竞争的加剧,Dean Technology公司也面临着前所未有的挑战。为了应对这些挑战,公司积极调整战略方向,加强内部管理和团队建设。同时,他们还密切关注行业趋势和市场需求的变化,及时调整产品结构和市场策略。这些努力使得Dean Technology在应对行业变革和挑战时更加从容和自信。

请注意,以上故事是基于对Dean Technology公司一般情况的了解而编写的,可能不完全符合公司的实际发展历程。如需更详细的信息,请查阅相关资料或联系公司官方渠道。

Coiltronics公司的发展小趣事

在电子行业的初期,Coiltronics公司凭借其独特的线圈技术,成功打破了市场格局。当时,市场上的电子线圈普遍存在效率低下、散热不良等问题,而Coiltronics公司则通过深入研究,开发出一种新型的高效散热线圈。这一创新不仅提高了电子设备的性能,还大大降低了故障率,使得Coiltronics的产品在市场上大受欢迎。公司凭借这一技术优势,迅速在电子行业崭露头角。

问答坊 | AI 解惑

左手材料的理论起源与研究进展(转贴)

2001年美国加州大学制成一种新型异性材料并观察到其反常折射现象,引起学术界关注;2003年美国麻省理工大学实验证明了这种异性材料的可制造性,引起学术界、工业界和军方的高度重视;2003年美国《科学》杂志将这种奇异材料的研制纳入年度十大科学进 ...…

查看全部问答>

InterruptInitialize返回不了,怎么回事?

g_hInterrupt = CreateEvent(NULL, FALSE, FALSE, NULL);         g_hRxEvent = CreateEvent(NULL, FALSE, FALSE, NULL);         g_hTxEvent = CreateEvent(NULL, FALSE, FALSE, NULL);     ...…

查看全部问答>

急!求助:关于philips FM 芯片TEA5767自动搜台的问题

现在已有产品上挂一收音机模块,采用philips Tea5767hn,采用3-wire模式。 手动搜台已实现,但自动搜台不能实现。不知是相关控制没设置好,还是时序的问题。 相关代码:                 radio_write_ ...…

查看全部问答>

请问STM32和ZIGBEE合体芯片大概价位是多少?

                                 什么时候可以量产?…

查看全部问答>

msp430串口时钟设置问题,急!

我在FET仿真时用的是msp430f449,但实际中的硬件电路是用的 msp430f149,那我应该怎样修改软件中的时钟设置呢?请高手指点 代码如下: void uart_init(void) { char temp; FLL_CTL0 &= 0XBF; UCTL0 |= SWRST; UCTL0 |= CH ...…

查看全部问答>

群星系列驱动(LM3S811光盘中自带)

看到   绿叶,飘  说需要LM3S的驱动,这里传一份给大家!…

查看全部问答>

LPC1768 Flash可以做存储器用吗

LPC1768 内部Flash可以做存储器使用吗?我种感觉以IAP方式来操作不是很好。…

查看全部问答>

我想搭建产生2M的方波电路去驱动场管,我就知道LC、专用函数发生器、几个非门构成...

我想搭建产生2M的方波电路去驱动场管,我就知道LC、专用函数发生器、几个非门构成的震荡、不知道还有那些方案啊?可不可以用晶振啊?…

查看全部问答>

热敏打印机的电磁泄漏接收与还原(任务奖金详谈)

独立的电脑板连接热敏打印机(不连网,也不带无线发射)需要通过无线设备 或软件近距离接收(3-10米当然越远越好)思路;可以通过电磁泄漏的信息还原接收 也可以通过解译打印机通讯协议,打印格式 做个软件接口接收!或是可以接收到打印频率信息 在另 ...…

查看全部问答>

Flash API Error #65535

烧写DSP F2808 是出现 Flash API Error #65535: The Device in in limp mode ,operation failed, 请问谁遇到过,是什么原因造成的。…

查看全部问答>