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

本文详细描述了如何通过XR806开发板连接JQ8900模块,使用两线串口进行硬件配置,并通过编程控制音乐播放和LED指示,实现按键控制功能。
摘要由CSDN通过智能技术生成

一、硬件连接

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

在这里插入图片描述

三、编译,下载。

在这里插入图片描述

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

四、效果

1.终端输出

在这里插入图片描述

2.视频展示

视频链接

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux开发板连接串口的步骤如下: 1. 首先,确定电脑自带的串口设备名。对于电脑自带的串口,设备名通常为ttyS0、ttyS1等;对于使用USB转串口的串口扩展设备,设备名为ttyUSB0、ttyUSB1等。可以通过命令"dmesg | grep tty"来查看设备名。 2. 进入主目录,并进入serial port setup配置串口相关参数信息,如波特率、停止位、校验位等。确保设置与开发板的串口参数一致。 3. 保存设置。选择Save setup as dfl将当前设置保存为默认设置,或选择Save setup as df1保存为其他设置。 4. 退出配置菜单。选择Exit退出设置。 5. 下次需要连接串口时,直接输入"minicom"命令即可进入串口连接界面。如果想以普通用户权限进入,需要进行以下操作: - 使用命令"sudo vim /etc/udev/rules.d/70-ttyusb.rules"编辑udev规则文件。 - 在文件中添加如下内容:"KERNEL=="ttyUSB[0-9]*",MODE="0666""。 - 保存文件,并使用命令"sudo chmod 666 /etc/udev/rules.d/70-ttyusb.rules"给予文件可读写权限。 - 重新插入USB转串口设备,普通用户即可连接串口。 6. 如果需要在PC机上通过串口接收开发板发送的文件,可以使用以下步骤: - 切换到目标板的接收路径。 - 按下CTRL A,然后按下Z键,选择zmodem接收模式。 - 查看相关接收文件。 7. 如果需要在开发板上通过串口接收PC机发送的文件,可以使用以下步骤: - 使用cd命令切换到目标文件所在目录。 - 使用rz命令接收文件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [虚拟机主机linux(unbuntu)和开发板使用串口连接以及发送接收文件](https://blog.csdn.net/Feng_8071/article/details/82956200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值