• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# I2C通信介绍<a name="ZH-CN_TOPIC_0000001130176841"></a>
2| API名称                                                      | 说明                          |
3| ------------------------------------------------------------ | ----------------------------- |
4| IoTI2cInit(unsigned int id, unsigned int baudrate);         | 用指定的波特速率初始化I2C设备 |
5| IoTI2cDeinit(unsigned int id);                               | 取消初始化I2C设备             |
6| IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen); | 将数据写入I2C设备             |
7| IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen); | 从I2C设备中读取数据           |
8| IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate);   | 设置I2C设备的波特率           |
9
10
11-    例如在 Hi3861 上外接一个 OLED 屏,查阅资料知道,OLED 屏为 I2C 通讯方式,Hi3861 发送命令驱动 OLED 屏显示。
12-    GPIO 初始化及引脚功能复用 为 I2C 模式。Hi3861 的 SOC 上一共有两路 I2C,分别是 I2C0 和 I2C1。Hi3861 上的 GPIO 引脚能复用为 I2C0 的有两组,分别为 GPIO9(I2C0_SCL)、 GPIO10(I2C0_SDA)和 GPIO13(I2C0_SDA)、GPIO14(I2C0_SCL);GPIO 引脚能复用为 I2C1 的有 两组,分别为 GPIO0(I2C1_SDA)、GPIO1(I2C1_SCL)。本案例使用 GPIO13(I2C0_SDA)、 GPIO14(I2C0_SCL)这一组作为 OLED 屏和 Hi3861 进行 I2C 通信 。本案例复用GPIO13,GPIO14。
13```
14IoTGpioInit(13);
15IoSetFunc(13, 6); /* gpio13复用I2C0_SDA */
16IoTGpioInit(14); /* 初始化gpio14 */
17IoSetFunc(14, 6); /* gpio14复用I2C0_SCL */
18```
19
20-   I2C 初始化配置,包括通道选择:0,设置初始化波特率:OLED_I2C_BAUDRATE(400kbps),Hi3861 最高波特率为400kbps。
21    ```
22    IoTI2cInit(0, OLED_I2C_BAUDRATE);
23    ```
24
25-   设置 OLED 屏的初始化,查阅 OLED 屏的 datasheet 可知 OLED 屏的初始化命令,Hi3861 通过 I2C 将 OLED 屏初始化命令发送给 OLED 屏。
26    ```
27    static const uint8_t initCmds[] = {
28        0xAE, // --display off
29        0x00, // ---set low column address
30        0x10, // ---set high column address
31        0x40, // --set start line address
32        0xB0, // --set page address
33        0x81, // contract control
34        0xFF, // --128
35        0xA1, // set segment remap
36        0xA6, // --normal / reverse
37        0xA8, // --set multiplex ratio(1 to 64)
38        0x3F, // --1/32 duty
39        0xC8, // Com scan direction
40        0xD3, // -set display offset
41        0x00,
42        0xD5, // set osc division
43        0x80,
44        0xD8, // set area color mode off
45        0x05,
46        0xD9, // Set Pre-Charge Period
47        0xF1,
48        0xDA, // set com pin configuration
49        0x12,
50        0xDB, // set Vcomh
51        0x30,
52        0x8D, // set charge pump enable
53        0x14,
54        0xAF, // --turn on oled panel
55    };
56    ```
57
58-   Hi3861 通过 I2C 发送显示信息给 OLED 屏,OLED 屏收到后显示在屏上。
59    ```
60    OledFillScreen(); /* 全屏填充 */
61    OledShowString(20, 3, "Hello  World", 1); /* 屏幕第20列3行显示1行 */
62    ```
63
64-   上面步骤完成后还无法使用PWM,需要修改.device/soc/hisilicon/hi3861v100/sdk_liteos/build/config/usr_config.mk文件。在这个配置文件中打开PWM驱动宏。搜索字段CONFIG_I2C_SUPPORT ,并打开I2C。配置如下:
65    ```
66    # CONFIG_I2C_SUPPORT is not set
67    CONFIG_I2C_SUPPORT=y
68    ```
69
70-   创建一个任务线程,单独处理OLED显示任务,串口通信的具体任务实现。
71    ```
72    static void OLEDDemo(void)
73    {
74        osThreadAttr_t attr;
75        attr.name = "UartDemoTask";
76        attr.attr_bits = 0U;
77        attr.cb_mem = NULL;
78        attr.cb_size = 0U;
79        attr.stack_mem = NULL;
80        attr.stack_size = 4096; /* 任务大小4096 */
81        attr.priority = osPriorityNormal;
82        if (osThreadNew(OLEDDemoTask, NULL, &attr) == NULL) {
83            printf("[OledDemo] Failed to create OLEDDemoTask!\n");
84        }
85    }
86    SYS_RUN(OLEDDemo);
87    ```
88