ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_15天气预报之TCP的GET操作

ESP8266_16天气预报之JSON数据的生成与解析

ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

ESP8266_22基于自身ADC的电压采样

ESP8266_23基于硬件定时器的红外遥控器解码

        事情比较多,停了几天,到目前为止,事情依然很多……

        从第一节到第九节(也就是这一节),说的都是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文件,管脚选择部分如下所示:

#define I2C_MASTER_SDA_MUX PERIPHS_IO_MUX_GPIO2_U
#define I2C_MASTER_SCL_MUX PERIPHS_IO_MUX_MTMS_U
#define I2C_MASTER_SDA_GPIO 2
#define I2C_MASTER_SCL_GPIO 14
#define I2C_MASTER_SDA_FUNC FUNC_GPIO2
#define I2C_MASTER_SCL_FUNC FUNC_GPIO14

        通过这6个宏定义,配置好IIC接口要用的时钟脚和数据脚,我这里想用GPIO12和14,所以改成如下的样子:

#define I2C_MASTER_SDA_MUX PERIPHS_IO_MUX_MTDI_U
#define I2C_MASTER_SCL_MUX PERIPHS_IO_MUX_MTMS_U
#define I2C_MASTER_SDA_GPIO 12
#define I2C_MASTER_SCL_GPIO 14
#define I2C_MASTER_SDA_FUNC FUNC_GPIO12
#define I2C_MASTER_SCL_FUNC FUNC_GPIO14

关于管脚的名字,主要看eagle_soc.h文件。

      3、初始化IIC管脚

      通过下面的函数实现:

     

i2c_master_gpio_init();

      4、开始写数据

      用过24C02的童鞋都知道,IIC的写操作,前后就几步:开始信号、写入设备地址、等待应答、写入存储地址、等待应答、写入数据、结束信号。这里结合SDK中的例程IOT_DEMO中的IIC代码,实现写数据的函数如下:

bool ICACHE_FLASH_ATTR Write_IIC_Data(unsigned char IIC_Data)
{
         uint8 ack;
         i2c_master_start();
         i2c_master_writeByte(0x78);                   //D/C#=0; R/W#=0
         ack = i2c_master_getAck();
 
         if (ack) {
                   os_printf("addr not ack when tx write cmd \n");
                   i2c_master_stop();
                   return false;
         }
         i2c_master_writeByte(0x40);                   //write data
         ack = i2c_master_getAck();
 
         if (ack) {
                   os_printf("addr not ack when tx write cmd \n");
                   i2c_master_stop();
                   return false;
         }
         i2c_master_writeByte(IIC_Data);
         ack = i2c_master_getAck();
 
         if (ack) {
                   os_printf("addr not ack when tx write cmd \n");
                   i2c_master_stop();
                   return false;
         }
         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,我看了半天手册:

esp8266链接oLED屏 esp8266 oled屏教程_ESP8266

         看起来不难,当我翻开我的液晶背面的时候,发现是这样:

esp8266链接oLED屏 esp8266 oled屏教程_esp8266链接oLED屏_02

         所以我只把SPI字符旁边的电阻改到IIC旁边就可以了。

         程序使用卖家提供的代码,做了一下移植。会用IIC的自然就懂了,不懂就说明你还没学好IIC。

         7针的接口,针脚功能如下:

esp8266链接oLED屏 esp8266 oled屏教程_IIC_03

        虽然IIC只用到CLK和SDA两个脚,但是这里还要注意下复位管脚,要给它接一个高电平,否则无法工作。

        程序移植完成,保存、清理、编译、下载一条龙,然后重新上电,效果如下所示:

esp8266链接oLED屏 esp8266 oled屏教程_IIC_04

esp8266链接oLED屏 esp8266 oled屏教程_数据_05

esp8266链接oLED屏 esp8266 oled屏教程_IIC_06

程序里使用了一个软件定时器,每隔3秒刷新一下图片。

链接:https://pan.baidu.com/s/1428honimYQCKM_CVwxDojg

提取码:9p4v