单片机基础模块学习——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();//终止通信	
}
相关推荐
AI+程序员在路上1 分钟前
新手进入嵌入式行业方法与方向选择
c语言·开发语言·单片机·嵌入式硬件
The️6 分钟前
STM32F407 + LVGL 图形界面开源开发板
stm32·单片机·嵌入式硬件·开源·硬件工程·开源协议·pcb工艺
Zevalin爱灰灰13 分钟前
编程技巧(基于STM32)第三章 模式切换程序模板
stm32·单片机·嵌入式
爱喝纯牛奶的柠檬34 分钟前
【已验证】STM32驱动RC522_RFID模块实现卡片识别
stm32·单片机·嵌入式硬件
老师用之于民35 分钟前
【DAY34】基于 IMX6ULL 的嵌入式系统底层开发:中断、时钟与定时器配置
单片机·嵌入式硬件
DA02211 小时前
系统移植-STM32MP1_U-Boot移植
单片机·bsp·系统移植
ytttr8731 小时前
MAX31856热电偶采集芯片参考代码(STM32实现)
stm32·单片机·嵌入式硬件
jghhh012 小时前
九齐单片机2路PWM控制输出实现指南
单片机·嵌入式硬件
电气_空空2 小时前
基于 LabVIEW 串口通信的研究
单片机·嵌入式硬件·毕业设计·labview
weixin_456808382 小时前
【沁恒蓝牙开发】关闭独立看门狗
c语言·单片机·嵌入式硬件