IIC编程详解与交流指南

版权申诉
0 下载量 68 浏览量 更新于2024-10-06 收藏 6KB RAR 举报
资源摘要信息:"IIC编程" IIC(Inter-Integrated Circuit)即“内部集成电路”总线,是一种多主机的串行通信总线,主要用于连接低速外围设备到处理器或微控制器的主板和其他嵌入式系统中。它由菲利普半导体公司在1980年代提出,现在被广泛应用于嵌入式电子系统中,因为它简单、有效、成本低廉,并且能够支持多设备同时接入。 IIC总线的核心特点如下: 1. 多主机系统:允许多个主机同时工作在同一总线上。 2. 双线通信:只由两条线构成——串行数据线(SDA)和串行时钟线(SCL)。 3. 低速率传输:设计目标是传输速率在100kbps到400kbps之间。 4. 地址可寻址:每个接入总线的设备都有一个唯一的地址。 5. 连接方式:支持多设备同时连接,可以实现一主多从或者多主多从的网络结构。 6. 开放式收集:总线可以被任意一个连接在总线上的设备驱动。 IIC的通信过程一般包括:起始条件、地址传输、数据传输、应答信号、停止条件等几个部分。 编程IIC接口,我们需要理解其协议和操作原理,主要涉及以下步骤和知识点: - **初始化IIC设备**:包括设置IIC速率、配置IIC模块为主机模式或从机模式。 - **发送起始条件**:IIC通信的开始标志,由主机发起。 - **发送设备地址**:主机向从机发送其地址,确保通信的正确性。 - **读写操作**:根据控制位决定是读取数据还是写入数据到从机。 - **发送应答信号**:主机或从机在数据接收后发送应答信号。 - **发送停止条件**:IIC通信结束的标志,由主机发出。 在编程实践中,开发者通常需要阅读和理解微控制器(MCU)或处理器的数据手册,其中包含了IIC接口的硬件说明和寄存器映射。同时,根据不同的硬件平台,IIC接口的编程接口和库函数也有所差异,因此需要参考特定硬件平台的开发手册或参考示例代码。 例如,对于使用具有IIC接口的ARM Cortex-M系列的MCU来说,通常会使用相应的库函数如I2C_Init(), I2C_Start(), I2C_Stop(), I2C_SendData(), I2C_ReceiveData()等进行编程。而STM32系列微控制器则提供了HAL库或LL库来简化IIC接口的使用。 此外,IIC的电气特性也非常关键,其中包含上拉电阻的使用,因为IIC总线的SDA和SCL都必须连接到正电源电压,通过上拉电阻实现逻辑“1”的状态。如果总线上的设备太多,或者运行速率太快,可能需要调整上拉电阻的大小以满足电气要求。 文档压缩包中的资源信息显示有两个文件:***.txt和IIC.doc。其中,“***.txt”很可能是某个网络地址的文本文件,而“IIC.doc”则暗示了一个关于IIC的详细文档资料。如果想更深入理解IIC总线的编程方法,建议打开“IIC.doc”文件进行详细阅读,这个文件很可能包含了具体的编程案例、接口的初始化代码、数据传输的实现方法以及如何处理IIC通信过程中的各种情况等详细内容。 在此过程中,还需要关注IIC总线的常见问题和故障排除,例如: - 确保SDA和SCL线路没有电气短路或断路。 - 检查设备地址是否正确。 - 确认IIC速率是否在设备允许的范围内。 - 使用示波器或逻辑分析仪检测通信波形是否正确。 总的来说,IIC通信是一种成熟稳定的串行通信技术,对于嵌入式系统开发人员来说,掌握IIC接口的编程技术是非常重要的。通过阅读相关文档、理解硬件手册以及参考实际开发案例,开发者可以有效地进行IIC接口的硬件编程和软件开发工作。

帮我改进一这段代码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 上传
107 浏览量

一句句的解释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++); } }

212 浏览量