精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

香蕉久久网站| 成人短视频在线观看| 99精品国产福利在线观看免费 | 国产黄色av网站| 一区久久精品| 亚洲精品www久久久| 天天操天天摸天天爽| 菠萝菠萝蜜在线视频免费观看| 成人h动漫精品| 国产精品久久久久久久久久新婚| 欧美人妻一区二区| 精品日韩欧美一区| 亚洲第一区第二区| 一本一道久久a久久综合蜜桃| 久久青草伊人| 亚洲欧美激情插| 欧美日韩一区在线观看视频| 国产片在线播放| 日日夜夜精品视频天天综合网| 久久99久久99精品免观看粉嫩| 黑人巨大精品欧美| 亚洲一二三区视频| 在线不卡欧美精品一区二区三区| 天天摸天天碰天天添| 黄页网站在线| 亚洲精品中文字幕在线观看| 日韩av电影免费在线观看| 欧美熟妇交换久久久久久分类| 美女在线观看视频一区二区| 欧美最猛性xxxxx免费| 国产小视频在线观看免费| 国产精品99在线观看| 亚洲欧洲中文天堂| 日韩片在线观看| av成人资源| 91麻豆精品国产| 啊啊啊国产视频| 欧美日韩免费看片| 欧美日韩在线免费| 久久精品国产sm调教网站演员| 自拍亚洲图区| 亚洲精品自拍动漫在线| 天天干天天色天天爽| 日本在线观看免费| 国产精品女人毛片| 少妇特黄a一区二区三区| 欧美色18zzzzxxxxx| www.日韩大片| 久久96国产精品久久99软件| 黄色片网站免费在线观看| 成人小视频在线| 91pron在线| av免费在线不卡| 国产精品一二三区在线| 成人18视频| 免费av一级片| xnxx国产精品| 欧美一区免费视频| 国产精品麻豆一区二区三区| 亚洲国产激情av| 中文字幕在线亚洲精品| 成人国产免费电影| 亚洲影视在线播放| 18禁免费观看网站| 欧美va在线观看| 69堂精品视频| 亚洲一区和二区| 久久99偷拍| 亚洲欧美日韩一区二区在线| 熟女少妇内射日韩亚洲| 97在线精品| 久久91精品国产| 免费在线观看黄网站| 久久亚洲影院| 国产在线观看精品| 午夜精品久久久久久久99老熟妇| 成人高清在线视频| 日本一区二区三区视频在线播放| 麻豆影视国产在线观看| 尤物视频一区二区| 国产亚洲欧美在线视频| 日韩欧美精品一区二区综合视频| 欧美绝品在线观看成人午夜影视| 中文字幕在线播放一区二区| 欧美wwwwww| 在线视频日韩精品| 久久黄色小视频| 久久一区二区三区超碰国产精品| 成人免费淫片视频软件| 人妻少妇一区二区三区| 亚洲国产精品成人综合| 国产欧美久久久久| 免费成人美女女| 日韩女优视频免费观看| 亚洲天堂网一区二区| 四虎成人av| 97超视频免费观看| 亚洲系列在线观看| www.欧美.com| 国产精品99久久久久久大便| 老司机深夜福利在线观看| 欧美日韩精品免费观看视频| 久久久久成人精品无码中文字幕| 日本激情一区| 欧美在线观看一区二区三区| 国产欧美第一页| 国产日韩三级在线| 99er在线视频| 日韩毛片免费视频一级特黄| 精品视频在线播放色网色视频| 亚洲欧美小视频| 日韩精品高清不卡| 精品国产91亚洲一区二区三区www| 成人不用播放器| 欧美日韩一区免费| 日本一区二区免费视频| 一本精品一区二区三区| 日韩免费av一区二区| 成人毛片视频免费看| 国产精品麻豆视频| 日韩中文字幕免费在线| 电影一区二区在线观看| 久久精品最新地址| 中文字幕+乱码+中文乱码www| 99久久伊人久久99| 日本高清视频免费在线观看| 日本在线视频一区二区| 国产视频欧美视频| 日韩污视频在线观看| 国产suv精品一区二区883| 亚洲无玛一区| 欧洲成人一区| 亚洲视频欧美视频| 最新中文字幕一区| www.成人在线| 婷婷五月综合缴情在线视频| 精品国产三区在线| 欧美精品一区在线播放| 国产美女自慰在线观看| 国产精品久久久久久久久免费桃花| 国产精品亚洲二区在线观看| 好吊妞国产欧美日韩免费观看网站 | 亚洲aa在线观看| 超碰人人在线| 欧美一区二区高清| 欧美成人三级视频| 高清在线成人网| 黄网站欧美内射| 久久久亚洲欧洲日产| 97色在线观看| 男人av在线| 在线视频你懂得一区二区三区| 黄色a一级视频| 老司机精品福利视频| 日本午夜一区二区三区| 免费在线观看一区| 最近的2019中文字幕免费一页| 国产无遮挡又黄又爽又色视频| 国产欧美一区二区精品婷婷| 国内外成人免费在线视频| 久久高清精品| 亚洲尤物视频网| 高清电影在线观看免费| 日韩久久精品成人| 亚洲大尺度在线观看| 国产精品视频你懂的| 红桃视频一区二区三区免费| 精品99视频| 人禽交欧美网站免费| 欧美aaa级| 欧美老妇交乱视频| 神马精品久久| 欧美日韩一区二区三区免费看| 制服丨自拍丨欧美丨动漫丨| 国产在线视频一区二区三区| 欧美综合在线播放| 欧美猛男男男激情videos| 国产精品第一页在线| av毛片在线| 亚洲国产欧美久久| 最近中文字幕在线免费观看| 一区二区在线电影| 30一40一50老女人毛片| 国产综合久久久久影院| 分分操这里只有精品| 国产一区二区三区网| 亚洲自拍另类欧美丝袜| 小h片在线观看| 久久精品成人欧美大片古装| 人妻妺妺窝人体色www聚色窝| 色成年激情久久综合| 日本黄色片免费观看| 91蜜桃免费观看视频| 日本77777| 国产精品日本| 欧美 国产 精品| 亚洲伊人春色| 99久久99| 欧美日韩伦理一区二区| 69精品小视频| www.久久ai| 亚洲欧美一区二区三区四区 | 日韩毛片免费观看| 欧美精品一区三区| 国产九九在线| 亚洲国产日韩欧美综合久久 | 国产乱理伦片在线观看夜一区 | 久久成人18免费观看| 成年人午夜视频在线观看| 天天综合亚洲| 日韩欧美一区二区三区四区五区| 粉嫩av一区二区| 成人情趣片在线观看免费| 国模套图日韩精品一区二区| 欧美黑人xxxx| 91三级在线| 日韩中文字幕欧美| 国产特黄在线| 国产丝袜一区二区| 高h调教冰块play男男双性文| 欧美日本视频在线| 在线免费观看国产精品| 欧美视频在线观看免费| 久久精品国产亚洲AV无码麻豆| 亚洲视频在线观看一区| 无码人妻丰满熟妇啪啪欧美| www成人在线观看| 99精品一区二区三区无码吞精| 国产激情精品久久久第一区二区| 中文字幕永久有效| 久久66热re国产| 深夜黄色小视频| 日韩精品1区2区3区| av免费在线播放网站| 亚洲一区区二区| 2022亚洲天堂| 午夜亚洲伦理| 日韩毛片在线免费看| 亚洲综合好骚| 日韩在线xxx| 久久久久网站| 国产激情在线观看视频| 日韩电影在线一区| 国产情侣av自拍| 日韩不卡一二三区| 亚洲最大综合网| 久久精品国产99国产| 男人午夜视频在线观看| 国产高清无密码一区二区三区| 四川一级毛毛片| 国产成人精品亚洲午夜麻豆| 妖精视频一区二区| 成人avav在线| 插吧插吧综合网| 国产色91在线| 国产精品suv一区二区88| 成人欧美一区二区三区视频网页| 麻豆天美蜜桃91| 一区二区三区不卡视频在线观看| 久草成人在线视频| 午夜精品久久久久久久99樱桃| 亚洲男人第一av| 色欧美日韩亚洲| 伊人久久亚洲综合| 欧美一区二区久久| 人妻与黑人一区二区三区| 亚洲高清免费观看高清完整版| 欧美在线一卡| 色偷偷偷亚洲综合网另类 | 亚洲欧美日本在线| 国产第一页在线播放| 狠狠躁夜夜躁久久躁别揉| 欧美日韩a v| 91精品国产高清一区二区三区蜜臀| 国产丰满美女做爰| 精品无人区乱码1区2区3区在线| 加勒比一区二区三区在线| 两个人的视频www国产精品| 2021天堂中文幕一二区在线观| 日本aⅴ大伊香蕉精品视频| 九九热这里有精品| 国产精品swag| 久久免费大视频| 妺妺窝人体色www看人体| 噜噜噜91成人网| 91丨porny丨九色| www国产精品av| 欧美精品一级片| 日韩欧美在线第一页| 国产三级午夜理伦三级| 亚洲精品国精品久久99热一| 黄色av电影在线观看| 欧美一区二区大胆人体摄影专业网站| 青青国产精品| 久久亚洲高清| 亚洲综合五月| 一区二区三区国产免费| 懂色av中文字幕一区二区三区| 怡红院一区二区三区| 一区二区在线观看不卡| 中国精品一区二区| 亚洲精品久久7777777| av大大超碰在线| 国产精品欧美日韩一区二区| 精品中国亚洲| 欧洲金发美女大战黑人| 蜜桃视频一区二区| 中文字幕日韩三级片| 亚洲影院在线观看| 一道本在线视频| 亚洲天堂色网站| av白虎一区| 91入口在线观看| 欧美艳星介绍134位艳星| aa在线免费观看| 粉嫩高潮美女一区二区三区| 国产精品久久久免费看| 欧美性xxxxx极品少妇| 天堂成人在线视频| 欧美第一黄网免费网站| 天天综合91| 亚洲激情啪啪| 日韩精品高清不卡| 男人天堂av电影| 欧美视频一二三| 污视频软件在线观看| 欧美精品久久久久久久| 亚洲国产中文在线二区三区免| 亚洲午夜精品一区二区 | 亚洲精品中文字幕乱码无线| 国产亚洲1区2区3区| av毛片在线免费观看| 日韩av最新在线观看| 99色在线观看| 国产一区喷水| 亚洲日本欧美| 给我免费观看片在线电影的| 亚洲国产精品人人做人人爽| 高清国产mv在线观看| 欧美精品999| 国产精品videossex| 欧美人成在线观看| aa级大片欧美| 日韩精品1区2区| 日韩av在线看| 成人午夜视屏| 水蜜桃一区二区三区| 美女视频黄 久久| 男人av资源站| 欧美一区二区三区在线观看视频| 成人免费视屏| 91视频网页| 亚洲国产一区二区精品专区| 538国产视频| 色老综合老女人久久久| 在线免费观看黄| 91系列在线观看| 国产精品观看| 内射中出日韩无国产剧情| 色综合激情五月| av影片免费在线观看| 亚洲自拍另类欧美丝袜| 亚洲激情成人| 男人天堂av电影| 欧美精品在线观看一区二区| 免费污视频在线| 欧美区高清在线| 久久99精品久久久久| 免费人成年激情视频在线观看| 亚洲精品久久久久久久久久久| 成人黄色免费短视频| 免费久久久久久| 不卡的av中国片| 国产精品无码粉嫩小泬| 久久国产精品电影| 成人台湾亚洲精品一区二区| 人妻丰满熟妇av无码区app| 国产精品女人毛片| 黄色av免费观看| 国产精品国产亚洲伊人久久| 一区二区三区国产精华| 88av在线播放| 在线观看国产91| 色呦呦在线看| 欧洲av一区| 国产成人精品免费一区二区| 看片网址国产福利av中文字幕| 自拍偷拍亚洲在线| av综合网站| 欧美精品久久久久久久久25p| 一区二区三区中文字幕精品精品| 欧美日韩国产中文字幕在线| 91久久精品美女高潮| 男女av一区三区二区色多| 91精品国产闺蜜国产在线闺蜜| 日韩精品视频在线观看免费| av成人在线网站| 国产成人av影视| 婷婷丁香久久五月婷婷| 免费在线你懂的|