Skip to content

Commit abd330a

Browse files
committed
add: 添加I2C的进阶用法
1 parent 7fca49f commit abd330a

1 file changed

Lines changed: 76 additions & 0 deletions

File tree

docs/library/i2c.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)