
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開源基礎(chǔ)軟件社區(qū)??
??https://ost.51cto.com??
一、硬件通信
1、串口通信
(1)Uart函數(shù)接口
涉及串口相關(guān)的函數(shù)主要是初始化、發(fā)送/讀取數(shù)據(jù)、去初始化函數(shù)整理如下:
函數(shù) | 描述 | 依賴 |
IoTUartInit(unsigned int id, const IotUartAttribute *param) | 初始化指定的UART端口id: 表示UART設(shè)備的端口號(hào)param:表示指向UART屬性的指針 | //base/iot_hardware/peripheral/interfaces/kits/iot_uart.h |
IoTUartRead(unsigned int id, unsigned char *data, unsigned int dataLen) | 從UART設(shè)備中讀取指定長(zhǎng)度的數(shù)據(jù)id: 表示UART設(shè)備的端口號(hào)data: 表示指向要讀取數(shù)據(jù)的起始地址的指針dataLen: 表示要讀取的字節(jié)數(shù) | //base/iot_hardware/peripheral/interfaces/kits/iot_uart.h |
IoTUartWrite(unsigned int id, const unsigned char *data, unsigned int dataLen) | 將指定長(zhǎng)度的數(shù)據(jù)寫入U(xiǎn)ART設(shè)備 | //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文件可知,其只是對(duì)hi_uart.h中定義的函數(shù)進(jìn)行了再一次封裝,hi_uart.h中還定義了限時(shí)讀取函數(shù):
/**
* @ingroup iot_uart
* @brief Reads data in specified timeout time.CNomment:在指定超時(shí)時(shí)間內(nèi)讀取數(shù)據(jù)。CNend
*
* @par 描述:
* Reads data in specified timeout time.CNomment:在指定超時(shí)時(shí)間內(nèi)讀取數(shù)據(jù)。CNend
* if Reads all data before timeout, function will return.
CNomment:超時(shí)前讀取完成所有數(shù)據(jù)后,函數(shù)會(huì)立即返回。CNend
*
* @attention This API must be used after the hi_uart_open function is called.
CNcomment:須在調(diào)用完hi_uart_init函數(shù)之后使用。CNend
* @param id [IN] type #hi_uart_idx,UART port id. CNcomment:UART端口號(hào)。CNend
* @param data [OUT] type #hi_u8*,Start address of the data to be read.CNcomment:讀到數(shù)據(jù)的首地址。CNend
* @param data_len [IN] type #hi_u32,Number of bytes to be read.CNcomment:要讀取數(shù)據(jù)的字節(jié)數(shù)。CNend
* @param timeout_ms [IN] type #hi_u32,timeout.CNcomment:超時(shí)時(shí)間。CNend
*
* @retval #>=0 Number of bytes that are actually read.CNcomment:實(shí)際讀到數(shù)據(jù)的字節(jié)數(shù)。CNend
* @retval #HI_ERR_FAILURE Data read error.CNcomment:讀數(shù)據(jù)失敗。CNend
* @par 依賴:
* @li hi_uart.h:Describes UART APIs.CNcomment:UART相關(guān)接口。CNend
* @see hi_uart_write。
*/
hi_s32 hi_uart_read_timeout(hi_uart_idx id, hi_u8 *data, hi_u32 len, hi_u32 timeout_ms);
串口主要參數(shù)有波特率、串口號(hào)、奇偶校驗(yàn)等使用一個(gè)IotUartAttribute結(jié)構(gòu)體定義,iot_uart.h中具體定義如下:
/**
* @brief Defines basic attributes of a UART port.
*
* @since 2.2
* @version 2.2
*/
typedef struct {
/** Baud rate */
unsigned int baudRate;
/** Data bits */
IotUartIdxDataBit dataBits;
/** Stop bit */
IotUartStopBit stopBits;
/** Parity */
IotUartParity parity;
/** Rx block state */
IotUartBlockState rxBlock;
/** Tx block state */
IotUartBlockState txBlock;
/** Padding bit */
unsigned char pad;
} IotUartAttribute;
(2)串口藍(lán)牙案例
下面我們做一個(gè)簡(jiǎn)單的串口通信實(shí)驗(yàn),將一串自定義數(shù)據(jù)通過(guò)Hi3861的UART1發(fā)送到藍(lán)牙模塊(或者其他開發(fā)板)。開發(fā)流程有以下幾步:配置并開啟串口、編寫發(fā)送\讀取任務(wù)邏輯、開啟任務(wù)線程、編譯運(yùn)行測(cè)試。
開發(fā)準(zhǔn)備:兩塊hi3861開發(fā)板或者h(yuǎn)i3861開發(fā)板和帶串口的設(shè)備(如HC05串口藍(lán)牙模塊)
- 第一步:配置并開啟串口。在iothardware下新建文件uart_bluetooth.c文件。由于默認(rèn)UART 0為調(diào)試串口對(duì)應(yīng)的是GPIO03和GPIO04,一般情況下不修改;與其他設(shè)備通信使用UART 1或者UART 2,本實(shí)驗(yàn)使用的是UART1,對(duì)應(yīng)的就是GPIO00(UART1的TX)和GPIO01(UART1的RT),首先我們將GPIO0、GPIO1的復(fù)用為串口,波特率設(shè)置為115200,8個(gè)數(shù)據(jù)位,1個(gè)停止位,無(wú)校驗(yàn)。具體實(shí)現(xiàn)如下:
#define BLUE_RX_1 1
#define BLUE_TX_0 0
int Bluetooth_Init()
{
// 初始化GPIO
IoTGpioInit(HI_IO_NAME_GPIO_0);
hi_io_set_func(BLUE_TX_0, HI_IO_FUNC_GPIO_0_UART1_TXD);
IoTGpioInit(HI_IO_NAME_GPIO_1);
hi_io_set_func(BLUE_RX_1, HI_IO_FUNC_GPIO_1_UART1_RXD);
// 配置UART 1參數(shù)
IotUartAttribute my_param; //={115200,8,1,HI_UART_PARITY_NONE,0,0};
/** Baud rate */
my_param.baudRate=115200;
/** Data bits */
my_param.dataBits=8;
/** Stop bit */
my_param.stopBits=1;
/** Parity */
my_param.parity=HI_UART_PARITY_NONE;
return IoTUartInit(HI_UART_IDX_1, &my_param);
}
- 第二步:編寫發(fā)送\讀取任務(wù)邏輯。測(cè)試邏輯較為簡(jiǎn)單,先將字符串“Hello OpenHarmony”發(fā)送出去,然后調(diào)用讀取接口獲取讀到的數(shù)據(jù)。具體實(shí)現(xiàn)如下:
// 串口藍(lán)牙數(shù)據(jù)交互
static void BluetoothTask(void *arg)
{
char send_data[] = "Hello OpenHarmony";
IoTUartWrite(HI_UART_IDX_1, (unsigned char*)send_data, strlen(send_data));
char get_data[8] = {0};
int data_len = 8;
while (1)
{
usleep(500000); // 0.5s
ret = IoTUartRead(HI_UART_IDX_1, get_data, data_len);
if (ret == 0)
printf("get_data = %s\n", get_data);
else
printf("get_data Falile\r\n");
}
}
- 第三步:開啟任務(wù)線程。開啟串口任務(wù)線程和前面幾節(jié)實(shí)驗(yàn)教程類似,這里給出藍(lán)牙實(shí)驗(yàn)uart_bluetooth.c完整代碼:
#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include <string.h>
#include "hi_io.h" // 定義了GPIO編號(hào)、描述GPIO功能
#include "hi_uart.h"
#include "iot_uart.h"
#define BLUE_RX_1 1
#define BLUE_TX_0 0
int Bluetooth_Init()
{
// 初始化GPIO
IoTGpioInit(HI_IO_NAME_GPIO_0);
hi_io_set_func(BLUE_TX_0, HI_IO_FUNC_GPIO_0_UART1_TXD);
IoTGpioInit(HI_IO_NAME_GPIO_1);
hi_io_set_func(BLUE_RX_1, HI_IO_FUNC_GPIO_1_UART1_RXD);
// 配置UART 1參數(shù)
IotUartAttribute my_param; //={115200,8,1,HI_UART_PARITY_NONE,0,0};
/** Baud rate */
my_param.baudRate=115200;
/** Data bits */
my_param.dataBits=8;
/** Stop bit */
my_param.stopBits=1;
/** Parity */
my_param.parity=HI_UART_PARITY_NONE;
return IoTUartInit(HI_UART_IDX_1, &my_param);
}
//測(cè)試藍(lán)牙
static void BluetoothTask(void *arg)
{
(void)arg;
sleep(2);
int ret = 1;
ret = Bluetooth_Init();
if (ret != 0)
{
printf("Uart1 init failed! \n");
return;
}
char send_data[] = "Hello OpenHarmony";
IoTUartWrite(HI_UART_IDX_1, (unsigned char*)send_data, strlen(send_data));
char get_data[8] = {0};
int data_len = 8;
while (1)
{
usleep(500000); // 0.5s
ret = IoTUartRead(HI_UART_IDX_1, get_data, data_len);
if (ret == 0)
printf("get_data = %s\n", get_data);
else
printf("get_data Falile\r\n");
}
}
static void BluetoothDemo(void)
{
osThreadAttr_t attr;
attr.name = "BluetoothTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.stack_mem = NULL;
attr.stack_size = 4096;
attr.priority = osPriorityNormal;
if (osThreadNew(BluetoothTask, NULL, &attr) == NULL)
{
printf("[BlueDemo] Falied to create BluetoothTask!\n");
}
}
APP_FEATURE_INIT(BluetoothDemo);
- 第四步:編譯運(yùn)行測(cè)試。因?yàn)槲覀兊墓こ淘趇othardware目錄下,所以只需修改該目錄下的BUILD.gn文件,添加我們的工程即可,修改如下:
static_library("led_example") {
sources = [
# "led_example.c",
# "gpio_input_output.c",
# "gpio_adc.c",
# "gpio_pwm.c",
"uart_bluetooth.c",
]
include_dirs = [
"http://utils/native/lite/include",
"http://kernel/liteos_m/kal/cmsis",
"http://base/iot_hardware/peripheral/interfaces/kits",
"http://device/hisilicon/hispark_pegasus/sdk_liteos/include",
]
}
連接藍(lán)牙模塊(或者串口模塊)RT、TX要交叉。我這里連接了HC05藍(lán)牙模塊,然后使用手機(jī)連接藍(lán)牙,互相發(fā)送數(shù)據(jù)。測(cè)試效果如下:
(3)串口使用注意事項(xiàng)
- 接收經(jīng)??ㄋ涝趺崔k: 使用hi_uart_read_timeout(在 hi_uart.h中)
- 使用多個(gè)串口 :同時(shí)使用多個(gè)串口在實(shí)際使用中可能會(huì)遇到無(wú)法讀取數(shù)據(jù)或者卡死狀態(tài)(阻塞了),這里有兩個(gè)解決方案:開啟多線程(不同線程開啟不同串口)、讀取數(shù)據(jù)用限時(shí)讀取hi_uart_read_timeout()
2、I2C通信
(1)I2C函數(shù)接口
I2C是常用硬件接口,MPU6050、溫濕度傳感器等會(huì)使用到。I2C的原理可見??Analog Dialogue I2C??。I2C相關(guān)函數(shù)接口整理如下:
函數(shù) | 描述 | 依賴 |
IoTI2cInit(unsigned int id, unsigned int baudrate) | 以指定的波特率初始化I2C設(shè)備。id:I2C設(shè)備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) | 將數(shù)據(jù)寫入I2C設(shè)備 | //base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h |
IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen); | 從I2C設(shè)備讀取數(shù)據(jù) | //base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h |
IoTI2cSetBaudrate(unsigned int id, unsigned int baudrate) | 設(shè)置I2C設(shè)備的波特率 | //base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h |
上述IoTI2cRead、IoTI2cWrite實(shí)質(zhì)是分別把hi_i2c_wirte()、hi_i2c_read()函數(shù)進(jìn)行一層封裝,實(shí)際建議直接使用hi_i2c_wirte()、hi_i2c_read() 【在hi_i2c.h文件中有定義編寫程序,發(fā)送數(shù)據(jù)更靈活一些。
另外,在hi_i2c.h中定義了發(fā)送的數(shù)據(jù)類型,可以看到是一個(gè)結(jié)構(gòu),接收時(shí)可以不用指定send_buf、send_len兩個(gè)變量,同理發(fā)送時(shí)可以不用指定另外兩個(gè)變量。
/**
* @ingroup iot_i2c
*
* I2C TX/RX data descriptor. CNcomment:I2C發(fā)送/接收數(shù)據(jù)描述符。CNend
*/
typedef struct {
hi_u8* send_buf; /**< Data TX pointer. The user needs to ensure that no null pointer is transferred.
CNcomment:數(shù)據(jù)發(fā)送指針CNend */
hi_u32 send_len; /**< Length of sent data (unit: byte).
CNcomment:發(fā)送數(shù)據(jù)長(zhǎng)度(單位:byte)CNend */
hi_u8* receive_buf; /**< Data RX pointer. CNcomment:數(shù)據(jù)接收指針CNend */
hi_u32 receive_len; /**< Length of received data (unit: byte).
CNcomment:接收數(shù)據(jù)長(zhǎng)度(單位:byte)CNend */
} hi_i2c_data;
(2)溫濕度傳感器案例
在本實(shí)驗(yàn)中我們將編寫程序,獲取環(huán)境溫濕度,檢測(cè)可燃?xì)怏w,采集的數(shù)據(jù)通過(guò)串口輸出,當(dāng)溫度高于 25 攝氏度時(shí),實(shí)驗(yàn)板上的蜂鳴器鳴響。其中溫濕度傳感器為 AHT20,使用i2c 協(xié)議傳輸數(shù)據(jù)到 hi3861 核心板,可燃?xì)怏w傳感器輸出模擬量,需要使用 ADC 功能采集數(shù)據(jù);無(wú)源蜂鳴器使用 PWM 信號(hào)驅(qū)動(dòng)。開發(fā)流程總結(jié)為:了解AHT20 數(shù)據(jù)手冊(cè)、配置i2C接口、編寫連接設(shè)備收發(fā)數(shù)據(jù)的任務(wù)邏輯、注冊(cè)線程任務(wù)、運(yùn)行調(diào)試。
- 第一步,硬件連接 :本實(shí)驗(yàn)使用 hi3861 核心板、底板、環(huán)境監(jiān)測(cè)板,硬件連接如下圖:

