STM32L4单片机连接语音模块NVC的源码

这周写了一下STM32L4的语音模块,使用的语音芯片是NVC系列芯片,提供一下代码给以后需要的朋友们,不喜勿喷。

头文件NVC.h

#ifndef __NVC_H__
#define __NVC_H__

//音源
#define START_VOICE 0x0D
#define DUDU_VOICE 0x01
#define DIDI_VOICE 0x03
#define BELL_VOICE 0x02

//音量大小
#define VOLUME1_VOICE 0xE0
#define VOLUME2_VOICE 0xE1
#define VOLUME3_VOICE 0xE2
#define VOLUME4_VOICE 0xE3
#define VOLUME5_VOICE 0xE4
#define VOLUME6_VOICE 0xE5
#define VOLUME7_VOICE 0xE6
#define VOLUME8_VOICE 0xE7
//循环停止
#define LOOP_VOICE 0xF2
#define STOP_VOICE 0xFE


extern void NVC_Init(void);
extern unsigned char NVC_VoiceSelect(unsigned char voicenum);
extern unsigned char NVC_VolumeControl(unsigned char voiceval);
extern unsigned char NVC_SendCommand(unsigned char addr);
extern unsigned char NVC_SendData(float data);
#endif

NVC.h

#include "stm32l4xx_hal.h"
#include "NVC.h"
#include "stdio.h"

//信号线定义,数据线SDA,忙检测信号线BUSY
#define NVCSDA  VOICE_IO2_Pin
#define NVCBUSY VOICE_OKY1_Pin

unsigned char NVC_SendCommand(unsigned char addr);
unsigned char NVC_DataTransf(float data,unsigned char *addr);
unsigned char NVC_BitTransf(unsigned int bit);
unsigned char NVC_SendData(float data);

/*******************************************************************************
* Function Name  : NVC_Init 
* Description    : NVC初始化
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVC_Init(void)
{
	//配置端口,命令SDA PIN输出,忙检测busy Pin输入上拉
	HAL_GPIO_WritePin(GPIOB, NVCSDA, GPIO_PIN_SET);
	HAL_Delay(3);
	NVC_SendCommand(0x0D);
}

/************************* ******************************************************
发送数据函数,浮点数类型

*******************************************************************************/
unsigned char NVC_SendData(float data){
	NVC_Init();
	HAL_Delay(50000);
	NVC_SendCommand(0x12);
	HAL_Delay(100000);
	unsigned char addr[5];
	NVC_DataTransf(data,addr);
	for(int i=0;i<3;i++){
		NVC_SendCommand(addr[i]);
}
	if(addr[3]!=0){
		NVC_SendCommand(addr[3]);
	}
	if(addr[4]!=0){
		NVC_SendCommand(addr[4]);
	}
	if(data>33.3){
		NVC_SendCommand(0x0F);
	}
	if(data<1.1){
		NVC_SendCommand(0x0E);
	}
}
/************************* ******************************************************
数据类型的转换,浮点型转换为NVC对应芯片中的地址

*******************************************************************************/

unsigned char NVC_DataTransf(float data,unsigned char *addr)
{
	unsigned int Intbit,Decbit;
	Intbit=data*10/10;
	Decbit=data*10-Intbit*10;
	if(Intbit<10||Intbit==10){
		addr[0]=NVC_BitTransf(Intbit);
		addr[1]=0x0A;
		addr[2]=NVC_BitTransf(Decbit);
	}
	else if(Intbit>10&&Intbit<20){
		unsigned int units=Intbit%10; //个位
		addr[0]=0x0B;
		addr[1]=NVC_BitTransf(units);
		addr[2]=0x0A;
		addr[3]=NVC_BitTransf(Decbit);
	}
	else{
		unsigned int tens=Intbit/10; //十位
		unsigned int units=Intbit%10; //个位
		if(units==0){
			addr[0]=NVC_BitTransf(tens);
			addr[1]=0x0B;
			addr[2]=0x0A;
			addr[3]=NVC_BitTransf(Decbit);
		}
		else{
			addr[0]=NVC_BitTransf(tens);
			addr[1]=0x0B;
			addr[2]=NVC_BitTransf(units);
			addr[3]=0x0A;
			addr[4]=NVC_BitTransf(Decbit);
		}
	}
}

/************************* ******************************************************
位选择函数,对应关系

*******************************************************************************/
unsigned char NVC_BitTransf(unsigned int bit)
{
	switch(bit){
		case 0: return 0x00;
		case 1: return 0x01;
		case 2: return 0x02;
		case 3: return 0x03;
		case 4: return 0x04;
		case 5: return 0x05;
		case 6: return 0x06;
		case 7: return 0x07;
		case 8: return 0x08;
		case 9: return 0x09;
		case 10: return 0x0B;
}
}

/************************* ******************************************************
发送地址函数

*******************************************************************************/
unsigned char NVC_SendCommand(unsigned char addr)
{
	unsigned char i;
	//unsigned char ret;
	//ret=HAL_GPIO_ReadPin(GPIOB, NVCBUSY);
	while(HAL_GPIO_ReadPin(GPIOB, NVCBUSY) == 0)
	{};
	//if(ret!=0)
	{
		HAL_GPIO_WritePin(GPIOB, NVCSDA, GPIO_PIN_RESET);
		HAL_Delay(5);//延时5ms
		for(i=0;i<8;i++)
		{
			HAL_GPIO_WritePin(GPIOB, NVCSDA, GPIO_PIN_SET);
			if(addr&0x01)
			{
				//1
				HAL_Delay(3);
				HAL_GPIO_WritePin(GPIOB, NVCSDA, GPIO_PIN_RESET);
				HAL_Delay(1);
			}
			else
			{
				//0	
				HAL_Delay(1);
				HAL_GPIO_WritePin(GPIOB, NVCSDA, GPIO_PIN_RESET);
				HAL_Delay(3);
					
			}
			addr>>=1;
		}
		HAL_GPIO_WritePin(GPIOB, NVCSDA, GPIO_PIN_SET);
	}
	//HAL_Delay(40);
}
		

猜你喜欢

转载自blog.csdn.net/qq_27524749/article/details/89575253