zhange 发表于 2024-5-21 19:44:25

本帖最后由 zhange 于 2024-5-21 19:45 编辑

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



由位衍生出字节传输 先传输高位
void iicSendOne(u8 dat)      //发送一个字节
{
      u8 i=8;
      SCL = 0;
      SDA = 0;
      do
      {
                if( dat& 0x80 )
                        SDA      = 1;
                else
                        SDA      = 0;
                Delay2us();
                dat<<=1;
                SCL = 1;
                Delay2us();
                SCL = 0;
                Delay2us();      
      }
      while(--i);
}


zhange 发表于 2024-5-21 20:09:27

7.应答也不别看手册了看stc32手册吧







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

void iicSendAck(void)      //ack
{
      SDA      = 0;
      Delay2us();
      SCL = 1;
      Delay2us();
      SCL = 0;
      Delay2us();
}

void iicSendNoAck(void)      //noack
{
      SDA      = 1;
      Delay2us();
      SCL = 1;
      Delay2us();
      SCL = 0;
      Delay2us();
}


void iicDengAck(void)      //等到从机ACK1是不应答0是应答
{
      SDA      = 1;
      Delay2us();
      SCL = 1;
      Delay2us();
      ack = SDA;
      Delay2us();
      SCL = 0;
      Delay2us();
      
}


zhange 发表于 2024-5-21 20:17:18

8.写操作写一个字节和写一页(1-8个字节)写一个字节包含在了写页




void IIC_Write_NByte(unsigned char *p,unsigned char number )        //iic写入连续的几个字节
{
        iicStart();
        iicSendOne(0xa0); //器件地址
        iicDengAck();
        if( !ack )
        {
          iicSendOne(0); //写开始字节
                iicDengAck();
                if( !ack )
                {
                        do
                        {
                                iicSendOne(*p);
                                p++;
                                iicDengAck();
                                if( ack )   //1为不应答
                                        break;
                        }
                        while(--number);// number为写入连续的几个注意1页为8个   比如5开始 只能写到7,其他的写入0 1 2 3后推
                }
        }
        iicStop();       
}

晓飛飛 发表于 2024-5-21 20:34:24

zhange 发表于 2024-5-21 19:36
老哥问下6楼的那个图写周期啥意思???看不懂了

就是给缓存区填入数据并停止总线后,EEPROM开始将数据写入存储器,这个时间周期就叫写周期,当前写周期结束前,不可再次写入数据。所以写一页就得等待5ms,然后才能再写一页。

zhange 发表于 2024-5-21 20:50:16

晓飛飛 发表于 2024-5-21 20:34
就是给缓存区填入数据并停止总线后,EEPROM开始将数据写入存储器,这个时间周期就叫写周期,当前写周期结 ...

谢谢   慢慢消化

zhange 发表于 2024-5-22 06:28:12

9.读操作与写操作初始化相同,只是器件地址中的读/写选择位应为"1"。有三种不同的读操作方式:当前地址读,随机读和顺序读。这里只演示随机读。


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





void IIC_Read_NByte(unsigned char *p,unsigned char number)        //iic读取连续的几个字节
{
        iicStart();
        iicSendOne(0xa0);   //从机地址这里是写
        iicDengAck();
        if( !ack )
        {
                P60=0;
                iicSendOne(0);       //读取开始的地址
                iicDengAck();
                if( !ack )
                {
                        iicStart();
                        iicSendOne(0xa1);//fa发送从机地址和读标志位
                        iicDengAck();
                        if( !ack )
                        {

                                do
                                {
                                        *p = iicDuOne();
                                        p++;
                                        if( number!=1 )
                                                iicSendAck();

                                }
                                while(--number);
                                iicSendNoAck;
                        }
                }               
        }

        iicStop();       
}


zhange 发表于 2024-5-22 06:30:24

本帖最后由 zhange 于 2024-5-22 06:36 编辑

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





u8 iicDuOne(void)      //读取一个字节
{
      u8 i=8,dat=0;
      SCL = 0;
      SDA      = 1;
      do
      {
                SCL = 1;
                Delay2us();
                dat<<=1; //因为先传出来的是高位要左移。
                if( SDA )
                        dat |= 1;
                SCL = 0;
                Delay2us();

zhange 发表于 2024-5-22 06:44:43

我这里读取的是开机次数,已经成功




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

需要自己改动eeprom地址,我没打开入口参数


xxkj2010 发表于 2024-5-22 08:00:12

模拟IIC通讯,我以为是硬件IIC。不过很基础很详尽的,很值得学习。
页: 1 [2]
查看完整版本: stc32链接AT24C02存储芯片记录