需要注意的是,每個(gè)傳感器已經(jīng)通過(guò)底板連接到固定 GPIO,對(duì)應(yīng)的連接關(guān)系整理如下:
蜂鳴器——PWM 控制聲音的頻率和音量
GPIO09: PWM0
MQ2 燃?xì)鈧鞲衅鳌狝DC 讀取模擬值
GPIO11: ADC5
AHT20 溫濕度傳感器——I2C 接口,設(shè)備地址 0x38
GPIO13: I2C0_SDA
GPIO14: I2C0_SCL
軟件分為兩個(gè)部分,第一部分是獲取溫濕度傳感器 AHT20數(shù)據(jù)。新建如下三個(gè)文件:
applications\sample\wifi-iot\app\iothardware\aht20.h :聲明相關(guān)函數(shù)。
applications\sample\wifi-iot\app\iothardware\aht20.c :初始化傳感器,讀取并處理數(shù)據(jù)。
applications\sample\wifi-iot\app\iothardware\environment.c :本實(shí)驗(yàn)任務(wù)在此文件開啟線程。
- 第二步,查詢AHT20數(shù)據(jù)手冊(cè) 每條指令對(duì) AHT20 有什么樣效果,需要查看 AHT20 的手冊(cè),當(dāng)然作為軟件開發(fā)而言,我們不用重復(fù)造輪子,可以直接使用別人整理出的資料進(jìn)行程序編寫。AHT20 常用的指令在 aht20.h 中聲明,整理如下【AHT20 的資料可以參考教程附帶的資料,也可以自行查找】:
#define AHT20_SCL 14
#define AHT20_SDA 13
#define AHT20_I2C_IDX 0 //--i2c0
#define AHT20_I2C_BAUDRATE 400*1000 //--i2c波特率400K
#define AHT20_ADDR 0x38
#define AHT20_READ ((0x38<<1)|0x1) //--SDA-讀
#define AHT20_WRITE ((0x38<<1)|0x0) //--SDA-寫
#define AHT20_INIT_CMD 0xBE //--初始化(校準(zhǔn))命令
#define AHT20_INIT_CMD_B1 0x08
#define AHT20_INIT_CMD_B2 0x00
#define AHT20_TRAG_CMD 0xAC //--觸發(fā)測(cè)量
#define AHT20_TRAG_CMD_B1 0x33
#define AHT20_TRAG_CMD_B2 0
#define AHT20_RESET_CMD 0xBA //--軟復(fù)位(不斷電復(fù)位)
#define AHT20_STATUS 0x71 //--獲取狀態(tài)位
#define AHT20_WAIT_TIME 100 //復(fù)位、傳感器測(cè)量數(shù)據(jù)等待時(shí)間 ms
- 第三步,配置i2c接口,獲取數(shù)據(jù)。先來(lái)看如何初始化接口以及編寫讀取發(fā)送數(shù)據(jù)的函數(shù)。具體實(shí)現(xiàn)如下 aht20.c 文件的部分源碼:
//使能 i2c-0
void AHT20_I2C_Init(void)
{
IoTGpioInit(AHT20_SDA);
hi_io_set_func(AHT20_SDA,HI_IO_FUNC_GPIO_13_I2C0_SDA);
IoTGpioInit(AHT20_SCL);
hi_io_set_func(AHT20_SCL,HI_IO_FUNC_GPIO_14_I2C0_SCL);
hi_i2c_init(AHT20_I2C_IDX,AHT20_I2C_BAUDRATE);
}
// 讀取數(shù)據(jù)
static uint32_t AHT20_Read(uint8_t *data, uint32_t dataLen)
{
hi_i2c_idx id = AHT20_I2C_IDX;
hi_i2c_data i2cData;
i2cData.receive_buf = data;
i2cData.receive_len = dataLen;
i2cData.send_buf = NULL;
i2cData.send_len = 0;
uint32_t result;
result = hi_i2c_read((hi_i2c_idx)id,AHT20_READ,&i2cData);
if(result != IOT_SUCCESS){
printf("AHT20_Read() Failed ,%0X\n",result);
return result; }
return IOT_SUCCESS ;
}
// 發(fā)送數(shù)據(jù)
static uint32_t AHT20_Write(uint8_t *data, uint32_t dataLen)
{
hi_i2c_idx id = AHT20_I2C_IDX;
hi_i2c_data i2cData;
i2cData.receive_buf = NULL;
i2cData.receive_len = 0;
i2cData.send_buf = data;
i2cData.send_len = dataLen;
uint32_t result;
result = hi_i2c_write((hi_i2c_idx)id,AHT20_WRITE,&i2cData);
if(result != IOT_SUCCESS){
printf("AHT20_Write() Failed ,%0X\n",result);
return result; }
return IOT_SUCCESS ;
}
當(dāng)編寫基本的數(shù)據(jù)發(fā)送讀取函數(shù)后,可調(diào)用其發(fā)送指令,例如復(fù)位、獲取傳感器狀態(tài)等。
//獲取狀態(tài)
static uint32_t AHT20_Status(void)
{
uint8_t statuscmd={AHT20_STATUS};
return AHT20_Read(&statuscmd,sizeof(statuscmd));
}
//軟復(fù)位
static uint32_t AHT20_Reset(void)
{
uint8_t reset = {AHT20_RESET_CMD};
return AHT20_Write(&reset,sizeof(reset));
}
//校準(zhǔn)
static uint32_t AHT20_Initcmd(void)
{
uint8_t initialcmd[] ={AHT20_INIT_CMD, AHT20_INIT_CMD_B1,AHT20_INIT_CMD_B2};
return AHT20_Write(&initialcmd,sizeof(initialcmd));
}
//觸發(fā)測(cè)量
uint32_t AHT20_StartMeasure(void)
{
uint8_t startcmd[] ={AHT20_TRAG_CMD, AHT20_TRAG_CMD_B1,AHT20_TRAG_CMD_B2};
return AHT20_Write(&startcmd,sizeof(startcmd));
}
- 第四步,編寫處理邏輯,開啟任務(wù)線程 。在獲取數(shù)據(jù)到數(shù)據(jù)后,判斷溫度是否大于報(bào)警溫度值,是則讓蜂鳴器鳴響。將該任務(wù)向系統(tǒng)開一個(gè)線程。environment.c文件中的源碼如下:
/ *程序功能:
1. 讀取燃?xì)鈧鞲衅鞯腁DC值;
2. 讀取AHT20溫濕度傳感器的數(shù)值;
3. 溫度、濕度上升(哈一口氣)蜂鳴器叫幾聲.
基于hi3861_hdu開發(fā) 編譯運(yùn)行通過(guò)
*/
#include "aht20.h"
#define BEEP_PWM 0
#define BEEP_IO 9
#define MQ2_IO 11
static void EnviroTask(void *arg)
{
(void) arg;
unsigned int data;
float temp;
float humi;
while(1)
{
if(hi_adc_read(HI_ADC_CHANNEL_5,&data,HI_ADC_EQU_MODEL_1,HI_ADC_CUR_BAIS_DEFAULT, 0)==0)
{ printf("燃?xì)釳Q2 data:%d\n",data);}
AHT20_Calibrate();
AHT20_StartMeasure();
AHT20_GetMeasureResult(&temp, &humi);
printf(" 溫度temp:%.3f ",temp);
printf(" 濕度humi:%.3f\n",humi);
if(temp>25) //溫度大于25攝氏度,蜂鳴器叫
{
IoTPwmStart(BEEP_PWM,90,40000);
}
else{
IoTPwmStop(BEEP_PWM);
}
}
}
static void EnviroEntry(void)
{
IoTGpioInit(BEEP_IO);
hi_io_set_func(BEEP_IO,HI_IO_FUNC_GPIO_9_PWM0_OUT);
IoTPwmInit(BEEP_PWM);
IoTGpioInit(MQ2_IO);
hi_io_set_func(MQ2_IO,HI_IO_FUNC_GPIO_5_GPIO);
AHT20_I2C_Init();
osThreadAttr_t attr;
attr.name = "EnviroTask";
attr.attr_bits = 0U;
attr.cb_mem = NULL;
attr.cb_size = 0U;
attr.priority = 24;
attr.stack_size = 4096;
if(osThreadNew(EnviroTask,NULL,&attr)==NULL)
{
printf("[EnviroEntry] Failed to create EnviroTask!\n ");
}
}
APP_FEATURE_INIT(EnviroEntry);
- 第五步,編譯運(yùn)行。修改iothardware目錄下的BUILD文件,這次有兩個(gè).c文件參與編譯。aht20.h文件和.c在一個(gè)目錄下,可以不用再次指定依賴路徑。 上述1-4步完整源碼見附件。BUILD.gn如下:
static_library("led_example") {
sources = [
# "led_example.c",
# "gpio_input_output.c",
# "gpio_adc.c",
# "gpio_pwm.c",
# "uart_bluetooth.c",
"aht20.c",
"environment.c",
]
include_dirs = [
"http://utils/native/lite/include",
"http://kernel/liteos_m/kal/cmsis",
"http://base/iot_hardware/peripheral/interfaces/kits",
"http://device/hisilicon/hispark_pegasus/sdk_liteos/include",
]
}
運(yùn)行結(jié)果如下圖:

