单片机IIC接口读写AT24C02芯片详解

版权申诉
0 下载量 30 浏览量 更新于2024-10-07 收藏 32KB RAR 举报
资源摘要信息: "IIC_iic读取255" 知识点概述: 1. I2C(Inter-Integrated Circuit)总线技术是由飞利浦公司开发的一种串行通信协议,广泛应用于微控制器(单片机)与各种外围设备之间的通信。I2C是一种多主机多从机的总线系统,使用两条线(串行数据线SDA和串行时钟线SCL)来传输数据。 2. AT24C02是一款常见的EEPROM(Electrically Erasable Programmable Read-Only Memory,电可擦可编程只读存储器)芯片,具有I2C接口,常用于存储小容量数据。AT24C02拥有2KB(2048字节)的数据存储空间。 3. 单片机实现I2C总线通信的两种基本操作是读取操作和写入操作。针对AT24C02而言,I2C总线上的主设备(通常是单片机)可以向AT24C02写入数据,也可以从AT24C02读取数据。 4. 写数据到AT24C02的过程包括:发送起始信号,发送设备地址(包含读/写位),发送内存地址,发送数据,发送停止信号。其中设备地址中的最低位决定了通信是读操作(1)还是写操作(0)。 5. 从AT24C02读取数据的过程分为两种模式:随机读取和顺序读取。随机读取前需要先写入想要读取的数据地址,然后发送起始信号,发送设备地址(读操作),接收数据,最后发送停止信号。顺序读取则是在不重新发送内存地址的情况下,连续读取多个字节的数据。 6. 本资源提及的"IIC读取255"可能指向一个特定操作,即从AT24C02中读取255个字节的数据。在实际应用中,由于AT24C02的容量为2KB,因此它能够提供最多255个256字节的数据块,或任意小于255字节的数据块。 7. 在编程实现I2C通信的过程中,需要对单片机的I2C模块进行初始化,设置时钟频率,并编写相应的函数或中断服务例程来处理数据的发送和接收。 8. 与I2C相关的常见问题可能包括设备地址设置错误、时序问题、数据冲突、时钟拉伸等。解决这些问题通常需要仔细检查硬件连接,使用示波器监测通信信号,以及调试程序中的I2C控制代码。 9. 常见的单片机平台,如Arduino、STM32、PIC等,都有提供标准的I2C库,简化了读写AT24C02等I2C设备的代码编写工作。使用这些库可以更方便地进行数据的读写操作,而不需要从头开始编写底层的I2C通信协议。 10. I2C作为一种被广泛使用的技术,相关的技术标准和数据手册非常重要。通过查阅AT24C02的数据手册,可以获得设备的详细规格、命令集、时序图等关键信息,这对于正确编写I2C通信代码至关重要。 总结: 掌握I2C通信技术对于嵌入式系统开发者而言是一项基础且重要的技能。本资源文件名为"IIC_iic读取255",其主要关注点在于如何在单片机平台上通过I2C总线向AT24C02芯片读取或写入数据。正确理解和应用I2C协议,以及对AT24C02的读写操作,对于完成各种微控制器相关项目具有关键意义。通过阅读设备手册、编写适当的通信代码,并通过实践不断调试与优化,可以提升在微控制器平台上利用I2C技术的能力。

帮我改进一这段代码import machine import time from machine import I2C from machine import Pin from machine import sleep class accel(): def __init__(self, i2c, addr=0x68): self.iic = i2c self.addr = addr self.iic.start() self.iic.writeto(self.addr, bytearray([107, 0])) self.iic.stop() def get_raw_values(self): self.iic.start() a = self.iic.readfrom_mem(self.addr, 0x3B, 14) self.iic.stop() return a def get_ints(self): b = self.get_raw_values() c = [] for i in b: c.append(i) return c def bytes_toint(self, firstbyte, secondbyte): if not firstbyte & 0x80: return firstbyte << 8 | secondbyte return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1) def get_values(self): raw_ints = self.get_raw_values() vals = {} vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53 vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9]) vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11]) vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13]) return vals # returned in range of Int16 # -32768 to 32767 def val_test(self): # ONLY FOR TESTING! Also, fast reading sometimes crashes IIC from time import sleep while 1: print(self.get_values()) sleep(0.05) clk = Pin(("clk", 36), Pin.OUT_OD) sda = Pin(("sda", 37), Pin.OUT_OD) i2c = I2C(-1, clk, sda, freq=100000) #initializing the I2C method for ESP32 #i2c = I2C(scl=Pin(5), sda=Pin(4)) #initializing the I2C method for ESP8266 mpu= accel(i2c) while True: mpu.get_values() print(mpu.get_values()) time.sleep(2)

2023-05-30 上传
2023-05-30 上传

一句句的解释void Write_IIC_Byte(unsigned char IIC_Byte) { unsigned char i; unsigned char m,da; da=IIC_Byte; OLED_SCLK_Clr(); for(i=0;i<8;i++) { m=da; // OLED_SCLK_Clr(); m=m&0x80; if(m==0x80) {OLED_SDIN_Set();} else OLED_SDIN_Clr(); da=da<<1; OLED_SCLK_Set(); OLED_SCLK_Clr(); } } /********************************************** // IIC Write Command **********************************************/ void Write_IIC_Command(unsigned char IIC_Command) { IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0 IIC_Wait_Ack(); Write_IIC_Byte(0x00); //write command IIC_Wait_Ack(); Write_IIC_Byte(IIC_Command); IIC_Wait_Ack(); IIC_Stop(); } /********************************************** // IIC Write Data **********************************************/ void Write_IIC_Data(unsigned char IIC_Data) { IIC_Start(); Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 IIC_Wait_Ack(); Write_IIC_Byte(0x40); //write data IIC_Wait_Ack(); Write_IIC_Byte(IIC_Data); IIC_Wait_Ack(); IIC_Stop(); } void OLED_WR_Byte(unsigned dat,unsigned cmd) { if(cmd) { Write_IIC_Data(dat); } else { Write_IIC_Command(dat); } } /******************************************** // fill_Picture ********************************************/ void fill_picture(unsigned char fill_Data) { unsigned char m,n; for(m=0;m<8;m++) { OLED_WR_Byte(0xb0+m,0); //page0-page1 OLED_WR_Byte(0x00,0); //low column start address OLED_WR_Byte(0x10,0); //high column start address for(n=0;n<128;n++) { OLED_WR_Byte(fill_Data,1); } } } /***********************Delay****************************************/ void Delay_50ms(unsigned int Del_50ms) { unsigned int m; for(;Del_50ms>0;Del_50ms--) for(m=6245;m>0;m--); } void Delay_1ms(unsigned int Del_1ms) { unsigned char j; while(Del_1ms--) { for(j=0;j<123;j++); } }

2023-06-13 上传