单片机基础模块学习——AT24C02芯片

一、EEPROM芯片

|-------------|-------------|
| ROM | RAM |
| 断电后数据保留 | 断电后数据消失 |

因此,如果在断电后希望数据继续保留的话,就需要存储在EEPROM芯片中。

二、EEPROM芯片原理图

  • A0~A2与芯片地址相关连接到GND,为0
  • GND 接地,VCC 正电源
  • WP------write protect写保护,连接到地,意味着可以被自由写入(连接到高电平无法被写入)
  • scl,sda说明采用iic协议进行通信

前七位固定不变,最后一位是0或1,write是0,read是1

所以写入地址是:0xA0 读取地址是:0xA1

因为地址不同,所以都采用iic协议也不会有冲突。

三、写入读取方式

1.写入方式

  1. start 开始信号
  2. DEVICE ADDRESS 地址
  3. R/W 低电平是写,高电平是读
  4. ACK 应答位
  5. WORD ADDRESS 写入的位置
  6. ACK 应答位
  7. DATA写入相关数据
  8. ACK 应答位
  9. STOP 终止

2.读取方式

  1. start 开始信号
  2. DEVICE ADDRESS 设备地址
  3. R/W 低电平是写,高电平是读
  4. ACK 应答位
  5. WORD ADDRESS 读取的位置
  6. ACK 应答位
  7. start 再次发送开始信号
  8. DEVICE ADDRESS 设备地址
  9. READ 进入读模式
  10. ACK 应答位
  11. DATA将指定地址上的数据返回回来
  12. NO ACK没有应答
  13. STOP 终止

四、开发板位置

五、模块代码

cpp 复制代码
#include "iic.h"
#define DELAY_TIME	5

//
static void I2C_Delay(unsigned char n)
{
    do
    {
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();_nop_();		
    }
    while(n--);      	
}

//
void I2CStart(void)
{
    sda = 1;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 0;
	I2C_Delay(DELAY_TIME);
    scl = 0;    
}

//
void I2CStop(void)
{
    sda = 0;
    scl = 1;
	I2C_Delay(DELAY_TIME);
    sda = 1;
	I2C_Delay(DELAY_TIME);
}

//
void I2CSendByte(unsigned char byt)
{
    unsigned char i;
	
    for(i=0; i<8; i++){
        scl = 0;
		I2C_Delay(DELAY_TIME);
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
		I2C_Delay(DELAY_TIME);
        scl = 1;
        byt <<= 1;
		I2C_Delay(DELAY_TIME);
    }
	
    scl = 0;  
}

//
unsigned char I2CReceiveByte(void)
{
	unsigned char da;
	unsigned char i;
	for(i=0;i<8;i++){   
		scl = 1;
		I2C_Delay(DELAY_TIME);
		da <<= 1;
		if(sda) 
			da |= 0x01;
		scl = 0;
		I2C_Delay(DELAY_TIME);
	}
	return da;    
}

//
unsigned char I2CWaitAck(void)
{
	unsigned char ackbit;
	
    scl = 1;
	I2C_Delay(DELAY_TIME);
    ackbit = sda; 
    scl = 0;
	I2C_Delay(DELAY_TIME);
	
	return ackbit;
}

//
void I2CSendAck(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit; 
	I2C_Delay(DELAY_TIME);
    scl = 1;
	I2C_Delay(DELAY_TIME);
    scl = 0; 
	sda = 1;
	I2C_Delay(DELAY_TIME);
}

unsigned char PCF8591_ADC(void)
{
	unsigned char temp;
	
	/**********************写入**********************/
	I2CStart();//开始
	I2CSendByte(0x90);//发送写地址
	I2CWaitAck();//等待应答
	
	I2CSendByte(0x43);//发送光敏电阻控制位
	I2CWaitAck();//等待应答
	
	/**********************读取**********************/
	I2CStart();//开始
	I2CSendByte(0x91);//发送读地址
	I2CWaitAck();//等待应答
	
	temp=I2CReceiveByte();//接收
	I2CSendAck(1);//发送应答
	I2CStop();//终止通信
	
	return temp;
}

void PCF8591_DAC(unsigned char dat)
{
	I2CStart();//开始
	I2CSendByte(0x90);//发送写地址
	I2CWaitAck();//等待应答
	
	I2CSendByte(0x41);//发送光敏电阻控制位
	I2CWaitAck();//等待应答
	
	I2CSendByte(dat);//发送光敏电阻控制位
	I2CWaitAck();//等待应答
	I2CStop();
	  
}

void EEPROM_Read(unsigned char *pucRuf,unsigned char addr,unsigned char num)
{
	I2CStart();
	I2CSendByte(0xA0);//发送设备地址
	I2CWaitAck();//等待应答
	
	I2CSendByte(addr);//发送写入位置
	I2CWaitAck();
	
	I2CStart();
	I2CSendByte(0xA1);//发送读取地址
	I2CWaitAck();
	
	while(num--)
	{
		*pucRuf++= I2CReceiveByte();
		 if(num)
			 I2CSendAck(0);
		 else
			 I2CSendAck(1);
	}
	I2CStop();//终止通信	
}

void EEPROM_Write(unsigned char *pucRuf,unsigned char addr,unsigned char num)
{
	I2CStart();
	I2CSendByte(0xA0);//发送设备地址
	I2CWaitAck();//等待应答
	
	I2CSendByte(addr);//发送读取位置
	I2CWaitAck();
	
	while(num--)
	{
		I2CSendByte(*pucRuf++);
		I2CWaitAck();
		I2C_Delay(200);//加入延时,不至于导致总线过于繁忙,有助于总线稳定性
	}
	
	I2CStop();//终止通信	
}
相关推荐
踏着七彩祥云的小丑2 小时前
嵌入式测试第 32 天:升级测试:固件OTA升级、断点续传、回滚测试
单片机·嵌入式硬件·学习
点灯小铭2 小时前
基于单片机与DAC0832的双路波形信号发生系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业
sramdram2 小时前
基于MCU微控制器的电子血压计应用解决方案
单片机·嵌入式硬件·mcu·mcu微控制器
Szime3 小时前
AD9218 国产替代方向:双通道 10 位 105MSPS ADC 选型支持
单片机·嵌入式硬件·fpga开发·汽车
凡人叶枫3 小时前
Effective C++ 条款15:在资源管理类中提供对原始资源的访问
linux·开发语言·c++·stm32·单片机
张海森-1688204 小时前
库里搜索函数 api接口__grep命令
单片机
xxwxx__5 小时前
51单片机定时器/计数器中断详解(T0和T1)——从入门到精通
c语言·单片机·嵌入式硬件·51单片机
HAPPY酷5 小时前
STM32 两种烧录方式对比:Keil Load vs FlyMCU 串口下载
stm32·单片机·嵌入式硬件
清风6666665 小时前
基于单片机的汽车胎压与温度监控系统
单片机·嵌入式硬件·汽车·毕业设计·课程设计·期末大作业
✎ ﹏梦醒͜ღ҉繁华落℘5 小时前
产品研发----点型光电感烟火灾探测器(三)
单片机