精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

硬件通信:串口、I2C、SPI、I2S 開發(fā)例程

系統(tǒng) OpenHarmony
我們做一個簡單的串口通信實驗,將一串自定義數(shù)據(jù)通過Hi3861的UART1發(fā)送到藍牙模塊(或者其他開發(fā)板)。開發(fā)流程有以下幾步:配置并開啟串口、編寫發(fā)送\讀取任務邏輯、開啟任務線程、編譯運行測試。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區(qū)??

??https://ost.51cto.com??

一、硬件通信

1、串口通信

(1)Uart函數(shù)接口

涉及串口相關的函數(shù)主要是初始化、發(fā)送/讀取數(shù)據(jù)、去初始化函數(shù)整理如下:

函數(shù)

描述

依賴

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設備中讀取指定長度的數(shù)據(jù)id: 表示UART設備的端口號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)

將指定長度的數(shù)據(jù)寫入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中定義的函數(shù)進行了再一次封裝,hi_uart.h中還定義了限時讀取函數(shù):

/**
* @ingroup iot_uart
* @brief Reads data in specified timeout time.CNomment:在指定超時時間內讀取數(shù)據(jù)。CNend
*
* @par 描述:
* Reads data in specified timeout time.CNomment:在指定超時時間內讀取數(shù)據(jù)。CNend
* if Reads all data before timeout, function will return.
CNomment:超時前讀取完成所有數(shù)據(jù)后,函數(shù)會立即返回。CNend
*
* @attention This API must be used after the hi_uart_open function is called.
CNcomment:須在調用完hi_uart_init函數(shù)之后使用。CNend
* @param id [IN] type #hi_uart_idx,UART port id. CNcomment:UART端口號。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:超時時間。CNend
*
* @retval #>=0 Number of bytes that are actually read.CNcomment:實際讀到數(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相關接口。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ù)有波特率、串口號、奇偶校驗等使用一個IotUartAttribute結構體定義,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)串口藍牙案例

下面我們做一個簡單的串口通信實驗,將一串自定義數(shù)據(jù)通過Hi3861的UART1發(fā)送到藍牙模塊(或者其他開發(fā)板)。開發(fā)流程有以下幾步:配置并開啟串口、編寫發(fā)送\讀取任務邏輯、開啟任務線程、編譯運行測試。
開發(fā)準備:兩塊hi3861開發(fā)板或者hi3861開發(fā)板和帶串口的設備(如HC05串口藍牙模塊)

  • 第一步:配置并開啟串口。在iothardware下新建文件uart_bluetooth.c文件。由于默認UART 0為調試串口對應的是GPIO03和GPIO04,一般情況下不修改;與其他設備通信使用UART 1或者UART 2,本實驗使用的是UART1,對應的就是GPIO00(UART1的TX)和GPIO01(UART1的RT),首先我們將GPIO0、GPIO1的復用為串口,波特率設置為115200,8個數(shù)據(jù)位,1個停止位,無校驗。具體實現(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ā)送\讀取任務邏輯。測試邏輯較為簡單,先將字符串“Hello OpenHarmony”發(fā)送出去,然后調用讀取接口獲取讀到的數(shù)據(jù)。具體實現(xià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");
}
}
  • 第三步:開啟任務線程。開啟串口任務線程和前面幾節(jié)實驗教程類似,這里給出藍牙實驗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編號、描述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);
}
//測試藍牙
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);
  • 第四步:編譯運行測試。因為我們的工程在iothardware目錄下,所以只需修改該目錄下的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",
]
}

連接藍牙模塊(或者串口模塊)RT、TX要交叉。我這里連接了HC05藍牙模塊,然后使用手機連接藍牙,互相發(fā)送數(shù)據(jù)。測試效果如下:

(3)串口使用注意事項

  • 接收經常卡死怎么辦: 使用hi_uart_read_timeout(在 hi_uart.h中)
  • 使用多個串口 :同時使用多個串口在實際使用中可能會遇到無法讀取數(shù)據(jù)或者卡死狀態(tài)(阻塞了),這里有兩個解決方案:開啟多線程(不同線程開啟不同串口)、讀取數(shù)據(jù)用限時讀取hi_uart_read_timeout()

2、I2C通信

(1)I2C函數(shù)接口

I2C是常用硬件接口,MPU6050、溫濕度傳感器等會使用到。I2C的原理可見??Analog Dialogue I2C??。I2C相關函數(shù)接口整理如下:

函數(shù)

描述

依賴

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)

將數(shù)據(jù)寫入I2C設備

//base/iot_hardware/peripheral/interfaces/kits/iot_i2c.h

IoTI2cRead(unsigned int id, unsigned short deviceAddr, unsigned char *data, unsigned int dataLen);

從I2C設備讀取數(shù)據(jù)

//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()函數(shù)進行一層封裝,實際建議直接使用hi_i2c_wirte()、hi_i2c_read() 【在hi_i2c.h文件中有定義編寫程序,發(fā)送數(shù)據(jù)更靈活一些。
另外,在hi_i2c.h中定義了發(fā)送的數(shù)據(jù)類型,可以看到是一個結構,接收時可以不用指定send_buf、send_len兩個變量,同理發(fā)送時可以不用指定另外兩個變量。

/**
* @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ù)長度(單位: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ù)長度(單位:byte)CNend */
} hi_i2c_data;

