24C02的读/写与MCP4017可编程电阻
24C02的读/写
写操作时序图
写操作代码
在i2c.c文件中编写
void i2c_24c02_write(unsigned char *pucBuf , unsigned char ucAddr , unsigned char ucNum)
{
I2CStart(); //开始
I2CSendByte(0xa0); //器件地址为写地址操作 24C02的芯片地址为1010 (A2 A1 A0)(R=1,W=0)0xA0为写
I2CWaitAck();
I2CSendByte(ucAddr);//写地址
I2CWaitAck();
while(ucNum--) //写ucNum个数据
{
I2CSendByte(*pucBuf++); //将此地址*pucBuf取值后写入
I2CWaitAck();
}
I2CStop(); //停止
delay1(500);
}
读操作时序图
读操作代码
void i2c_24c02_read(unsigned char *pucBuf , unsigned char ucAddr , unsigned char ucNum)
{
I2CStart(); //开始
I2CSendByte(0xa0); //器件地址为写地址操作 24C02的芯片地址为1010 (A2 A1 A0)(R=1,W=0)0xA0为写
I2CWaitAck();
I2CSendByte(ucAddr);//写地址
I2CWaitAck();
I2CStart(); //再次开始
I2CSendByte(0xa1); //器件地址为读地址操作 24C02的芯片地址为1010 (A2 A1 A0)(R=1,W=0)0xA1为读
I2CWaitAck();
while(ucNum--) //读ucNum个数据
{
*pucBuf++ =I2CReceiveByte(); //将数据读入
if(ucNum)
I2CSendAck();
else
I2CSendNotAck();
}
I2CStop(); //停止
}
MCP4017可编程电阻
写字节时序图
写字节代码
void write_resistor(uint8_t value)
{
I2CStart();
I2CSendByte(0x5E) //0101 1110
I2CWaitAck();
I2CSendByte(value);
I2CWaitAck();
I2CStop();
}
读字节时序图
读字节代码
uint8_t read_resistor(void)
{
uint8_t value;
I2CStart();
I2CSendByte(0x5F) //0101 1111
I2CWaitAck();
value=I2CReceiveByte();
I2CSendNotAck();
I2CStop();
return value;
}
24c02与4017的简单使用main.c代码
#include "main.h"
#include "stdio.h"
#include "string.h"
#include "lcd.h"
#include "i2c.h"
__IO uint32_t uwTick_LCD_State_Pointer;
unsigned char Lcd_Disp_String[21];
unsigned char EEPROM_String_1[3]={0x11,0x22,0x33};
unsigned char EEPROM_String_2[3]={0};
uint8_t RES_K;
void SystemClock_Config(void);
void LCD_Proc(void);
int main(void)
{
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
//**LCD初始化
LCD_Init();
LCD_Clear(White);
LCD_SetBackColor(White);
LCD_SetTextColor(Blue);
//**EEPROM测试
I2CInit();
i2c_24c02_write(EEPROM_String_1, 0 , 3);
HAL_Delay(10);
i2c_24c02_read(EEPROM_String_2, 0 , 3);
//**MCP4017测试
write_resistor(0x0D);
RES_K=read_resistor();
while (1)
{
LCD_Proc();
}
}
void LCD_Proc(void)
{
if(uwTick-uwTick_LCD_State_Pointer<100) return;
uwTick_LCD_State_Pointer=uwTick;
memset(Lcd_Disp_String,0,sizeof(Lcd_Disp_String));
sprintf((char*)Lcd_Disp_String, " EEPROM: %x %x %x",EEPROM_String_2[0],EEPROM_String_2[1],EEPROM_String_2[2]); //显示读入的EEPROM的数
LCD_DisplayStringLine(Line0, Lcd_Disp_String);
memset(Lcd_Disp_String,0,sizeof(Lcd_Disp_String));
sprintf((char*)Lcd_Disp_String, " RES: %x ",RES_K); //显示读入写入的16进制数d
LCD_DisplayStringLine(Line1, Lcd_Disp_String);
memset(Lcd_Disp_String,0,sizeof(Lcd_Disp_String));
sprintf((char*)Lcd_Disp_String, " RES: %6.3f ",0.7874*RES_K); //显示转换后读入的准确阻值
LCD_DisplayStringLine(Line2, Lcd_Disp_String);
}