I2C协议如何工作

时间:2017-07-26 04:39:46

标签: c i2c 8051

我访问了一些链接并查找了一些用于I2C编程的示例程序。我想编写自己的I2C协议代码。假设DS1307 RTC和LCD连接到8051.我使用Keil软件编写C程序。为我编写完整的I2C程序非常困难,所以我尝试在一小部分中打破程序:

  • 模块1:为LCD和DS1307 RTC定义和设置引脚
  • 模块2:为DS1307编写C代码(为DS1307创建函数,如读,写)
  • 模块3:为LCD写入C代码(数据,命令初始化等)
  • 第4单元:主要功能

我理解模块1,但我正在寻求帮助以理解模块2.所以我再次希望将模块2分成小部分。

如何将模块2分成小部分以便于理解? module2中应该有多少个函数?

1 个答案:

答案 0 :(得分:0)

模块2本质上是使用8051端口的位冲击的I2C驱动程序。 I2C协议遵循一个序列。它由启动序列启动,并由停止序列停止。您可以拥有不同的功能。通信由主设备启动,每个从设备都有一个地址。所以在module2中,你将编写以下所有函数。

例如,I2读取序列将遵循

I2C_Start();  // set I2C start sequence
I2C_Send(slave_address|1); Send I2C slave address in read mode
I2C_read_ACK(); //master will know slave got data 
while(number_of bytes){
I2C_Read();
I2C_send_ACK();
number_of bytes--;
}
I2C_NAK();    //slave need to know so it will not prepare next data.
I2C_Stop();   //stop communication

再次写入奴隶将具有以下步骤

I2C_Start();  // set I2C start sequence
I2C_Send(slave_address); Send I2C slave address in write mode
I2C_read_ACK(); //master will know slave got data 
while(number_of bytes){
I2C_Write();
I2C_read_ACK(); //master will know slave got data 
number_of bytes--;
}
I2C_Stop(); //stop communication

我也看到了司机 https://circuitdigest.com/microcontroller-projects/digital-clock-using-8051-microcontroller

官方I2C协议就在这里

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwici4Ocn6jVAhUIwlQKHV_zAJ8QFggoMAA&url=https%3A%2F%2Fwww.nxp.com%2Fdocuments%2Fuser_manual%2FUM10204.pdf&usg=AFQjCNHgNi6wOD4MjIDsnT0DXTYLS_-gPQ