首页 > 其他分享 >iic

iic

时间:2023-12-09 18:34:01浏览次数:28  
标签:SCL temp 主机 SDA iic I2C I2CDelay

主机主动释放I2C_SDA,为读ack做准备。为什么主机要释放SDA线呢?

因为主机和从机将的SDA线连接是通过&,所以从机在操作总线时,主机要释放总线。(从机在什么时候需要操作总线?1.从机应答2.主机读数据(从机写))

如主机不释放总线的话,那么SDA线上可能是0,也可能是1,假设现在SDA线上是0,那么不论从机是想拉高或拉低SDA线,SDA线都只会为0,因为两器件间是线与(&)的关系。所以在从机要操作总线时,主机要将SDA线释放(即拉高),这样从机就可以根据需要来拉高和拉低SDA线

 1 void i2cstart()//SCL在高电平期间,SDA由高变低表示起始信号
 2 {
 3     I2C_SCL = 1;
 4     I2C_SDA = 1;//空闲时,scl和sda为1
 5     
 6     I2CDelay();//I2C_SCL延时4.7us,然后拉低I2C_SDA,产生起始信号
 7     I2C_SDA = 0;
 8     I2CDelay();//I2C_SDA拉低后,要保持4.7us
 9     
10     I2C_SCL = 0;//拉低I2C_SCL,为下一次做准备
11 }
12 
13 void i2cWriteByte(unsigned char dat)//这个函数是紧跟在start函数的,所以I2C_SCL为0,即I2C_SDA允许变化
14 {
15     unsigned char temp;
16     for(temp = 0x80; temp != 0; temp++){//操作dat的高位
17         if((temp & dat) == 0)
18             I2C_SDA = 0;
19         else
20             I2C_SDA = 1;
21         I2CDelay();    //I2C_SCL为低电平期间,I2C_SDA允许变化
22         
23         I2C_SCL = 1;//主机将I2C_SCL拉高,并保持4.7us,告诉从机从I2C_SDA上读数据
24         I2CDelay();    
25         
26         I2C_SCL = 0;//拉低I2C_SCL,为下一次做准备
27     }
28 }
29 
30 unsigned char i2cReadByte()//这个函数紧跟在读应答函数后,所以I2C_SCL为0,即I2C_SDA允许变化
31 {
32     unsigned char dat = 0,temp;
33     I2C_SDA = 1;//主机主动释放I2C_SDA,让从机往SDA线上放数据。为什么要释放呢?如上
34     for(temp = 0x80; temp != 0; temp++){//操作dat的高位
35         I2CDelay();    //i2cRecAck函数将I2C_SCL拉低,这里是保持I2C_SCL为为4.7us,是叫从机往SDA线上放数据
36         I2C_SCL = 1;
37         if(I2C_SDA == 1)
38             dat |=temp;
39         else
40             dat &= ~temp;
41         I2CDelay();    //SCL高电平期间,主机就能将SDA线上的数据放到dat变量中
42         I2C_SCL = 0;//拉低I2C_SCL,为下一次做准备
43     }
44 }
45 
46 void sendAck(bit ack)//这个函数紧跟在i2cReadByte函数后,所以I2C_SCL为0,即I2C_SDA允许变化
47 {
48     I2C_SDA = ack;//在SCL低电平期间,SDA允许变化
49     I2CDelay();
50     
51     I2C_SCL = 1;//主机将SCL拉高,并在高电平期间将主机将ack发给从机
52     I2CDelay();
53     I2C_SCL = 0;//拉低I2C_SCL,为下一次做准备
54 }
55 
56 unsigned char i2cRecAck()
57 {
58     unsigned char ack;
59     I2C_SDA = 1;//主机主动释放I2C_SDA,为读ack做准备。为什么要释放呢?等下解答
60     I2CDelay();//这个函数紧跟在write函数,所以最后I2C_SCL = 0;,这个是让I2C_SCL保持4.7us
61     
62     I2C_SCL = 1;//拉高I2C_SCL,看SDA线上是高还是低(即是否应答)
63     ack = I2C_SDA;
64     I2CDelay();
65     
66     I2C_SCL = 0;//拉低I2C_SCL,为下一次做准备
67     return ack;
68 }
69 
70 void i2cStop()//SCL在高电平期间,SDA有低电平变为高电平为停止信号
71 {
72     I2C_SCL = 0;
73     I2C_SDA = 0;
74     I2CDelay();
75     
76     I2C_SCL = 1;//I2C_SCL拉高4.7us
77     I2CDelay();
78     I2C_SDA = 1;//再将I2C_SDA拉高,并且保持4.7us
79     I2CDelay();
80 }

 

