写的很叙事
在写下这篇日志的时候,我的心情是复杂的,有如释重负,有恐惧,有对乐鑫的esp32技术文档的撰写人亲切的问候。
如释重负:终于知道为什么esp的IO21和IO22引脚是SDA和SCL的默认接口。
恐惧:恐惧是给C++的,我这几天正好在网上看到别人说,C++语法可以特别特别恶心,常量特别特别难定位。我就在想有多难,有多恶心,CTRL+f很快就定位到了。然后这几天头头在捣鼓传感器,我就在旁边看着,学习学习。记下了当时他接的引脚号,回去自己捣鼓捣鼓,一般来说,接传感器都是要在程序里指定引脚的,我看了看样例代码里也没有指定就很纳闷(我也在头文件里面找,也没找到)。就问头头,为什么=这个不指定引脚啊?头头很随意的说“因为这个是使用I2C的接口,只需要指定传感器的编号(相当于人的手机号,每类传感器都有一个,也可以人为设定),esp32会自动扫描在总线上的设备,不用管接哪个引脚。”那我听了这话,就很感慨,原来现在传感器也这么智能了,就试了试其他的引脚,不行,我大概尝试了几十种组合方式,除了头头的那一种其他的都不行。这个时候也不好意思去问头头 ,感觉很简单的一个东西。于是就上网看看I2C协议,再看看一些实例,哦,原来随便接是说在同一个I2C接口上可以随便接很多个传感器,在这个I2C接口上会自动的扫描不同的传感器设备。好,那我们来看看esp32上的I2C接口是哪个引脚。如果不出所料应该是头头用的IO21,22
emmmmmmmm,我的SDA和SCL呢?可能是这张图不够详细,我们看看官方给的引脚说明
???还是没有,我们去群里找乐鑫的产品经理吧!他应该知道
这...他说的是在idf环境下使用I2C如何定义引脚,我是在arduino1.8的环境下。问到这的时候,我突然害羞了,也就没和他说我和他讨论的不是一个环境下的。我就在想,这个引脚既然能被用作SDA和SCL,那么他肯定在某个头文件里指定了,就算是默认的那也一定要指定,不然怎么能用呢?然后我就从我用的样例代码的头文件里找,大概翻了有5层(重点:层),没找到,根本没有指定特定的引脚充当I2C接口。我突然突发奇想,找了找其他的样例代码,看看那些指定了I2C引脚的代码是怎么调用底层库去使用的。对比了一下应该是通过这句Wire.begin(14,15);但是为什么这个要指定引脚,而另一个Wire.begin();不指定也可以使用呢?我觉得有必要看看begin()究竟是个什么玩意。
这个就是Wire这个实体的类(请允许我用面向对象的思想这样称呼它),这里是给它默认值,我们可以看到sda和scl给赋了-1
这里的begin()方法里面是指定参数的,那为什么Wire.begin();能直接用呢?我也没学过c++,但是不妨碍我大开脑洞,直接这样用而不带参数,应该使用的是上上张图中的默认值就是-1,-1。按照这个思路下去,相当于是Wire。begin(-1,-1);,再看看上图,如果我的参数都是-1,那么我的sda和scl引脚就赋值SDA和SCL,然后我就得去找这个SDA和SCL是什么?这时候我就很激动的按下了CTRL+f。
emmmmmmmmmmm,找不到,不在Wire.h和Wire.cpp的里,那只能说在他的下层了,也就是它们包含的头文件里,然后我就开始颤抖了,这一层套一层的,得翻到死啊!
你们一定猜不到我是怎么找到定义SDA的头文件的。
我在一层一层往上找头文件的时候,搜到一个Arduino.h的文件的时候,突然看见了这个
pins_arduino.h,这个文件从名字上看,pin引脚,然后我就情不自禁地点了进去
很明显,这里就是在arduino1.8环境下esp32开发板的引脚定义文件,之前看到很多不同文件夹下的pins_arduino.h是各个不同类型板子的引脚定义文件,比如我的就是devkitc v4.
我觉得我这次找到这个算是非常幸运的,又一次感觉生活像段子,自己又活成了段子。
最后给予开发者文档的撰写者最为亲切的问候:你狠,这些东西你都不写清楚,文档上就tm写,啊!我们有2个I2C接口,你倒是指出默认的啊!一天天的,飘了你。
---------------------
作者:quangui666
来源:CSDN
原文:https://blog.csdn.net/quangui666/article/details/81483645
版权声明:本文为博主原创文章,转载请附上博文链接!