单片机基础模块学习——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();//终止通信	
}
相关推荐
玩转单片机与嵌入式1 天前
一个成熟的嵌入式AI系统,是长什么样子的?
人工智能·单片机·嵌入式硬件·嵌入式ai
Wave8451 天前
从单片机开发看透网络底层:Wi-Fi、TCP/IP 与 HTTP 的通俗解析
网络·单片机·tcp/ip
玩转单片机与嵌入式1 天前
不会 Python、不会深度学习,也能在STM32上跑AI模型吗?
人工智能·单片机·嵌入式硬件·嵌入式ai
jghhh011 天前
基于STM32的桌面Mini时钟设计
stm32·单片机·嵌入式硬件
电化学仪器白超1 天前
小乌龟Git全程图形化操作指南:嵌入式本地版本管理与Gitee私有云备份实战
git·python·单片机·嵌入式硬件·物联网·gitee·自动化
yong99901 天前
基于STM32 Nucleo板的彩色LED照明灯设计(纯CubeMX开发)
stm32·单片机·嵌入式硬件
lingzhilab1 天前
零知派——STM32驱动INA219电流功率监测计实现高精度电源管理
stm32·单片机·嵌入式硬件
ahccqw1 天前
CAN总线通信入门及实例代码(stm32f4系列)
stm32·单片机·嵌入式硬件
振南的单片机世界1 天前
电源、复位、时钟:单片机的“生存三要素”
单片机·嵌入式硬件
SUNNYSPY0012 天前
16N65-ASEMI重塑功率电子新标杆16N65
单片机