STM32 IIC读写AT24C02(二)

发布时间:2024-03-29  

上次已经完成了IIC读写AT24C02的协议层,现在开始编写读写AT24C02的驱动函数。先从单字节的读写开始。

2ec8045661483961fe408206da015fa6_wKgZomS7P1yAfw0HAABRJY4sjo0631.jpg

字节写要求在接收器件地址和ACK应答后,接收位的字地址。接收到这个地址后AT24C02应答“0”,然后是一个8位数据。在接收8位数据后,AT24C02应答“0”,接着必须由主器件发送停止条件来终止写序列。


此时AT24C02进入内部写周期tWR,数据写入非易失性存储器中,在此期间所有输入都无效。直到写周期完成,AT24C02才会有应答。


void AT24C02_ByteWrite(u8 wordAdd,u8 dat,s8 *err)

{

  u8 ack = 0;


  IIC_Start();

  IIC_SendByte(AT24C02_ADD< < 1);

  ack = IIC_CheckAck();

  if(ack != 0)                //发器件地址

  {                           

    IIC_Stop();               //不应答

    err = -1;

    return;

  }


  IIC_SendByte(wordAdd);      //发字地址

  ack = IIC_CheckAck();

  if(ack != 0)                 //不应答

  {

    IIC_Stop();

    *err = -2;

    return;

  }


  IIC_SendByte(dat);          //发数据

  ack = IIC_CheckAck();

  if(ack != 0)                //不应答

  {

    IIC_Stop();

    *err = -3;

    return;

  }


  IIC_Stop();

  *err = 0;  

}

其中传入了一个错误检测err,是在测试程序时为了快速发现错误位置而设置的。如果出现错误,就发送停止信号并用return退出该次写操作,由于该函数为void类型,所以直接return就可以了,不用带返回值。


和字节写相对应的是随机读,读取任意一个地址的数据。

6b962f4e9e13346465da076115ad1d26_wKgaomS7P12AP-YcAACKpAlUwhs967.jpg

随机读需先写一个目标字地址,一旦AT24C02接收器件地址和字地址并应答了ACK,主器件就产生一个重复的起始条件。


然后,主器件发送器件地址,AT24C02应答ACK,并随时钟送出数据。主器件无需应答“0”,但需发送停止条件。


u8 AT24C02_RandomRead(u8 wordAdd,s8 *err)

{

  u8 ack = 0;

  u8 temp = 0;


  IIC_Start();

  IIC_SendByte(AT24C02_ADD< < 1);//发器件地址

  ack = IIC_CheckAck();

  if(ack != 0)                 //不应答

  {

    IIC_Stop();

    *err = -4;

    goto loop;    

  }


  IIC_SendByte(wordAdd);      //发字地址

  ack = IIC_CheckAck();

  if(ack != 0)                 //不应答

  {

    IIC_Stop();

    *err = -5;

    goto loop;

  }


  IIC_Start();

  IIC_SendByte(AT24C02_ADD< < 1 | 1);//发器件地址(读)

  ack = IIC_CheckAck();

  if(ack != 0)                 //不应答

  {

    IIC_Stop();

    *err = -6;

    goto loop;

  }

  temp = IIC_ReadByte();

  IIC_NoAcktoSlave();

  IIC_Stop();


  *err = 0;


loop:

  return temp;

}

跟写字节一样,这里也引入了err判断错误,出现错误发送停止信号并退出该次读操作。因为该函数需要返回值,所以这里不能像上面那样直接return,但是出现错误,也不能让return带着一个未知的数返回。这里退出该次读操作用到了C语言中很忌讳的goto,直接让程序跳到想要的位置。这种方式来做处理在嵌入式中是比较常见的,虽然C语言中goto是不被推荐使用的,但是只要能把它用的好,就可以大胆的用。


字节读写函数封装完成后,直接在主函数中调用。AT24C02擦写次数只有100万次左右,所以写函数不可以放入while循环中,否则器件可能很快就坏了。


主文件


#include "stm32f4xx.h"

#include "led.h"

#include "usart.h"

#include "delay.h"

#include "stdio.h"

#include "AT24C02.h"



int main()

{

  s8 err = 0;

  u8 temp = 0;

  Usart1_Init(115200);

  LED_Init();              //初始化LED灯

  AT24C02_Init();


  AT24C02_ByteWrite(0x05,125,&err);

  temp = AT24C02_RandomRead(0x05,&err);

  printf("temp = %drn",temp);

  

  while(1)              

  {

  }

}

8d249409e30ac4d99b399d10b9e564ec_wKgaomS7P12AXN3tAAAJLOMnYjc949.jpg

将程序烧入开发板中,打开串口助手,可以看到读到的数正好是写入的数,AT24C02单字节读写成功。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>