本帖最后由 xhackerustc 于 2024-5-3 16:38 编辑
据esp32c6 datasheet,芯片有两个i2c控制器,即分别在主系统和低功耗系统各有一个 I2C 控制器。其中主系统中的i2c控制器既然可以做master又可以做slave,FIFO有32字节;低功耗系统中的i2c控制器只能当master使用,fifo缩减为16字节。除此以外是基本一样的,尤其对于软件编程来说区别并不大。此次i2c测评以主系统的i2c控制器为对象。
笔者惯例芯片/板子i2c bring up并不是一上来就写代码的,而是利用i2c-tools这套工具集先测试基本读写没问题后才写成代码。巧的是esp-idf也有类似工具(由此可以看出esp的软件生态确实做得不错)。
i2c_tools的配置
examples/peripherals/i2c/i2c_tools
idf.py set-target esp32c6
idf.py menuconfig
由FireBeetle 2板子原理图可知GPIO19和GPIO20可分别用作SDA和SCL引脚,不过也不是非要用GPIO19和GPIO20,因为对于像i2c这样的慢速设备,esp32c6可利用gpio交换矩阵把i2c的信号通过任意gpio引出,但是板子原理图相当于做了一次信号引脚分配,且引脚丝印印好就跟着用不费脑。笔者的配置如下图所示(注:i2c_tools也支持运行时通过i2cconfig命令改SDA和SCL引脚)
笔者还同时把store command history in flash禁用了没啥意义。
i2c_tools编译&烧录
idf.py build
esptool.py -p /dev/ttyACM0 -b 460800 --before default_reset --after hard_reset --chip esp32c6 --no-stub write_flash --flash_mode qio --flash_size 4MB --flash_freq 80m 0x10000 build/i2c_tools.bin
i2c_tools初尝试
测试用的是max30102的模块,用杜邦线把它VIN/SDA/SCL/GND引脚和板子对应引脚接好后,板子上电。
发现i2c_tools是个命令行,“help”命令把所有支持的命令参数都显示出来了
检测下看看能否探测到slave设备:
Nice在0x57探测到了一个i2c slave设备,0x57也确实是这个max30102模组的芯片地址。据max30102 datasheet,0xfe和0xff两个寄存器分别对应REV_ID和PARTID,是只读寄存器,读取看看
i2c slave读取成功!现在可以测试写了,根据max30102 datasheet,enable温度sensor再读取:
以上数据显示温度大概是0x17+0x0d*0.0625 = 23.8125摄氏度