标签:SCL,temp,主机,SDA,iic,I2C,I2CDelay
From: https://www.cnblogs.com/zj-studyrecoding/p/17891297.html

相关文章

  • 0.91寸OLED液晶屏显示模块 IIC 12832液晶屏 兼容3.3v-5V
    【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)实验一百三十六:0.91寸OLED液晶屏显示模块IIC12832液晶屏兼容3.3v-5V项目二十三:黄色屏声音可视化器实验接线:max9814接A0oled模块ArdunioUnoGND---------GND接地线VCC---------5V接电源......
  • USB(2.0 / Type-C) to MPSSE(JTAG / SPI / IIC) / UART / FIFO: FTDI 的FT4232H配成SP
    Ti60Demo板FT4232H串口使用易灵思FPGA技术交流2022-04-1508:43Ti60F225demo板使用的是FT4232H,有4个通道A,B,C和D。其中A通道用于SPI接口,可以是AS也可以是PS。通道B用于JTAG,通道C连接了UART,通道D连接了FX3。A,B,C和D四个通道分别对应Zadig中的TitraniumTi60F225develo......
  • Electrical(Hardware) Protocols: FIFO / JTAG / SPI / IIC / IIS / UART / SWD / ICS
    Electrical(Hardware)Protocols:JTAG(JointTestActionGroup),JTAGisactuallyaprotocoloverSPI.5pins/connections(GND,TMS,TCK,TDI,TDO),Outputtype:Maximumvoltage:5.5volts(5voltsafe),3.3voltnormal,oropencollector(pull-upresistorsre......
  • CH32X035 模拟IIC驱动EEPROM
    在CH32X035的GPIO模式配置选项中,并没有开漏输出的配置模式,如下图。在使用GPIO模拟IIC时,可在初始化时将其配置成推挽输出模式,在需要时切换对应的输入输出模式,以下是CH32X035GPIO模拟IIC的实现例程。 具体程序代码如下:iic.h文件:#ifndef__IIC_H#define__IIC_H#include"c......
  • CH32X035 模拟IIC驱动EEPROM
    来源:https://www.cnblogs.com/liaigu/p/17784027.html在CH32X035的GPIO模式配置选项中,并没有开漏输出的配置模式,如下图。在使用GPIO模拟IIC时,可在初始化时将其配置成推挽输出模式,在需要时切换对应的输入输出模式,以下是CH32X035GPIO模拟IIC的实现例程。 具体程序代码如下:iic.......
  • 软件iic返回值总是0xff
    I2C读取总是0xFF,但是ACK是正常的解决方法_iic读数据都为0xff_程序员圈儿的博客-CSDN博客 I2C读取总是0xFF,但是ACK是正常的解决方法-码上快乐(codeprj.com)......
  • 09_学会单片机STM32的IIC通信
    学会单片机STM32的IIC通信开发过程中如何选择什么样的通讯接口通讯接口如何使用为何需要I2C用途12C只有两条线一条串行数据线:SDA,一条是时钟线SCL,使用SCL,SDA这两根信号线就实现了设备之间的数据交互,它方便了工程师的布线。因此,I2C总线被非常广泛地应用在EEPROM,实......
  • iic和spi简记
    IIC通信协议两线式串行总线,多用于主控制器和从器件间的主从通信,在小数据量场合使用,有传输距离短,任意时刻只能有一个主机等特性。  SDA(Serialdata)数据线,D代表Data也就是数据,SendData也就是用来传输数据的SCL(Serialclockline)时钟线,C代表Clock也就是时钟也就是......
  • 详解UART、USART、SPI、IIC、CAN,以太网等通信协议
    目录详解UART、USART、SPI、IIC、CAN,以太网等通信协议基本通信知识通信协议分类串行和并行同步和异步全双工和半双工波特率UARTUSARTSPIIICCAN以太网详解UART、USART、SPI、IIC、CAN,以太网等通信协议基本通信知识通信协议分类串行和并行串行通信是指利用一条传输线将数据一......
  • 关于硬件IIC卡死在各事件的解决方法
    1、关于硬件IIC卡死在EV5事件解决方法主机使用I2C_GenerateSTART()函数发送START条件后,主机必须等待事件5(启动条件已在I2C总线上正确释放),关于事件5,主要是对是否发送起始位(STAR1寄存器位0)、主从模式以及总线是忙还是空闲(STAR2寄存器位0、位1)进行判断,当这3位均为1,即已发送起始位、主......