(2)溫濕度傳感器案例

在本實驗中我們將編寫程序,獲取環(huán)境溫濕度,檢測可燃氣體,采集的數(shù)據(jù)通過串口輸出,當溫度高于 25 攝氏度時,實驗板上的蜂鳴器鳴響。其中溫濕度傳感器為 AHT20,使用i2c 協(xié)議傳輸數(shù)據(jù)到 hi3861 核心板,可燃氣體傳感器輸出模擬量,需要使用 ADC 功能采集數(shù)據(jù);無源蜂鳴器使用 PWM 信號驅動。開發(fā)流程總結為:了解AHT20 數(shù)據(jù)手冊、配置i2C接口、編寫連接設備收發(fā)數(shù)據(jù)的任務邏輯、注冊線程任務、運行調試。

  • 第一步,硬件連接 :本實驗使用 hi3861 核心板、底板、環(huán)境監(jiān)測板,硬件連接如下圖:

需要注意的是,每個傳感器已經通過底板連接到固定 GPIO,對應的連接關系整理如下:

蜂鳴器——PWM 控制聲音的頻率和音量
GPIO09: PWM0
MQ2 燃氣傳感器——ADC 讀取模擬值
GPIO11: ADC5
AHT20 溫濕度傳感器——I2C 接口,設備地址 0x38
GPIO13: I2C0_SDA
GPIO14: I2C0_SCL

軟件分為兩個部分,第一部分是獲取溫濕度傳感器 AHT20數(shù)據(jù)。新建如下三個文件:

applications\sample\wifi-iot\app\iothardware\aht20.h :聲明相關函數(shù)。
applications\sample\wifi-iot\app\iothardware\aht20.c :初始化傳感器,讀取并處理數(shù)據(jù)。
applications\sample\wifi-iot\app\iothardware\environment.c :本實驗任務在此文件開啟線程。
  • 第二步,查詢AHT20數(shù)據(jù)手冊 每條指令對 AHT20 有什么樣效果,需要查看 AHT20 的手冊,當然作為軟件開發(fā)而言,我們不用重復造輪子,可以直接使用別人整理出的資料進行程序編寫。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 //--初始化(校準)命令
#define AHT20_INIT_CMD_B1 0x08
#define AHT20_INIT_CMD_B2 0x00
#define AHT20_TRAG_CMD 0xAC //--觸發(fā)測量
#define AHT20_TRAG_CMD_B1 0x33
#define AHT20_TRAG_CMD_B2 0
#define AHT20_RESET_CMD 0xBA //--軟復位(不斷電復位)
#define AHT20_STATUS 0x71 //--獲取狀態(tài)位
#define AHT20_WAIT_TIME 100 //復位、傳感器測量數(shù)據(jù)等待時間 ms
  • 第三步,配置i2c接口,獲取數(shù)據(jù)。先來看如何初始化接口以及編寫讀取發(fā)送數(shù)據(jù)的函數(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 ;
}

當編寫基本的數(shù)據(jù)發(fā)送讀取函數(shù)后,可調用其發(fā)送指令,例如復位、獲取傳感器狀態(tài)等。

