2017-07-26 161 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