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;               
   }
}
按键和一线串口驱动连接图如下:
 
