卢阿涛 · 2021年12月26日

【XR806开发板试用】串口驱动JQ8900播放音乐

一、硬件连接

1.JQ8900引脚定义

image.png
通过阅读JQ8900的数据手册,可以了解到驱动JQ8900有许多种方式,IO驱动,一线串口驱动(VPP),两线串口驱动(RX,TX),这里我使用两线串口驱动。所以我需要连接到XR806开发板的一组串口上。

2.XR806开发板串口

通过查阅手册可以知道XR806有3组串口, 我选择串口1进行通信,也就是PB14,PB15引脚。
image.png

3.开发板和模块连接

我们只需要将开发板的PB15引脚接到JQ8900模块的TX引脚,开发板的PB14引脚接到JQ8900模块的RX引脚。
image.png

二、软件编写

1.程序思路

通过串口1驱动JQ8900模块播放音乐,通过XR806的按键去控制音乐的切换(播放,暂停,上一曲,下一曲,停止等),每按下一次按键,XR806板载LED就会进行一次取反操作,用来显示按键按下效果。

2.创建工程结构

目录结构如下面红框所示。
image.png

3.编写代码

1.key.h

#ifndef _KEY_H
#define _KEY_H

#define GPIO_ID_PA11 11
#define GPIO_ID_PA21 21



extern 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_H

extern 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_ID

static OS_Thread_t g_main_thread;

static int uart_init(void)
{
    HAL_Status status = HAL_ERROR;
    UART_InitParam param;

    param.baudRate = 9600;   // 波特率为9600
    param.dataBits = UART_DATA_BITS_8;
    param.stopBits = UART_STOP_BITS_1;
    param.parity = UART_PARITY_NONE;
    param.isAutoHwFlowCtrl = 0;

    status = HAL_UART_Init(UARTID, &param);
    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_cflags



   include_dirs = board_include_dirs

   include_dirs += [

      "//kernel/liteos_m/kernel/arch/include",

      "include",

      "//base/iot_hardware/peripheral/interfaces/kits",

   ]

}

7.修改ohosdemo/BUILD.gn

image.png

三、编译,下载。

image.png
下载过程我就不写了,可以去看上一篇文章。

四、效果

1.终端输出

image.png

2.视频展示

https://www.youku.com/video/X...

视频链接

推荐阅读
关注数
13823
内容数
139
全志XR806开发板相关的知识介绍以及应用专栏。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息