//獲取狀態(tài)
static uint32_t AHT20_Status(void)
{
uint8_t statuscmd={AHT20_STATUS};
return AHT20_Read(&statuscmd,sizeof(statuscmd));
}
//軟復位
static uint32_t AHT20_Reset(void)
{
uint8_t reset = {AHT20_RESET_CMD};
return AHT20_Write(&reset,sizeof(reset));
}
//校準
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ā)測量
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));
}
  • 第四步,編寫處理邏輯,開啟任務線程 。在獲取數(shù)據(jù)到數(shù)據(jù)后,判斷溫度是否大于報警溫度值,是則讓蜂鳴器鳴響。將該任務向系統(tǒng)開一個線程。environment.c文件中的源碼如下:
/ *程序功能:
1. 讀取燃氣傳感器的ADC值;
2. 讀取AHT20溫濕度傳感器的數(shù)值;
3. 溫度、濕度上升(哈一口氣)蜂鳴器叫幾聲.
基于hi3861_hdu開發(fā) 編譯運行通過
*/
#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("燃氣MQ2 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);
  • 第五步,編譯運行。修改iothardware目錄下的BUILD文件,這次有兩個.c文件參與編譯。aht20.h文件和.c在一個目錄下,可以不用再次指定依賴路徑。 上述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",
]
}

運行結果如下圖:

#創(chuàng)作者激勵#【2.硬件通信】串口、I2C、SPI、I2S 開發(fā)例程-開源基礎軟件社區(qū)

可以用手觸摸或者對著溫濕度傳感器哈氣,可以看到數(shù)值在變化,燃氣傳感器會微微發(fā)熱,也有數(shù)值,條件允許可以點一根蠟燭,然后熄滅它,剛熄滅后的的白煙可以讓MQ2傳感器的數(shù)值發(fā)生變化。至此該實驗全部結束。

3、SPI通信

(1)SPI函數(shù)接口

SPI相關理論可以參考Analoge Dialogue SPI。hi3861支持2路SPI。這里給出相關函數(shù),具體實踐可根據(jù)需求調用API即可。i2S相關定義在文件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);
// 從機寫
hi_u32 hi_spi_slave_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len, hi_u32 time_out_ms);
// 從機度
hi_u32 hi_spi_slave_read(hi_spi_idx spi_id, hi_pvoid read_data, hi_u32 byte_len, hi_u32 time_out_ms);
// 主機寫
hi_u32 hi_spi_host_write(hi_spi_idx spi_id, hi_pvoid write_data, hi_u32 byte_len);
// 主機讀
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相關理論可以參考Analoge Dialogue I2S。hi3861支持一路I2S。這里給出相關函數(shù),具體實踐可根據(jù)需求調用API即可。i2S相關定義在文件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);

文章相關附件可以點擊下面的原文鏈接前往下載

 https://ost.51cto.com/resource/2684。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區(qū)??

??https://ost.51cto.com??

責任編輯:jianghua 來源: 51CTO 開源基礎軟件社區(qū)
相關推薦

2022-06-13 09:21:45

I2C DriverI2C 子系統(tǒng)

2022-06-18 09:02:00

I2C 子系統(tǒng)通信協(xié)議

2017-03-16 08:30:19

Android ThAndroidI2C

2017-08-11 18:25:25

Linuxi2c

2020-11-09 07:23:10

UART通信SPI

2022-05-27 09:00:09

I2C子系統(tǒng)協(xié)議

2022-06-12 07:30:13

I3C通訊協(xié)議

2010-07-01 16:45:05

I2C總線協(xié)議

2010-06-08 16:25:35

I2C總線協(xié)議

2024-04-07 09:32:02

物聯(lián)網串口通信協(xié)議

2021-01-19 19:32:01

Cortex-A9 R嵌入式系統(tǒng)i2c 外設

2021-09-08 15:44:56

鴻蒙HarmonyOS應用

2022-04-12 09:05:30

Linux時鐘

2021-12-06 08:50:27

I2C拉電阻阻值架構

2023-09-13 15:33:57

I2C鴻蒙

2025-03-28 09:56:55

2022-06-07 08:42:21

高速模式HS mode

2010-06-08 16:21:50

I2C總線協(xié)議

2009-04-11 15:12:24

