#创作者激励#【2.硬件通信】串口、I2C、SPI、I2S 开发例程 原创
【文正在参加2023年第一期优质创作者激励计划】
OpenHarmony轻量和小型系统开发例程2023
【0.开发环境搭建】
【1.GPIO基本操作】
【2.硬件通信】
目录
2.硬件通信
2.1 串口通信
2.1.1 Uart函数接口
涉及串口相关的函数主要是初始化、发送/读取数据、去初始化函数整理如下:
函数 | 描述 | 依赖 |
---|---|---|
IoTUartInit(unsigned int id, const IotUartAttribute *param) | 初始化指定的UART端口id: 表示UART设备的端口号param:表示指向UART属性的指针 | //base/iot_hardware/peripheral/interfaces/kits/iot_uart.h |
IoTUartRead(unsigned int id, unsigned char *data, unsigned int dataLen) | 从UART设备中读取指定长度的数据id: 表示UART设备的端口号data: 表示指向要读取数据的起始地址的指针dataLen: 表示要读取的字节数 | //base/iot_hardware/peripheral/interfaces/kits/iot_uart.h |
IoTUartWrite(unsigned int id, const unsigned char *data, unsigned int dataLen) | 将指定长度的数据写入UART设备 | //base/iot_hardware/peripheral/interfaces/kits/iot_uart.h |
IoTUartDeinit(unsigned int id) | 去初始化指定的UART端口 | /base/iot_hardware/peripheral/interfaces/kits/iot_uart.h |
另外,查看iot_uart.h文件可知,其只是对hi_uart.h中定义的函数进行了再一次封装,hi_uart.h中还定义了限时读取函数:
串口主要参数有波特率、串口号、奇偶校验等使用一个IotUartAttribute结构体定义,iot_uart.h中具体定义如下:
2.1.2 串口蓝牙案例
下面我们做一个简单的串口通信实验,将一串自定义数据通过Hi3861的UART1发送到蓝牙模块(或者其他开发板)。开发流程有以下几步:配置并开启串口、编写发送\读取任务逻辑、开启任务线程、编译运行测试。
开发准备:两块hi3861开发板或者hi3861开发板和带串口的设备(如HC05串口蓝牙模块)
- 第一步:配置并开启串口。在iothardware下新建文件uart_bluetooth.c文件。由于默认UART 0为调试串口对应的是GPIO03和GPIO04,一般情况下不修改;与其他设备通信使用UART 1或者UART 2,本实验使用的是UART1,对应的就是GPIO00(UART1的TX)和GPIO01(UART1的RT),首先我们将GPIO0、GPIO1的复用为串口,波特率设置为115200,8个数据位,1个停止位,无校验。具体实现如下:
- 第二步:编写发送\读取任务逻辑。测试逻辑较为简单,先将字符串“Hello OpenHarmony”发送出去,然后调用读取接口获取读到的数据。具体实现如下:
- 第三步:开启任务线程。开启串口任务线程和前面几节实验教程类似,这里给出蓝牙实验uart_bluetooth.c完整代码:
- 第四步:编译运行测试。因为我们的工程在iothardware目录下,所以只需修改该目录下的BUILD.gn文件,添加我们的工程即可,修改如下:
连接蓝牙模块(或者串口模块)RT、TX要交叉。我这里连接了HC05蓝牙模块,然后使用手机连接蓝牙,互相发送数据。测试效果如下:
2.1.3 串口使用注意事项
- 接收经常卡死怎么办: 使用hi_uart_read_timeout(在 hi_uart.h中)
- 使用多个串口 :同时使用多个串口在实际使用中可能会遇到无法读取数据或者卡死状态(阻塞了),这里有两个解决方案:开启多线程(不同线程开启不同串口)、读取数据用限时读取hi_uart_read_timeout()
2.2 I2C通信
2.2.1 I2C函数接口
I2C是常用硬件接口,MPU6050、温湿度传感器等会使用到。I2C的原理可见Analog Dialogue I2C。I2C相关函数接口整理如下:
函数 | 描述 | 依赖 |
---|---|---|
IoTI2cInit(unsigned int id, unsigned int baudrate) | 以指定的波特率初始化I2C设备。id:I2C设备ID baudrate:指定的I2C波特率 | //base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h |
IoTI2cWrite(unsigned int id, unsigned short deviceAddr, const unsigned char *data, unsigned int dataLen) | 将数据写入I2C设备 | //base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h |
IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen); | 从I2C设备读取数据 | //base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h |
IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate) | 设置I2C设备的波特率 | //base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h |
上述IoTI2cRead、IoTI2cWrite实质是分别把hi_i2c_wirte()、hi_i2c_read()函数进行一层封装,实际建议直接使用hi_i2c_wirte()、hi_i2c_read() 【在hi_i2c.h文件中有定义编写程序,发送数据更灵活一些。
另外,在hi_i2c.h中定义了发送的数据类型,可以看到是一个结构,接收时可以不用指定send_buf、send_len两个变量,同理发送时可以不用指定另外两个变量。
2.2.2 温湿度传感器案例
在本实验中我们将编写程序,获取环境温湿度,检测可燃气体,采集的数据通过串口输出,当温度高于 25 摄氏度时,实验板上的蜂鸣器鸣响。其中温湿度传感器为 AHT20,使用i2c 协议传输数据到 hi3861 核心板,可燃气体传感器输出模拟量,需要使用 ADC 功能采集数据;无源蜂鸣器使用 PWM 信号驱动。开发流程总结为:了解AHT20 数据手册、配置i2C接口、编写连接设备收发数据的任务逻辑、注册线程任务、运行调试。
- 第一步,硬件连接 :本实验使用 hi3861 核心板、底板、环境监测板,硬件连接如下图:
需要注意的是,每个传感器已经通过底板连接到固定 GPIO,对应的连接关系整理如下:
软件分为两个部分,第一部分是获取温湿度传感器 AHT20数据。新建如下三个文件:
- 第二步,查询AHT20数据手册 每条指令对 AHT20 有什么样效果,需要查看 AHT20 的手册,当然作为软件开发而言,我们不用重复造轮子,可以直接使用别人整理出的资料进行程序编写。AHT20 常用的指令在 aht20.h 中声明,整理如下【AHT20 的资料可以参考教程附带的资料,也可以自行查找】:
- 第三步,配置i2c接口,获取数据。先来看如何初始化接口以及编写读取发送数据的函数。具体实现如下 aht20.c 文件的部分源码:
当编写基本的数据发送读取函数后,可调用其发送指令,例如复位、获取传感器状态等。
- 第四步,编写处理逻辑,开启任务线程 。在获取数据到数据后,判断温度是否大于报警温度值,是则让蜂鸣器鸣响。将该任务向系统开一个线程。environment.c文件中的源码如下:
- 第五步,编译运行。修改iothardware目录下的BUILD文件,这次有两个.c文件参与编译。aht20.h文件和.c在一个目录下,可以不用再次指定依赖路径。 上述1-4步完整源码见附件。BUILD.gn如下:
运行结果如下图:
可以用手触摸或者对着温湿度传感器哈气,可以看到数值在变化,燃气传感器会微微发热,也有数值,条件允许可以点一根蜡烛,然后熄灭它,刚熄灭后的的白烟可以让MQ2传感器的数值发生变化。至此该实验全部结束。
2.3 SPI通信
2.3.1 SPI函数接口
SPI相关理论可以参考Analoge Dialogue SPI。hi3861支持2路SPI。这里给出相关函数,具体实践可根据需求调用API即可。i2S相关定义在文件src\device\hisilicon\hispark_pegasus\sdk_liteos\include\hi_spi.h中。
2.4 I2S通信
2.4.1 I2S函数接口
I2S相关理论可以参考Analoge Dialogue I2S。hi3861支持一路I2S。这里给出相关函数,具体实践可根据需求调用API即可。i2S相关定义在文件src\device\hisilicon\hispark_pegasus\sdk_liteos\include\hi_i2s.h中。
很完整的教程必须支持一下
非常好的教程,写得通谷易懂呀!