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协议,I2C_SCL与GPIO_0相连接,I2C_SDA与GPIO_1相连接,所以需要编写软件使用GPIO_0和GPIO_1产生I2C信号去控制NFC芯片。 79 80 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这部分的代码是向NFC芯片写入数据,但需要写入2个记录时,第2个记录的位置需要用`NDEFLastPos`来定义;当需要写入3个记录时,第2个和第3个记录的位置分别需要用`NDEFMiddlePos`和`NDEFLastPos`来定义。 100```c 101ret=storeText(NDEFFirstPos, (uint8_t *)TEXT); 102if(ret != 1) 103{ 104 printf("NFC Write Data Falied :%d ",ret); 105} 106ret=storeUrihttp(NDEFLastPos, (uint8_t *)WEB); 107if(ret != 1) 108{ 109 printf("NFC Write Data Falied :%d ",ret); 110} 111``` 112 113 114## 编译调试 115 116### 修改 BUILD.gn 文件 117 118 119修改 `device\bearpi\bearpi_hm_nano\app` 路径下 BUILD.gn 文件,指定 `i2c_example` 参与编译。 120 121```r 122#"B1_basic_led_blink:led_example", 123#"B2_basic_button:button_example", 124#"B3_basic_pwm_led:pwm_example", 125#"B4_basic_adc:adc_example", 126"B5_basic_i2c_nfc:i2c_example", 127#"B6_basic_uart:uart_example", 128``` 129 130 131 132 133### 运行结果 134 135示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,并请使用带有NFC功能的手机靠近开发板,能读取数据。 136```c 137======================================= 138 139***********I2C_NFC_example********** 140 141======================================= 142 143Please use the mobile phone with NFC function close to the development board! 144 145======================================= 146 147***********I2C_NFC_example********** 148 149======================================= 150 151Please use the mobile phone with NFC function close to the development board! 152``` 153