简介
最近一直在想怎么把上次训练的宝可梦分类模型部署在ESP32-S3上,可以驱动摄像头的时候一直通讯失败,那么多线也真的不知道是不是线的问题。 所以我就换了一个带有摄像头的开发板。这次选择使用的是K10行空板,来自DF-robot。 可是满心欢喜的将程序烧录进去之后发现摄像头的reset线并没有是直接通过S3的IO进行驱动的。 而是通过了一颗XL9535QF24芯片进行驱动的。如下原理图所示。
之前并没有接触过这个IO拓展芯片,所以就昨天晚上详细的研究了下。今天尝试使用ESP-IDF进行驱动。 也正常驱动成功了。借此机会想向大家分享一下根据数据手册驱动它的具体步骤。
这款芯片是I2C转IO拓展的,最多支持控制16个GPIO,输入电压支持在2.3 - 5.5, 然后最高支持400KHZ的I2C通讯速率。
上图为该款元器件的封装方式,我这个K10 行空板上的封装是QFN24.
根据PIN view 得知,其实我们最关心的就是上述的输入,输出和I2C通讯引脚。
根据电气数据,即如果你的VCC输入电压是6V, 那么你的IO作为输出模式的时候,最大的数据电压也是为6v,其输出电压是和VCC相等。
这个芯片一共有8个主要的寄存器,即输入寄存器0x00-0x01 输出寄存器0x02-0x03. 相性翻转寄存器 0x04-0x05, 和配置寄存器 0x06-0x07.通过读取输入寄存器的值即可读取外部的输入。通过配置输出寄存器的值即可使其输出的电压到达VCC,相性翻转寄存器可以将输出的高电平翻转成0.或者将0翻转成1. 配置寄存器则是可以将对应的16个IO PIN 配置成输入和输出。
Input 寄存器的详细说明:即仅仅支持输入,寄存器的值会根据外部电平改变。
输出寄存器说明: 当配置为输出模式的时候PIN的输出会根据I2C通讯的数据进行改变。 比如说数据帧是0XFF,0XFF,那么十六个IO都会被拉高到VCC。
相性反转寄存器: 如果配置为1的话,相性翻转。 0的话不变。
配置寄存器: 如果配置为1 的话, 那么则作为输入模式, 如果配置为0的话。则是输出模式。至此所有的寄存器讲解完毕。
然后我们来看一下官方给我们的通信时序。
上图中首先主机向芯片发送数据(低电平),0x04代表要向相性翻转寄存器写入数据,经过ACK确认之后开始向从机写入OxXX (模拟数据)
这个写的例子比较有代表性。 首先向0x02输出寄存器写如0xXX,但是通过观察可以发现上述的数据帧长度为2, 即16bits 所以一共控制的是16个IO, 当0x02寄存器被写满之后,会自动写0x03.
最后便是单读和连续读。 至此这个原理图的所有部分都已经被解析完了。已经基本上可以被我们应用的,工程师只需要选型的时候参考电气条件即可进行自己场景适配的判断。
总结
上文主要分析了I2C串口拓展芯片Xl9535的电气特性,寄存器,以及通信方式。通过这篇文章,相信如果你有对应的需求的话。应该是可以快速的进行驱动起来。 题外话: 昨天晚上我让AI帮我写这个的驱动程序,虽然我英语还可以,但是我是真的不想看英文的数据手册。但是AI给我的程序真的是驴头不对马嘴。根本用不了,后来昨天晚上后半夜想起来了这个事情根本睡不着,然后又详细的看了下英文的数据手册。最后搞明白了这个芯片该怎么驱动。 有一点真的想吐槽,为什么很多国产芯片都不能也搞一个中文版的数据手册呢? 搞外贸出口的话就再弄个英语的就行了。英语好的慢慢啃下来,不好的还要去翻译,弄不好有些词还翻译错误。
后续:后续的话就是结合电路图将这个芯片驱动起来看看效果。