事情比較多,停了幾天,到目前為止,事情依然很多……
從第一節到第九節(也就是這一節),說的都是ESP8266的基本應用,例如GPIO、定時器、中斷、PWM等等。從后面開始,將陸續說一下基于網絡的用法,畢竟這是個聯網的芯片,還是要聯網玩,才更能體現它的特點。但偶爾,我可能還會說一下它的硬件的基本用法,例如ADC、SPI等,看情況吧,時間富裕與否~
好,這一節,主要說一下ESP8266上面的IIC接口。是的,它有SPI接口,也有IIC接口。但IIC接口是使用GPIO模擬的,也就是說,你可以使用8266上的任意兩個GPIO模擬出IIC接口來。同時,每個管腳內部都有上拉電阻,無需外接。
注:ESP8266只能用做IIC主設備,不能用做從設備。
那我們是否還要寫一堆IIC的start函數、stop函數?
不用,官方的SDK已經給我們寫好了整個的IIC庫,只要配置好要用的管腳,直接調用函數即可,例如:
i2c_master_start(void);
i2c_master_stop(void);
i2c_master_writeByte(uint8 wrdata);
如何使用?很簡單,分四步:
1 添加相關源文件和頭文件
把i2c_master.c拷入app下的driver文件夾,把i2c_master.h拷入app下的include下的driver文件夾。
2 選擇要用到的GPIO
打開i2c_master.h文件,管腳選擇部分如下所示:
#defineI2C_MASTER_SDA_MUX PERIPHS_IO_MUX_GPIO2_U
#defineI2C_MASTER_SCL_MUX PERIPHS_IO_MUX_MTMS_U
#defineI2C_MASTER_SDA_GPIO 2
#defineI2C_MASTER_SCL_GPIO 14
#defineI2C_MASTER_SDA_FUNC FUNC_GPIO2
#defineI2C_MASTER_SCL_FUNC FUNC_GPIO14
通過這6個宏定義,配置好IIC接口要用的時鐘腳和數據腳,我這里想用GPIO12和14,所以改成如下的樣子:
#defineI2C_MASTER_SDA_MUX PERIPHS_IO_MUX_MTDI_U
#defineI2C_MASTER_SCL_MUX PERIPHS_IO_MUX_MTMS_U
#defineI2C_MASTER_SDA_GPIO 12
#defineI2C_MASTER_SCL_GPIO 14
#defineI2C_MASTER_SDA_FUNC FUNC_GPIO12
#defineI2C_MASTER_SCL_FUNC FUNC_GPIO14
關于管腳的名字,主要看eagle_soc.h文件。
3 初始化IIC管腳
通過下面的函數實現:
i2c_master_gpio_init();
4 開始寫數據
用過24C02的童鞋都知道,IIC的寫操作,前后就幾步:開始信號、寫入設備地址、等待應答、寫入存儲地址、等待應答、寫入數據、結束信號。這里結合SDK中的例程IOT_DEMO中的IIC代碼,實現寫數據的函數如下:
boolICACHE_FLASH_ATTRWrite_IIC_Data(unsignedcharIIC_Data)
{
uint8 ack;
i2c_master_start();
i2c_master_writeByte(0x78); //D/C#=0; R/W#=0
ack = i2c_master_getAck();
if(ack) {
os_printf("addrnotackwhentxwritecmd ");
i2c_master_stop();
returnfalse;
}
i2c_master_writeByte(0x40); //write data
ack = i2c_master_getAck();
if(ack) {
os_printf("addrnotackwhentxwritecmd ");
i2c_master_stop();
returnfalse;
}
i2c_master_writeByte(IIC_Data);
ack = i2c_master_getAck();
if(ack) {
os_printf("addrnotackwhentxwritecmd ");
i2c_master_stop();
returnfalse;
}
i2c_master_stop();
}
上面代碼中出現的函數,例如i2c_master_start()、i2c_master_writeByte(0x78)、i2c_master_getAck();等,都已經在i2c_master.c中寫好了。換句話說,我們只需要像堆積木一樣,按照特定的順序把這些函數擺下來就行了。
so,是不是很簡單?
如何演示?
這里使用一個0.96寸的,帶有IIC接口的OLED屏幕。這類屏幕按照我見過的接口不同,分兩種:一種是4針的,只能接IIC接口;一種是7針的,既能接IIC,又能接SPI。我手里這個是7針的,出廠默認SPI接口,怎么切換到IIC,我看了半天手冊:
看起來不難,當我翻開我的液晶背面的時候,發現是這樣:
所以我只把SPI字符旁邊的電阻改到IIC旁邊就可以了。
程序使用賣家提供的代碼,做了一下移植。會用IIC的自然就懂了,不懂就說明你還沒學好IIC。
7針的接口,針腳功能如下:
雖然IIC只用到CLK和SDA兩個腳,但是這里還要注意下復位管腳,要給它接一個高電平,否則無法工作。
程序移植完成,保存、清理、編譯、下載一條龍,然后重新上電,效果如下所示:
程序里使用了一個軟件定時器,每隔3秒刷新一下圖片。
-
OLED
+關注
關注
119文章
6203瀏覽量
224329 -
SPI
+關注
關注
17文章
1707瀏覽量
91701 -
函數
+關注
關注
3文章
4333瀏覽量
62708
原文標題:ESP8266_09基于IIC控制的OLED屏幕
文章出處:【微信號:gh_dae0718828df,微信公眾號:gh_dae0718828df】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論