IIC总线编程与调试教程

版权申诉
0 下载量 87 浏览量 更新于2024-10-04 收藏 59KB RAR 举报
资源摘要信息:"IIC总线源代码介绍及调试程序" 1. IIC总线概述 IIC总线,全称为Inter-Integrated Circuit,是一种在微电子设备之间进行串行通信的多主机总线系统。IIC总线由Philips公司(现在的NXP)于1980年代早期提出并推广。因其接口简单、连线少、控制方便、可靠性高等优点,在嵌入式系统中得到了广泛的应用,尤其适合于低速设备之间的数据交换。IIC总线支持多主机系统,可以实现一个主设备与多个从设备之间的通信。 2. IIC总线特性 - 串行通信:数据线SDA和时钟线SCL都是双向线,通过这两个线完成数据的发送和接收。 - 多主机系统:支持多主机同时使用总线,通过仲裁机制确定哪个设备有权控制总线。 - 地址识别:每个从设备拥有一个唯一的地址,主设备通过地址来选择通信的从设备。 - 速率较低:通信速率一般为100Kbps或400Kbps,某些情况下也可以达到1Mbps或3.4Mbps。 - 接口简单:IIC总线只需要两根线即可实现全双工通信,硬件连接简单。 3. IIC总线工作原理 IIC总线工作在主从模式下,包括主机(Master)和从机(Slave)。通信过程通常由主机启动和终止,包括以下步骤: - 启动条件:当SCL为高电平时,SDA线从高电平向低电平跳变,表示开始一次通信。 - 地址传输:主机首先发送一个设备地址和一个方向位(R/W),通知从设备数据传输的方向。 - 数据传输:从设备响应后,双方以8位数据加应答位的形式进行数据交换。 - 应答信号:数据每次传输8位后,接收设备需要发送应答信号(ACK)或非应答信号(NACK)。 - 停止条件:当SCL为高电平时,SDA线从低电平向高电平跳变,表示结束一次通信。 4. IIC总线编程 IIC总线的编程包括初始化、读写操作以及异常处理等。编程时,需要根据具体的硬件平台和IIC总线的协议规范进行操作。常见的IIC总线编程语言有C语言和汇编语言。 初始化包括配置IIC总线接口的参数,如总线速率、总线地址等。 读写操作是通过发送IIC总线起始信号、地址信号、读/写信号、应答信号以及数据信号等,完成数据的发送或接收。 异常处理是在通信过程中对可能出现的错误进行检测并处理,如NACK应答、总线冲突等问题。 5. 源码调试好的程序 调试好的程序是指经过测试没有发现错误或者已经修复所有错误的程序。在IIC总线编程中,源码调试是指开发者通过调试工具,对程序进行单步执行、断点、变量观察等操作,以检查程序的逻辑流程和数据状态,确保程序按照预期正确执行。调试过程中,开发者可以观察到IIC总线上的数据传输情况,检查设备地址、数据格式、时序控制等是否符合IIC协议的规定。 6. 常见问题及解决方案 - 总线冲突:当两个主机同时尝试使用总线时,会导致冲突。解决方法是设置优先级或使用主机仲裁机制。 - 地址冲突:多个设备拥有相同的地址时,会导致通信错误。解决方法是重新分配设备地址或修改设备固件。 - 通信速率问题:在高速设备之间通信时,如果速率设置不当可能会导致通信失败。解决方法是调整总线速率,确保设备兼容。 - 时序问题:IIC总线通信对时序要求严格,时序不准确会导致数据错误。解决方法是检查和调整时序参数,确保符合协议要求。 7. 常用的IIC总线设备 在嵌入式系统中,常用IIC总线设备包括但不限于: - 存储设备:如EEPROM、Flash、IIC接口的ADC、DAC等。 - 传感器:如温度传感器、压力传感器、加速度计等。 - 显示设备:如LCD显示模块、LED驱动器等。 - 实时时钟模块:RTC模块通常通过IIC总线进行时间数据的读写。 8. IIC总线的应用场景 IIC总线广泛应用于消费电子、计算机周边设备、工业自动化等领域。例如,智能手机中的陀螺仪、加速度计等传感器的接口,电脑主板上的时钟芯片、风扇控制器,以及智能家电中的温度控制器等都可能使用IIC总线进行数据通信。
2023-05-30 上传

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

一句句的解释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 上传

解释这段代码: always@(posedge sys_clk ) begin data_reg0 <= data_reg0_z; data_reg1 <= data_reg1_z; data_reg2 <= data_reg2_z; data_reg3 <= data_reg3_z; data_reg4 <= data_reg4_z; data_reg5 <= data_reg5_z; data_reg6 <= data_reg6_z; end i2c_device_a i2c_device_a( .i2c_sda (f_iic_sda), // .i2c_scl (f_iic_scl), // .sys_rst (sys_rst), .sys_clk (sys_clk), .data_out0 (data_out0), .data_out1 (data_out1), .data_out2 (data_out2), .data_out3 (data_out3), .data_out4 (data_out4), .data_out5 (data_out5), .data_out6 (data_out6), .data_out7 (data_out7), .data_out8 (data_out8), .data_out9 (data_out9), .data_out10 (data_out10), .data_out11 (data_out11), .data_out12 (data_out12), .data_out13 (data_out13), .data_out14 (data_out14), .data_out15 (data_out15), .data_out16 (data_out16), .data_out17 (data_out17), .data_out18 (data_out18), .data_out19 (data_out19), .data_out20 (data_out20), .data_out21 (data_out21), .data_out22 (data_out22), .data_out23 (data_out23), .data_out24 (data_out24), .data_out25 (data_out25), .data_in0 (data_out0), .data_in1 (data_out1), .data_in2 (data_out2), .data_in3 (data_out3), .data_in4 (data_out4), .data_in5 (data_out5), .data_in6 (data_out6), .data_in7 (data_out7), .data_in8 (data_out8), .data_in9 (data_out9), .data_in10 (data_out10), .data_in11 (data_out11), .data_in12 (data_out12), .data_in13 (data_out13), .data_in14 (data_out14), .data_in15 (data_out15), .data_in16 (data_out16), .data_in17 (data_out17), .data_in18 (data_out18), .data_in19 (data_out19), .data_in20 (data_out20), .data_in21 (data_out21), .data_in22 (data_out22), .data_in23 (data_out23), .data_in24 (VERSION0_Y[15:8]), .data_in25 (VERSION0_Y[7:0]), .data_in26 (VERSION0_M_D[15:8]), .data_in27 (VERSION0_M_D[7:0]), .data_in28 (VERSION0_V[15:8]), .data_in29 (VERSION0_V[7:0]) ); wire [7:0] data_out0; wire [7:0] data_out1; wire [7:0] data_out2; wire [7:0] data_out3; wire [7:0] data_out4; wire [7:0] data_out5; wire [7:0] data_out6; wire

2023-05-30 上传