ESP32的每一个引脚都可以作为I2C协议的SCL,SDA。
这里我以OLED12864为例,SCL->D22. SDA->D21;此处OLED12864为I2C协议,地址为默认的0X78。
ESP32配置I2C有以下几步:
(资料图)
配置初始化结构体 i2c_config_t 。其中包含以下参数:mode选择主机或从机。SDA_IO_NUM/SCL_IO_NUM配置引脚号,我这里配置成D21,D22。sda_pullup_en和scl_pullup_en配置上拉使能,配置master下的clk_speed。这里官方给出最好不要超过1MHZ。最最最要注意的是:clk_flags要配置成0。
安装驱动程序。
主机发起通信,创建命令链接,填充好数据,发送,发送后释放资源。(此处见下图)
此处以OLED12864为例子,编写I2C代码。
注:前面部分的是单个字节传输方式,后面的是先存入数组缓冲区,然后一起传出去。前面的好处,不会丢数据,但是亲测很慢,所以我重新写了驱动。后面的好处:比较迅速,而且暂时测试也没有丢数据的情况,有问题再改BUG吧QAQ。
引入的头文件:
I2C结构体初始化:
I2C写单个字节的命令(写命令)
后面的全部跟正常的OLED初始化流程一样子了,把写命令和写数据函数替换上面的函数名就好了。举个例子:(PS:ESPIDF的编译器好像不能用C99的标准,所以oledfont.h文件要注意,数组采用{{1,2,3},{3,2,1}}这种形式就不会报错了)。
最后,app_main文件:
第一种方式完结,下面是第二种方式的驱动,非常迅速,强烈推荐!!!!
从多字节传输(与之对应的是上面的单字节传输)
OLED的初始化:
OLED的清屏幕
OLED设置坐标:
OLED写单个字节(同样需要引入oledfont.h头文件)
OLED写字符串:
太太太长了~~~~下面将以MPU6050验证I2C从机向主机传输数据,同时还有中断,详细见下一节嘿嘿。