事情比較多,停了幾天,到目前為止,事情依然很多……
從第一節(jié)到第九節(jié)(也就是這一節(jié)),說(shuō)的都是ESP8266的基本應(yīng)用,例如GPIO、定時(shí)器、中斷、PWM等等。從后面開(kāi)始,將陸續(xù)說(shuō)一下基于網(wǎng)絡(luò)的用法,畢竟這是個(gè)聯(lián)網(wǎng)的芯片,還是要聯(lián)網(wǎng)玩,才更能體現(xiàn)它的特點(diǎn)。但偶爾,我可能還會(huì)說(shuō)一下它的硬件的基本用法,例如ADC、SPI等,看情況吧,時(shí)間富裕與否~
好,這一節(jié),主要說(shuō)一下ESP8266上面的IIC接口。是的,它有SPI接口,也有IIC接口。但I(xiàn)IC接口是使用GPIO模擬的,也就是說(shuō),你可以使用8266上的任意兩個(gè)GPIO模擬出IIC接口來(lái)。同時(shí),每個(gè)管腳內(nèi)部都有上拉電阻,無(wú)需外接。
注:ESP8266只能用做IIC主設(shè)備,不能用做從設(shè)備。
那我們是否還要寫一堆IIC的start函數(shù)、stop函數(shù)?
不用,官方的SDK已經(jīng)給我們寫好了整個(gè)的IIC庫(kù),只要配置好要用的管腳,直接調(diào)用函數(shù)即可,例如:
i2c_master_start(void);
i2c_master_stop(void);
i2c_master_writeByte(uint8 wrdata);
如何使用?很簡(jiǎn)單,分四步:
1 添加相關(guān)源文件和頭文件
把i2c_master.c拷入app下的driver文件夾,把i2c_master.h拷入app下的include下的driver文件夾。
2 選擇要用到的GPIO
打開(kāi)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
通過(guò)這6個(gè)宏定義,配置好IIC接口要用的時(shí)鐘腳和數(shù)據(jù)腳,我這里想用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
關(guān)于管腳的名字,主要看eagle_soc.h文件。
3 初始化IIC管腳
通過(guò)下面的函數(shù)實(shí)現(xiàn):
i2c_master_gpio_init();
4 開(kāi)始寫數(shù)據(jù)
用過(guò)24C02的童鞋都知道,IIC的寫操作,前后就幾步:開(kāi)始信號(hào)、寫入設(shè)備地址、等待應(yīng)答、寫入存儲(chǔ)地址、等待應(yīng)答、寫入數(shù)據(jù)、結(jié)束信號(hào)。這里結(jié)合SDK中的例程IOT_DEMO中的IIC代碼,實(shí)現(xiàn)寫數(shù)據(jù)的函數(shù)如下:
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();
}
上面代碼中出現(xiàn)的函數(shù),例如i2c_master_start()、i2c_master_writeByte(0x78)、i2c_master_getAck();等,都已經(jīng)在i2c_master.c中寫好了。換句話說(shuō),我們只需要像堆積木一樣,按照特定的順序把這些函數(shù)擺下來(lái)就行了。
so,是不是很簡(jiǎn)單?
如何演示?
這里使用一個(gè)0.96寸的,帶有IIC接口的OLED屏幕。這類屏幕按照我見(jiàn)過(guò)的接口不同,分兩種:一種是4針的,只能接IIC接口;一種是7針的,既能接IIC,又能接SPI。我手里這個(gè)是7針的,出廠默認(rèn)SPI接口,怎么切換到IIC,我看了半天手冊(cè):
看起來(lái)不難,當(dāng)我翻開(kāi)我的液晶背面的時(shí)候,發(fā)現(xiàn)是這樣:
所以我只把SPI字符旁邊的電阻改到IIC旁邊就可以了。
程序使用賣家提供的代碼,做了一下移植。會(huì)用IIC的自然就懂了,不懂就說(shuō)明你還沒(méi)學(xué)好IIC。
7針的接口,針腳功能如下:
雖然IIC只用到CLK和SDA兩個(gè)腳,但是這里還要注意下復(fù)位管腳,要給它接一個(gè)高電平,否則無(wú)法工作。
程序移植完成,保存、清理、編譯、下載一條龍,然后重新上電,效果如下所示:
程序里使用了一個(gè)軟件定時(shí)器,每隔3秒刷新一下圖片。
-
OLED
+關(guān)注
關(guān)注
119文章
6183瀏覽量
223859 -
SPI
+關(guān)注
關(guān)注
17文章
1701瀏覽量
91345 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4308瀏覽量
62445
原文標(biāo)題:ESP8266_09基于IIC控制的OLED屏幕
文章出處:【微信號(hào):gh_dae0718828df,微信公眾號(hào):gh_dae0718828df】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論