2017-07-26 129 views
2

我访问了一些链接并查找了I2C编程的一些示例程序。我想写我自己的I2C协议代码。假设DS1307 RTC和LCD连接到8051.我正在使用Keil软件编写一个C程序。这是非常难写I2C的整个程序我,所以我试着在小零件打破程序:I2C协议如何工作

  • 模块1:定义和设置用于LCD和DS1307 RTC
  • 模块2引脚:用于编写C代码DS1307(使功能DS1307例如读,写)
  • 模块3:写LCD C代码(数据,命令初始化等)
  • 模块4:主函数

我明白模块1,但我正在寻求帮助来理解模块e 2.所以我再次想要在小部件中打破模块2。

如何突破模块2中,为了便于理解小部件?模块2中应该有多少个函数?

+2

8051本身不包括一个I2C控制器。有许多器件具有8051以及其他片上器件,例如,一个I2C控制器。你的情况如何?如果你的芯片没有内置的I2C控制器,你必须使用本地8051端口进行bit-bang。尝试搜索“8051位bang I2C”之类的东西。它会给你多个代码示例,例如https://www.8051projects.net/wiki/I2C_Implementation_on_8051如果您的芯片包含一个I2C控制器,数据表将告诉您如何使用它。 – 4386427

回答

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