@@ -394,3 +394,79 @@ void requestEvent()
394394}
395395
396396```
397+
398+ ## 进阶用法
399+
400+ 默认情况下,只有一个 Wire 实例可用,它使用了默认的I2C引脚,具体可以参考开发板的手册。要使用第二个 I2C 端口,应在代码中在 ` setup() ` 函数之前声明 ` TwoWire ` 对象:
401+
402+ ``` cpp
403+ #include < Wire.h>
404+
405+ TwoWire Wire2 (SDA_PIN, SCL_PIN);
406+
407+ void setup() {
408+ Wire2.begin();
409+ }
410+
411+ void loop() {
412+ Wire2.beginTransmission(0x71);
413+ Wire2.write('v');
414+ Wire2.endTransmission();
415+ delay(1000);
416+ }
417+ ```
418+
419+ ### 默认 I2C 引脚
420+
421+ 默认 I2C 接口引脚在 `PeripheralPins.c` 文件中配置。
422+
423+ 示例(对于文件 PeripheralPins.c 中的 `AIR001_DEV`):
424+
425+ ```c
426+ #ifdef HAL_I2C_MODULE_ENABLED
427+ WEAK const PinMap PinMap_I2C_SDA[] = {
428+ {PA_2, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
429+ {PA_7, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
430+ {PA_9, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
431+ {PA_10, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C)},
432+ {PA_12, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C)},
433+ {PB_7, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C)},
434+ {PB_8, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
435+ {PF_0, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
436+ {NC, NP, 0}
437+ };
438+ #endif
439+
440+ #ifdef HAL_I2C_MODULE_ENABLED
441+ WEAK const PinMap PinMap_I2C_SCL[] = {
442+ {PA_3, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
443+ {PA_8, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
444+ {PA_9, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C)},
445+ {PA_10, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
446+ {PA_11, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C)},
447+ {PB_6, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C)},
448+ {PB_8, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF6_I2C)},
449+ {PF_1, I2C, AIR_PIN_DATA(AIR_MODE_AF_OD, GPIO_NOPULL, GPIO_AF12_I2C)},
450+ {NC, NP, 0}
451+ };
452+ #endif
453+ ```
454+
455+ ### 重新定义I2C引脚
456+
457+ 因为它们被定义为 WEAK,所以您可以在代码文件中重新定义它们,而不是更改 ` PeripheralPins.c ` 文件中的值。您还可以使用 ` AIR_PIN_DATA() ` 的第二个参数启用/禁用内部上拉电阻。
458+
459+ ### I2C 缓冲区管理
460+
461+ 默认情况下,I2C 缓冲区都在 Arduino API 上对齐:32 字节。
462+
463+ 但是我们最多可以传输 255 个字节:
464+
465+ - 在主模式下:RX 和 TX 缓冲区将在需要时自动增长,彼此独立,并且独立于其他 I2C 实例。
466+
467+ 从应用程序的角度来看无事可做。
468+
469+ - 在从模式下:借助开关 I2C_TXRX_BUFFER_SIZE ,可以使用 hal_conf_extra.h 或 build_opt.h (在编译时)静态重新定义 RX 和 TX 缓冲区大小
470+
471+ 所有 I2C 实例都受此编译开关更改的影响。
472+
0 commit comments