找回密码
 立即注册
楼主: zhange

stc32链接AT24C02存储芯片记录

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-5-21 19:44:25 | 显示全部楼层
本帖最后由 zhange 于 2024-5-21 19:45 编辑

6.位传输
每个时钟脉冲传送一位数据。SCL为高时SDA必须保持稳定,因为此时SDA的改变被认为是控制信号。

截图202405211942119973.jpg


由位衍生出字节传输 先传输高位

  1. void iicSendOne(u8 dat)        //发送一个字节
  2. {
  3.         u8 i=8;
  4.         SCL = 0;
  5.         SDA = 0;
  6.         do
  7.         {
  8.                 if( dat& 0x80 )
  9.                         SDA        = 1;
  10.                 else
  11.                         SDA        = 0;
  12.                 Delay2us();
  13.                 dat<<=1;
  14.                 SCL = 1;
  15.                 Delay2us();
  16.                 SCL = 0;
  17.                 Delay2us();        
  18.         }
  19.         while(--i);
  20. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-5-21 20:09:27 | 显示全部楼层
7.应答也不别看手册了  看stc32手册吧


截图202405212008039290.jpg

截图202405212008238616.jpg


函数里的ack为全局变量,需要自己定义。

  1. void iicSendAck(void)        //ack
  2. {
  3.         SDA        = 0;
  4.         Delay2us();
  5.         SCL = 1;
  6.         Delay2us();
  7.         SCL = 0;
  8.         Delay2us();
  9. }
  10. void iicSendNoAck(void)        //noack
  11. {
  12.         SDA        = 1;
  13.         Delay2us();
  14.         SCL = 1;
  15.         Delay2us();
  16.         SCL = 0;
  17.         Delay2us();
  18. }
  19. void iicDengAck(void)        //等到从机ACK  1是不应答  0是应答
  20. {
  21.         SDA        = 1;
  22.         Delay2us();
  23.         SCL = 1;
  24.         Delay2us();
  25.         ack = SDA;
  26.         Delay2us();
  27.         SCL = 0;
  28.         Delay2us();
  29.         
  30. }
复制代码



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-5-21 20:17:18 | 显示全部楼层
8.写操作  写一个字节和写一页(1-8个字节)  写一个字节包含在了写页

截图202405212014414454.jpg


  1. void IIC_Write_NByte(unsigned char *p,unsigned char number )        //iic写入连续的几个字节
  2. {
  3.         iicStart();
  4.         iicSendOne(0xa0); //器件地址
  5.         iicDengAck();
  6.         if( !ack )
  7.         {
  8.           iicSendOne(0); //写开始字节
  9.                 iicDengAck();
  10.                 if( !ack )
  11.                 {
  12.                         do
  13.                         {
  14.                                 iicSendOne(*p);
  15.                                 p++;
  16.                                 iicDengAck();
  17.                                 if( ack )   //1为不应答
  18.                                         break;
  19.                         }
  20.                         while(--number);// number  为写入连续的几个  注意1页为8个   比如5开始 只能写到7,其他的写入0 1 2 3后推
  21.                 }
  22.         }
  23.         iicStop();       
  24. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:422
  • 最近打卡:2025-05-08 01:06:54
已绑定手机

35

主题

2111

回帖

2259

积分

荣誉版主

积分
2259
发表于 2024-5-21 20:34:24 | 显示全部楼层
zha*** 发表于 2024-5-21 19:36
老哥问下  6楼的那个图  写周期  啥意思???  看不懂了

就是给缓存区填入数据并停止总线后,EEPROM开始将数据写入存储器,这个时间周期就叫写周期,当前写周期结束前,不可再次写入数据。所以写一页就得等待5ms,然后才能再写一页。
睁开眼睛做场梦~~~
回复 支持 1 反对 0

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-5-21 20:50:16 | 显示全部楼层
晓*** 发表于 2024-5-21 20:34
就是给缓存区填入数据并停止总线后,EEPROM开始将数据写入存储器,这个时间周期就叫写周期,当前写周期结 ...

谢谢   慢慢消化
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-5-22 06:28:12 | 显示全部楼层
9.读操作与写操作初始化相同,只是器件地址中的读/写选择位应为"1"。有三种不同的读操作方式:当前地址读,随机读和顺序读。这里只演示随机读。


随机读需先写一个目标字地址, 一旦EEPROM接收器件地址和字地址并应答了ACK,主 器件就产生一个重复的起始条件。然后,主器件发送器件地址(读/写选择位为"1"), EEPROM应答ACK,并随时钟送出数 据。主器件无需应答"0",但需发送停止条件。


截图202405220625434985.jpg


  1. void IIC_Read_NByte(unsigned char *p,unsigned char number)        //iic读取连续的几个字节
  2. {
  3.         iicStart();
  4.         iicSendOne(0xa0);   //从机地址  这里是写
  5.         iicDengAck();
  6.         if( !ack )
  7.         {
  8.                 P60=0;
  9.                 iicSendOne(0);       //读取开始的地址
  10.                 iicDengAck();
  11.                 if( !ack )
  12.                 {
  13.                         iicStart();
  14.                         iicSendOne(0xa1);  //fa发送从机地址和读标志位
  15.                         iicDengAck();
  16.                         if( !ack )
  17.                         {
  18.                                 do
  19.                                 {
  20.                                         *p = iicDuOne();
  21.                                         p++;
  22.                                         if( number!=1 )
  23.                                                 iicSendAck();
  24.                                 }
  25.                                 while(--number);
  26.                                 iicSendNoAck;
  27.                         }
  28.                 }               
  29.         }
  30.         iicStop();       
  31. }
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-5-22 06:30:24 | 显示全部楼层
本帖最后由 zhange 于 2024-5-22 06:36 编辑

10.说明书没没有读取  看stc32手册 时序图


截图202405220630031816.jpg


  1. u8 iicDuOne(void)        //读取一个字节
  2. {
  3.         u8 i=8,dat=0;
  4.         SCL = 0;
  5.         SDA        = 1;
  6.         do
  7.         {
  8.                 SCL = 1;
  9.                 Delay2us();
  10.                 dat<<=1; //因为先传出来的是高位要左移。
  11.                 if( SDA )
  12.                         dat |= 1;
  13.                 SCL = 0;
  14.                 Delay2us();
复制代码


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:239
  • 最近打卡:2025-05-07 07:20:07

61

主题

818

回帖

1514

积分

金牌会员

积分
1514
发表于 2024-5-22 06:44:43 | 显示全部楼层
我这里读取的是开机次数,已经成功


截图202405220642052378.jpg

iic软件模拟eeprom存储开机时间源码

需要自己改动eeprom地址,我没打开入口参数
05-21.zip (398.1 KB, 下载次数: 51)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:526
  • 最近打卡:2025-05-07 07:52:42

109

主题

1910

回帖

5304

积分

论坛元老

积分
5304
发表于 2024-5-22 08:00:12 | 显示全部楼层
模拟IIC通讯,我以为是硬件IIC。不过很基础很详尽的,很值得学习。
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-8 02:17 , Processed in 0.129416 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表