README.md
1# BearPi-HM_Nano开发板基础外设开发——I2C控制NFC芯片
2本示例将演示如何在BearPi-HM_Nano开发板上使用I2C协议向NFC芯片写入数据。
3
4
5## I2C API分析
6本示例主要使用了以下API完成I2C采样的功能。
7### IoTI2cInit()
8```c
9unsigned int IoTI2cInit(unsigned int id, unsigned int baudrate);
10```
11 **描述:**
12
13用指定的频率初始化I2C设备。
14
15
16**参数:**
17
18|参数名|描述|
19|:--|:------|
20| id | I2C设备ID。 |
21| baudrate |I2C频率。|
22
23## IoTI2cSetBaudrate()
24```c
25unsigned int IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate);
26```
27 **描述:**
28
29为I2C设备设置频率。
30
31**参数:**
32
33|参数名|描述|
34|:--|:------|
35| id | I2C设备ID。 |
36| baudrate |I2C频率。|
37
38## IoTI2cWrite()
39```c
40unsigned int IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen);
41
42```
43 **描述:**
44
45将数据写入I2C设备。
46
47
48**参数:**
49
50|参数名|描述|
51|:--|:------|
52| id | I2C设备ID。 |
53| deviceAddr |I2C设备地址。|
54| data |表示待写入的数据。|
55| dataLen |表示待写入的数据长度。|
56
57## IoTI2cRead()
58```c
59unsigned int IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen);
60```
61 **描述:**
62
63从I2C设备读取数据。读取的数据将保存到i2cData指定的地址。
64
65
66**参数:**
67
68|参数名|描述|
69|:--|:------|
70| id | I2C设备ID。 |
71| deviceAddr |I2C设备地址。|
72| data |表示指向要读取的数据的指针。|
73| dataLen |表示要读取的数据长度。|
74
75
76
77## 硬件设计
78如下图所示,NFC芯片使用的是I2C协议,I2C1_SCL与GPIO_1相连接,I2C1_SDA与GPIO_0相连接,所以需要编写软件使用GPIO_0和GPIO_1产生I2C信号去控制NFC芯片。
79
80![E53接口电路](../../docs/figures/B5_basic_i2c_nfc/NFCCircuit.png "E53接口电路")
81
82## 软件设计
83
84**主要代码分析**
85
86这部分代码为I2C初始化的代码,首先用 `IoTGpioSetFunc()` 函数将GPIO_0复用为I2C1_SDA,GPIO_1复用为I2C1_SCL。然后调用IoTI2cInit()函数初始化I2C1端口,最后使用 `I2cSetBaudrate()` 函数设置I2C1的频率为400kbps。
87```c
88 //GPIO_0 multiplexed to I2C1_SDA
89 IoTGpioInit(0);
90 IoTGpioSetFunc(0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA);
91
92 //GPIO_1 multiplexed to I2C1_SCL
93 IoTGpioInit(1);
94 IoTGpioSetFunc(1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL);
95
96 //baudrate: 400kbps
97 IoTI2cInit(WIFI_IOT_I2C_IDX_1, 400000);
98```
99
100这部分的代码是向NFC芯片写入数据,当需要写入2个记录时,第2个记录的位置需要用`NDEFLastPos`来定义;当需要写入3个记录时,第2个和第3个记录的位置分别需要用`NDEFMiddlePos`和`NDEFLastPos`来定义。
101```c
102ret = storeText(NDEFFirstPos, (uint8_t *)TEXT);
103if (ret != 1) {
104 printf("NFC Write Data Failed :%d ",ret);
105}
106ret = storeUrihttp(NDEFLastPos, (uint8_t *)WEB);
107if (ret != 1) {
108 printf("NFC Write Data Failed :%d ",ret);
109}
110```
111
112
113## 编译调试
114
115### 修改 BUILD.gn 文件
116
117
118修改 `device\board\bearpi\bearpi_hm_nano\app` 路径下 BUILD.gn 文件,指定 `i2c_example` 参与编译。
119
120```r
121#"B1_basic_led_blink:led_example",
122#"B2_basic_button:button_example",
123#"B3_basic_pwm_led:pwm_example",
124#"B4_basic_adc:adc_example",
125"B5_basic_i2c_nfc:i2c_example",
126#"B6_basic_uart:uart_example",
127```
128
129
130### 运行结果
131
132示例代码编译烧录后,按下开发板的RESET按键,通过串口助手查看日志,并请使用带有NFC功能的手机靠近开发板,能读取数据。
133```c
134=======================================
135
136***********I2C_NFC_example**********
137
138=======================================
139
140Please use the mobile phone with NFC function close to the development board!
141
142=======================================
143
144***********I2C_NFC_example**********
145
146=======================================
147
148Please use the mobile phone with NFC function close to the development board!
149```
150