一、硬件连接
1.JQ8900引脚定义
通过阅读JQ8900的数据手册,可以了解到驱动JQ8900有许多种方式,IO驱动,一线串口驱动(VPP),两线串口驱动(RX,TX),这里我使用两线串口驱动。所以我需要连接到XR806开发板的一组串口上。
2.XR806开发板串口
通过查阅手册可以知道XR806有3组串口, 我选择串口1进行通信,也就是PB14,PB15引脚。
3.开发板和模块连接
我们只需要将开发板的PB15引脚接到JQ8900模块的TX引脚,开发板的PB14引脚接到JQ8900模块的RX引脚。
二、软件编写
1.程序思路
通过串口1驱动JQ8900模块播放音乐,通过XR806的按键去控制音乐的切换(播放,暂停,上一曲,下一曲,停止等),每按下一次按键,XR806板载LED就会进行一次取反操作,用来显示按键按下效果。
2.创建工程结构
目录结构如下面红框所示。
3.编写代码
1.key.h
#ifndef _KEY_H
#define _KEY_H#define GPIO_ID_PA11 11
#define GPIO_ID_PA21 21extern uint8_t key_status ;
extern uint8_t key_value;void key_init(void);
void key_scan(void);#endif
2.key.c
#include <stdio.h>
#include "ohos_init.h" //
#include "kernel/os/os.h"
#include "iot_gpio.h" //
#include "key.h"uint8_t key_status = 1;
uint8_t key_value = 0;void key_init(void)
{printf("key test start\r\n");IoTGpioInit(GPIO_ID_PA11); // 初始化IO口,io口复位为悬空输入IoTGpioSetDir(GPIO_ID_PA11, IOT_GPIO_DIR_IN); IoTGpioInit(GPIO_ID_PA21); // 初始化IO口,io口复位为悬空输入IoTGpioSetDir(GPIO_ID_PA21, IOT_GPIO_DIR_OUT); // 设置IO口为输出模式}void key_scan(void)
{uint8_t keyVal = 1;uint8_t ledVal = 0;IoTGpioGetInputVal(GPIO_ID_PA11,&keyVal);// printf("keyVal:%d\r\n",keyVal);if(keyVal == 0){OS_MSleep(10);IoTGpioGetInputVal(GPIO_ID_PA11,&keyVal);if(keyVal == 0){key_status = 1;key_value ++;if(key_status == 5)key_value = 1;// 按键执行操作IoTGpioGetOutputVal(GPIO_ID_PA21,&ledVal);// printf("ledVal:%d\r\n",ledVal);if(ledVal == 1){IoTGpioSetOutputVal(GPIO_ID_PA21, 0); // printf(" set 0\r\n"); }else{IoTGpioSetOutputVal(GPIO_ID_PA21, 1); // printf(" set 1\r\n");}// IoTGpioGetOutputVal(GPIO_ID_PA21,ledVal);// printf("ledVal set after:%d\r\n",ledVal);while(keyVal == 0){IoTGpioGetInputVal(GPIO_ID_PA11,&keyVal);}}}
}
3.JQ8900.h
#ifndef _JQ8900_H
#define _JQ8900_Hextern const uint8_t play_Buffer[4];
extern const uint8_t pause_Buffer[4];
extern const uint8_t stop_Buffer[4];
extern const uint8_t previous_Buffer[4];
extern const uint8_t next_Buffer[4];#endif
4.JQ8900.c
#include <stdio.h>
#include "ohos_init.h" //
#include "kernel/os/os.h"
#include <string.h>
#include "driver/chip/hal_uart.h"
#include "JQ8900.h"#define UARTID UART1_ID/* 音量为0-30级 上电默认为20 */
uint8_t JQ8900Volume = 20; const uint8_t play_Buffer[4] = {0xAA,0x02,0x00,0xAC};
const uint8_t pause_Buffer[4] = {0xAA,0x03,0x00,0xAD};
const uint8_t stop_Buffer[4] = {0xAA,0x04,0x00,0xAE};
const uint8_t previous_Buffer[4] = {0xAA,0x05,0x00,0xAF};
const uint8_t next_Buffer[4] = {0xAA,0x06,0x00,0xB0};
/* 其他命令请查看数据手册*//* 串口发送一个字节 */
void JQ8900_SendChar(char val)
{HAL_UART_Transmit_Poll(UARTID, (uint8_t *)val, 1);
}
5.main.c
#include <stdio.h>
#include "ohos_init.h" //
#include "kernel/os/os.h"
#include "iot_gpio.h" //
#include <string.h>
#include "driver/chip/hal_uart.h"
#include "key.h"
#include "JQ8900.h"#define UARTID UART1_IDstatic OS_Thread_t g_main_thread;static int uart_init(void)
{HAL_Status status = HAL_ERROR;UART_InitParam param;param.baudRate = 9600; // 波特率为9600param.dataBits = UART_DATA_BITS_8;param.stopBits = UART_STOP_BITS_1;param.parity = UART_PARITY_NONE;param.isAutoHwFlowCtrl = 0;status = HAL_UART_Init(UARTID, ¶m);if (status != HAL_OK)printf("uart init error %d\n", status);return status;
}static void MainThread(void *arg)
{key_init(); uart_init();printf("you can connect to uart1 serial com.\n");printf("uart%d used for echo.\n", UARTID);while (1) {key_scan();if(key_status == 1){ // 按键按下,可以进行操作key_status = 0;switch(key_value){case 0:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)play_Buffer, 4);break;case 1:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)pause_Buffer, 4);break;case 2:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)play_Buffer, 4);break;case 3:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)previous_Buffer, 4);break;case 4:HAL_UART_Transmit_Poll(UARTID, (uint8_t *)next_Buffer, 4);break;} }}
}void UARTMain(void)
{printf("UART Test Start\n");if (OS_ThreadCreate(&g_main_thread, "MainThread", MainThread, NULL,OS_THREAD_PRIO_APP, 4 * 1024) != OS_OK) {printf("[ERR] Create MainThread Failed\n");}
}SYS_RUN(UARTMain); // Harmony线程入口
6.BUILD.gn
import("//device/xradio/xr806/liteos_m/config.gni")static_library("app_uart") {configs = []sources = ["src/main.c","src/JQ8900.c","src/key.c",]cflags = board_cflagsinclude_dirs = board_include_dirsinclude_dirs += ["//kernel/liteos_m/kernel/arch/include","include","//base/iot_hardware/peripheral/interfaces/kits",]}
7.修改ohosdemo/BUILD.gn
三、编译,下载。
下载过程我就不写了,可以去看上一篇文章。
四、效果
1.终端输出
2.视频展示
视频链接