可以用手觸摸或者對(duì)著溫濕度傳感器哈氣,可以看到數(shù)值在變化,燃?xì)鈧鞲衅鲿?huì)微微發(fā)熱,也有數(shù)值,條件允許可以點(diǎn)一根蠟燭,然后熄滅它,剛熄滅后的的白煙可以讓MQ2傳感器的數(shù)值發(fā)生變化。至此該實(shí)驗(yàn)全部結(jié)束。
3、SPI通信
(1)SPI函數(shù)接口
SPI相關(guān)理論可以參考Analoge Dialogue SPI。hi3861支持2路SPI。這里給出相關(guān)函數(shù),具體實(shí)踐可根據(jù)需求調(diào)用API即可。i2S相關(guān)定義在文件src\device\hisilicon\hispark_pegasus\sdk_liteos\include\hi_spi.h中。
// 初始化spi
hi_u32 hi_spi_init(hi_spi_idx spi_id, hi_spi_cfg_init_param init_param, const hi_spi_cfg_basic_info *param);
// 中斷模式配置
hi_u32 hi_spi_set_irq_mode(hi_spi_idx id, hi_bool irq_en);
// dma模式配置
hi_u32 hi_spi_set_dma_mode(hi_spi_idx id, hi_bool dma_en);
// 從機(jī)寫
hi_u32 hi_spi_slave_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len, hi_u32 time_out_ms);
// 從機(jī)度
hi_u32 hi_spi_slave_read(hi_spi_idx spi_id, hi_pvoid read_data, hi_u32 byte_len, hi_u32 time_out_ms);
// 主機(jī)寫
hi_u32 hi_spi_host_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len);
// 主機(jī)讀
hi_u32 hi_spi_host_read(hi_spi_idx spi_id, hi_pvoid read_data, hi_u32 byte_len);
4、I2S通信
(1)I2S函數(shù)接口
I2S相關(guān)理論可以參考Analoge Dialogue I2S。hi3861支持一路I2S。這里給出相關(guān)函數(shù),具體實(shí)踐可根據(jù)需求調(diào)用API即可。i2S相關(guān)定義在文件src\device\hisilicon\hispark_pegasus\sdk_liteos\include\hi_i2s.h中。
/**
* @ingroup iot_i2s
*
* sample rate.
*/
typedef enum {
HI_I2S_SAMPLE_RATE_8K = 8,
HI_I2S_SAMPLE_RATE_16K = 16,
HI_I2S_SAMPLE_RATE_32K = 32,
HI_I2S_SAMPLE_RATE_48K = 48,
} hi_i2s_sample_rate;
/**
* @ingroup iot_i2s
*
* resolution.
*/
typedef enum {
HI_I2S_RESOLUTION_16BIT = 16,
HI_I2S_RESOLUTION_24BIT = 24,
} hi_i2s_resolution;
/**
* @ingroup iot_i2s
*
* I2S attributes.
*/
typedef struct {
hi_i2s_sample_rate sample_rate; /**< i2s sample rate, type hi_i2s_sample_rate.CNcomment:采樣率,類型為
hi_i2s_sample_rate。CNend */
hi_i2s_resolution resolution; /**< i2s resolution, type hi_i2s_resolution.CNcomment:解析度,類型為
hi_i2s_resolution。CNend */
} hi_i2s_attribute;
hi_u32 hi_i2s_init(const hi_i2s_attribute *i2s_attribute);
hi_u32 hi_i2s_read(hi_u8 *rd_data, hi_u32 rd_len, hi_u32 time_out_ms);
hi_u32 hi_i2s_write(hi_u8 *wr_data, hi_u32 wr_len, hi_u32 time_out_ms);
文章相關(guān)附件可以點(diǎn)擊下面的原文鏈接前往下載
https://ost.51cto.com/resource/2684。
??想了解更多關(guān)于開源的內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO 開源基礎(chǔ)軟件社區(qū)??
??https://ost.51cto.com??