这周写了一下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);
}