.Net MicroI2C總線模擬器

2021-09-24 09:08:31

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

国产精品久久久网站| 韩国av网站在线| 久久国产精品久久久久久电车| 亚洲老板91色精品久久| 五月婷婷激情久久| 日本乱理伦在线| 久久青草欧美一区二区三区| 国产精品久久999| 欧美片一区二区| 国产传媒欧美日韩成人精品大片| 欧美高清hd18日本| 国产最新免费视频| 激情成人四房播| 91亚洲国产成人精品一区二区三| 国产精彩精品视频| 久久久久久激情| 成人羞羞在线观看网站| 欧美精品一区二区精品网| 国产高潮免费视频| 高清毛片在线观看| 中文字幕一区二区不卡| 久久99精品久久久久久久久久 | 国产精品815.cc红桃| 24小时成人在线视频| 福利视频一区二区| 成年人视频网站免费| 国产三级视频在线播放线观看| 国产一区二区三区美女| 国产ts人妖一区二区三区| 加勒比av在线播放| 成人综合久久| 亚洲欧美色图片| 无码任你躁久久久久久老妇| 国产精品一区二区三区四区在线观看 | 久久精品视频6| 99国产精品免费视频观看| 日韩毛片中文字幕| 精品国产免费久久久久久婷婷| 久久爱.com| 欧美性猛交xxxx富婆| 轻点好疼好大好爽视频| 成年视频在线观看| 国产精品久久久久久久久晋中| 久久久久无码国产精品一区| 蜜臀av午夜精品| 国产精品羞羞答答xxdd| 国产日韩欧美在线观看| 日韩欧美国产另类| 久久综合亚州| 国产成人精品一区二区在线| 69成人免费视频| 99国产精品视频免费观看一公开 | 亚洲欧美国产另类| 国产三级国产精品| 欧美日韩看看2015永久免费| 亚洲激情视频在线播放| 欧美做受高潮中文字幕| 亚洲午夜免费| 欧美精品一区二区三区在线播放 | 国产香蕉精品| 亚洲福利视频免费观看| 亚洲av永久无码精品| 福利在线一区| 亚洲精品videossex少妇| 亚洲一二三四五| 动漫av一区| 亚洲精品国产美女| 国产精品无码一区二区三区| 亚洲桃色综合影院| 国产亚洲成精品久久| 丰满的亚洲女人毛茸茸| 99久久99热这里只有精品| 久久久av网站| 久久久久国产精品夜夜夜夜夜| 狠狠88综合久久久久综合网| 国产91|九色| 免费在线不卡av| 精品一区二区日韩| 99久久综合狠狠综合久久止 | 国产成人久久精品一区二区三区| 日韩一区二区三区av| 色诱av手机版| 免费黄色成人| 日韩少妇与小伙激情| 久久久精品国产sm调教网站| 国产精品一页| 国产综合久久久久| 天堂av2024| 亚洲国产精品t66y| 男女裸体影院高潮| 涩涩在线视频| 在线播放91灌醉迷j高跟美女| 性生交大片免费看l| 伊人久久大香线蕉av不卡| 色婷婷综合久久久久| 国产一级生活片| 日韩国产欧美在线播放| 亚洲自拍欧美色图| 色哟哟在线观看| 亚洲日本在线a| 国产v片免费观看| 四虎在线精品| 日韩av在线直播| 91禁男男在线观看| 99精品国产一区二区青青牛奶| 国产精品国产福利国产秒拍| 亚洲欧美国产高清va在线播放| 久久久久9999亚洲精品| 亚洲精品国产suv一区88| 日本综合字幕| 精品久久一区二区| 国产91在线播放九色| 日韩亚洲国产欧美| 91影院在线免费观看视频| 欧美91精品久久久久国产性生爱| 亚洲精品中文在线影院| 蜜臀视频一区二区三区| 久久悠悠精品综合网| 久久久91精品| 中文字幕日本人妻久久久免费 | 国产专区一区二区| 免费av毛片在线看| 91黄色免费网站| 精品一区二区视频在线观看| 欧美一区免费| 国产中文字幕日韩| 大乳在线免费观看| 欧美日韩亚洲激情| 动漫美女无遮挡免费| 亚洲欧美在线专区| 国产日产欧美a一级在线| 久久视频www| 欧美日韩色婷婷| 伊人久久一区二区三区| 综合国产在线| 51午夜精品| 成人福利片网站| 欧美美女视频在线观看| 在线观看国产精品一区| 男女精品视频| 久久手机视频| 特黄毛片在线观看| 日韩hd视频在线观看| 久久综合激情网| 国产不卡视频一区二区三区| 日本一区二区三区四区五区六区| 欧美一级在线| 色偷偷噜噜噜亚洲男人| 一级特黄录像免费看| 中文无字幕一区二区三区| 激情五月亚洲色图| 女厕嘘嘘一区二区在线播放| 欧美性受xxxx白人性爽| 香蕉国产在线视频| 疯狂做受xxxx欧美肥白少妇 | 日韩欧美天堂| 国产91精品不卡视频| 少妇高潮一区二区三区99小说| 夜色激情一区二区| 久草免费资源站| 亚洲成人中文| 久久久精品有限公司| 亚洲最大网站| 亚洲午夜久久久久久久| 波多野结衣网站| 中文字幕欧美日本乱码一线二线| 激情内射人妻1区2区3区| 少妇一区二区视频| 国产精品久久综合av爱欲tv| 五月天婷婷在线视频| 欧美精品v国产精品v日韩精品| 亚洲xxxx3d动漫| 国产麻豆视频精品| 国产乱淫av片杨贵妃| 日韩在线你懂的| 国产成人精品一区二区三区| 男人的天堂在线视频免费观看 | 国产成人激情小视频| 国产最新视频在线观看| 欧美日韩第一区日日骚| 国产97免费视频| 成人黄页毛片网站| 狠狠爱免费视频| 日韩www.| 国产高清在线精品一区二区三区| 在线毛片观看| 日韩中文字幕第一页| 国产激情久久久久久熟女老人av| 亚洲成av人**亚洲成av**| 爱爱免费小视频| 精品一区二区在线视频| 日本中文字幕在线视频观看| 国产伦一区二区三区| 亚洲专区国产精品| 全亚洲第一av番号网站| 欧美成年人视频网站欧美| 日本美女一级片| 欧美图区在线视频| 久久精品国产亚洲AV无码男同| 久久久国产一区二区三区四区小说| 可以看污的网站| 在线观看的日韩av| 日本欧美精品久久久| 日韩区一区二| 国产成人极品视频| 成人影音在线| 日韩在线视频网| 亚洲欧美日韩免费| 欧美精品在线观看播放| 亚洲免费在线观看av| 亚洲少妇中出一区| 色呦呦一区二区| 国产一区二区三区视频在线播放| 欧美日韩亚洲一| 欧美一区亚洲| 欧洲久久久久久| 9l视频自拍九色9l视频成人| 国产精品久久久久久久久免费看| 国产精品偷拍| 久久成人精品视频| 超碰97在线免费观看| 日韩电影中文 亚洲精品乱码| 一级做a爱片久久毛片| 欧美性高跟鞋xxxxhd| 青青草精品在线视频| 国产精品美女久久福利网站| 免费黄色在线视频| 成人性视频免费网站| 男生操女生视频在线观看| 日韩精品免费视频人成| 一二三四视频社区在线| 红桃视频亚洲| 久久久天堂国产精品| 婷婷伊人综合| 亚洲美女搞黄| 精品色999| 日产国产精品精品a∨| 日韩手机在线| 国产精品一区二区a| 亚洲啊v在线免费视频| 成人黄色免费片| 91精品一区| 国产精品视频久| 国产精品久久久久久妇女| 日本欧美一级片| 中文在线аv在线| 欧美一级片久久久久久久| 成年男女免费视频网站不卡| 欧美激情一区二区三级高清视频| av在线官网| 欧美精品在线免费播放| av网站大全在线| 精品中文字幕在线2019| 日本片在线看| 91国内揄拍国内精品对白| 超碰在线最新网址| 久久久久久香蕉网| 9999热视频在线观看| 韩剧1988在线观看免费完整版| 98色花堂精品视频在线观看| 欧美性在线视频| 另类中文字幕国产精品| 国产精品久久久久久影视| 日本中文字幕视频一区| 亚洲一区二区三区毛片 | 日韩精品一区二区三区三区免费 | 69成人免费视频| 在线观看免费成人| 一级片免费观看视频| 日韩亚洲欧美一区| 男人的天堂a在线| 日韩精品极品毛片系列视频| 国产在线一二| 精品国产一区二区在线| 国产偷倩在线播放| 欧美中文字幕视频在线观看| 播放一区二区| 7777精品久久久大香线蕉小说| 精品亚洲自拍| 亚洲蜜桃在线| 在线国产欧美| 国产小视频精品| 国产精品一二三在| free性中国hd国语露脸| 国产精品美女久久久久aⅴ| 久久久一二三区| 色欧美乱欧美15图片| 国产精品国产av| 亚洲国产精品电影在线观看| 亚洲国产综合一区| 精品国产91乱码一区二区三区| 男人久久精品| www.色综合| 岛国av在线播放| 国产一区玩具在线观看| 成人性生交大片免费看中文视频| 久久er99热精品一区二区三区| 日韩欧美高清在线播放| 国产一级不卡视频| 久久99伊人| 最好看的中文字幕| 久久亚洲综合av| 国产高潮流白浆| 欧美影院一区二区| 亚洲乱码国产乱码精品精软件| 亚洲欧美在线第一页| 欧美一区二区三区| 欧美在线观看网址综合| 豆花视频一区| 亚洲精品一区二区三区四区五区| 欧美精品1区| 欧美黑人又粗又大又爽免费| 成人综合婷婷国产精品久久 | 特级西西444www大精品视频免费看| 欧美日韩中字一区| 五月色婷婷综合| 欧美精品日韩三级| 欧美影视资讯| 成人在线视频网址| 久久蜜桃av| 哪个网站能看毛片| 成人免费视频视频| 我要看黄色一级片| 亚洲不卡av一区二区三区| 国产免费一区二区三区最新不卡 | 成人短视频在线| 国产精品久久久久久久天堂| 日韩电影在线观看完整免费观看| 正在播放国产精品| 噜噜噜躁狠狠躁狠狠精品视频| gogo亚洲国模私拍人体| 国产精品伦一区| 黄色一级片免费在线观看| 精品少妇一区二区三区日产乱码 | sm在线播放| 国产免费一区视频观看免费 | 欧美一区二区在线免费观看| av在线天堂| 国产91久久婷婷一区二区| 国产96在线亚洲| 女同性恋一区二区| 久久成人免费电影| 国产成人免费观看网站| 亚洲国产成人av| 国产精品久久久久久久成人午夜| 在线播放亚洲激情| 91精品影视| 奇米888一区二区三区| 宅男噜噜噜66国产日韩在线观看| 韩国三级在线看| 亚洲一区二区视频在线观看| 国产高清精品软件丝瓜软件| 欧美大片免费观看在线观看网站推荐| 四虎在线精品| 日韩精品第1页| 国产在线精品国自产拍免费| 少妇高潮在线观看| 欧美一区二区免费视频| 蜜桃视频在线观看www社区| 51成人做爰www免费看网站| 亚洲久久久久| 麻豆传媒在线看| 亚洲一区自拍偷拍| 黄色av网址在线| 国产91精品久| av一区二区在线播放| 1024精品视频| 中文子幕无线码一区tr| 中文字幕乱码视频| 久久亚洲成人精品| 精品午夜视频| 国产精品国产对白熟妇| www.成人在线| 在线免费观看国产精品| 亚洲最新在线视频| 国产麻豆一区| 中文字幕の友人北条麻妃| 国产成人精品在线看| 国产成人愉拍精品久久| 亚洲老板91色精品久久| xxxxx.日韩| 99久热在线精品视频| 国产成人免费网站| 日韩网红少妇无码视频香港| 亚洲男人av在线| 2019中文亚洲字幕| 欧美图片激情小说| 久久精品一区二区三区四区| 中文字幕+乱码+中文| 欧美极品少妇xxxxⅹ免费视频| 免费福利视频一区| 免费看黄色一级大片| 亚洲日本韩国一区| 少妇高潮久久久| 国产精品视频999| 欧美91福利在线观看| 2一3sex性hd| 欧美手机在线视频| √最新版天堂资源网在线| 国产精品区一区|