STM32驱动OTP语音芯片NV020C。控制程序实现按键驱动和一线串口驱动NV020C,语音芯片使用广州九芯电子有限公司产品,该公司语音芯片丰富,有OTP以及FLASH+主控芯片多种产品;由于对方服务态度很好,支持审样,实验中还送了一个喇叭,并帮忙焊接了部分外围芯片,借此帮他们公司做个宣传。感谢朋友们多多支持。
NV020C.H文件
#include "stm32f10x.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//STM32开发板
//修改日期:2014/11/26
//版本:V1.4
//版权所有,盗版必究。
//Copyright(C) shiny 2014-2029
//All rights reserved
//********************************************************************************
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)*((volatile unsigned long*)(addr))
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
//IO口地址映射
#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C
#define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C
#define GPIOC_ODR_Addr (GPIOC_BASE+12) //0x4001100C
#define GPIOD_ODR_Addr (GPIOD_BASE+12) //0x4001140C
#define GPIOE_ODR_Addr (GPIOE_BASE+12) //0x4001180C
#define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C
#define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C
#define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808
#define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08
#define GPIOC_IDR_Addr (GPIOC_BASE+8) //0x40011008
#define GPIOD_IDR_Addr (GPIOD_BASE+8) //0x40011408
#define GPIOE_IDR_Addr (GPIOE_BASE+8) //0x40011808
#define GPIOF_IDR_Addr (GPIOF_BASE+8) //0x40011A08
#define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08
//IO口操作,只对单一的IO口!
//确保n的值小于16!
#define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n)//输出
#define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n)//输入
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n)//输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n)//输入
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)//输出
#define PCin(n) BIT_ADDR(GPIOC_IDR_Addr,n)//输入
#define PDout(n) BIT_ADDR(GPIOD_ODR_Addr,n)//输出
#define PDin(n) BIT_ADDR(GPIOD_IDR_Addr,n)//输入
#define PEout(n) BIT_ADDR(GPIOE_ODR_Addr,n)//输出
#define PEin(n) BIT_ADDR(GPIOE_IDR_Addr,n)//输入
#define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n)//输出
#define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n)//输入
#define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n)//输出
#define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n)//输入
//电源和地是需要接的,不多说。 SDA - PB9
#define SOUND_SDA PBout(9) // 数据
extern void Sound_IO_Init(void);
extern void Sound_Send(unsigned char addr);
NV020C.C文件
#include "NV020C.h"
#include "stdlib.h"
#include "delay.h"
//////////////////////////////////////////////////////////////////////////////////
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//STM32开发板
// 驱动IC驱动代码
//驱动方式:1线串口
//版权所有,盗版必究。
//All rights reserved
/////////////////////////////初始化NV020C相连的IO口///////////////////////////////
void Sound_IO_Init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出 SDA - PB9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
///////////////////////地址发送函数,播放音频芯片中的声音//////////////////////////
void Sound_Send(unsigned char addr)
{
char i;
SOUND_SDA=0;
delay_us(1500); //wait(2500); // 2.5ms
delay_us(1000);
for(i=0;i<8;i++)
{
SOUND_SDA=1;
if(addr&0x01) // 1
{
delay_us(1500); // 1500us
SOUND_SDA=0;
delay_us(500); // 500us
}
else // 0
{
delay_us(500);
SOUND_SDA=0;
delay_us(1500);
}
addr>>=1;
}
SOUND_SDA=1;
}
主函数:
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int main(void)
{
/* Add your application code here*/
unsigned char G_un8Addr;
LED_GPIO_Config();
delay_init(72); //延时初始化
Sound_IO_Init(); //初始化语音芯片NV020C
G_un8Addr = 0;
/* Infinite loop */
while(1)
{
////////////1. LED灯闪烁 ////////////////
LED4_OFF;
delay_ms(1500); //延时1.5s
LED4_ON;
delay_ms(1500); //延时1.5s
Sound_Send(G_un8Addr);
G_un8Addr++;
if(G_un8Addr>12) G_un8Addr = 10;
}
}
按键和一线串口驱动连接图如下:
