搜索
bottom↓
回复: 9

arm控制语音芯片syn6288播音程序

[复制链接]

出0入0汤圆

发表于 2011-8-12 21:51:53 | 显示全部楼层 |阅读模式
自己写的一个M3的语音芯片程序,语音芯片是syn6288,很多公交车上用的就是这个语音芯片。
#include  "systemInit.h"
#include  "uartGetPut.h"
#include  "stdio.h"
#include  "gpio.h"
#include   "syn6288.h"

extern char text[];

//  定义KEY3(PB5)和KEY4(PA4)
#define  KEY3_PERIPH            SYSCTL_PERIPH_GPIOB
#define  KEY3_PORT              GPIO_PORTB_BASE
#define  KEY3_PIN               GPIO_PIN_5
#define  KEY4_PERIPH            SYSCTL_PERIPH_GPIOA
#define  KEY4_PORT              GPIO_PORTA_BASE
#define  KEY4_PIN               GPIO_PIN_4

//状态为为PA3
#define BUSY_PERIPH            SYSCTL_PERIPH_GPIOA
#define BUSY_PORT               GPIO_PORTA_BASE
#define BUSY_PIN                  GPIO_PIN_3

           

/*
//特殊功能的命令,已经又固定长度且进行了异或校验
//void SendSpecial(char *s,char longth)
//  {
//   char i;
//   for(i=0;i<longyh;i++)
//     uartPutc(s);
  
//}  */


//  KEY3中断初始化
void KEY3IntInit(void)
{
    SysCtlPeriEnable(KEY3_PERIPH);                          //  使能KEY3所在的GPIO端口
    GPIOPinTypeIn(KEY3_PORT, KEY3_PIN);                     //  设置KEY3所在管脚为输出
    GPIOIntTypeSet(KEY3_PORT, KEY3_PIN, GPIO_LOW_LEVEL);    //  设置KEY3的中断类型
   IntPrioritySet(INT_GPIOB, 1 << 5);                      //  设置KEY3中断优先级为1
    GPIOPinIntEnable(KEY3_PORT, KEY3_PIN);                  //  使能KEY3所在管脚的中断
    IntEnable(INT_GPIOB);                                   //  使能GPIOB端口中断
}

//  KEY4中断初始化
void KEY4IntInit(void)
{
    SysCtlPeriEnable(KEY4_PERIPH);                          //  使能KEY4所在的GPIO端口
    GPIOPinTypeIn(KEY4_PORT, KEY4_PIN);                     //  设置KEY4所在管脚为输出
    GPIOIntTypeSet(KEY4_PORT, KEY4_PIN, GPIO_LOW_LEVEL);    //  设置KEY4的中断类型
   IntPrioritySet(INT_GPIOA, 2 << 5);                      //  设置KEY4中断优先级为2
    GPIOPinIntEnable(KEY4_PORT, KEY4_PIN);                  //  使能KEY4所在管脚的中断
    IntEnable(INT_GPIOA);                                   //  使能GPIOA端口中断
}



//  主函数(程序入口)
int main(void)
  {
    jtagWait();                                             //  防止JTAG失效,重要!
    clockInit();                                            //  时钟初始化:晶振,6MHz
    uartInit();                                             //  UART初始化
   
    SysCtlPeriEnable(BUSY_PERIPH);             //初始PA3用于BUSy检测
    GPIOPinTypeIn(BUSY_PORT, BUSY_PIN);
    GPIOPinWrite(BUSY_PORT, BUSY_PIN,0x00);
    KEY3IntInit();                                          //  KEY3中断初始化
    KEY4IntInit();                                          //  KEY4中断初始化
    IntMasterEnable();                                      //  使能处理器中断
   
   
      
    for (;;)
       {  
       //SendToSys6288(text,30);
       //SysCtlDelay(5000*(TheSysClock/3000));                             
      
       }  
  }   



// GPIOB的中断服务函数
void GPIO_Port_B_ISR(void)
{
    unsigned long ulStatus;
    unsigned long ulStatus2=0x00;
    ulStatus = GPIOPinIntStatus(KEY3_PORT, true);           //  读取中断状态
    GPIOPinIntClear(KEY3_PORT, ulStatus);                   //  清除中断状态,重要
//   SendSpecial(busy,5);
    ulStatus2=GPIOPinRead(BUSY_PORT, BUSY_PIN);
    if ((ulStatus & KEY3_PIN)&&(ulStatus2==0x00))                               //  如果KEY3的中断状态有效
    {
        SendToSyN6288(text,46);            //  
        
     //  for (;;);                                           //  死循环,不退出中断服务函数
    }
}

//  GPIOG的中断服务函数
void GPIO_Port_A_ISR(void)
{
    unsigned long ulStatus;
    unsigned long ulStatus2;
    ulStatus = GPIOPinIntStatus(KEY4_PORT, true);           //  读取中断状态
    GPIOPinIntClear(KEY4_PORT, ulStatus);                   //  清除中断状态,重要
    ulStatus2=GPIOPinRead(BUSY_PORT, BUSY_PIN);
    if ((ulStatus & KEY4_PIN)&&(ulStatus2==0x00))                                //  如果KEY4的中断状态有效
    {
        SendToSyN6288(text+46,35);            //  点亮LED4
   //     for (;;);                                           //  死循环,不退出中断服务函数
    }
}
  



syn6288的程序

#include  "systemInit.h"
#include  "uartGetPut.h"
#include  "stdio.h"
#include  "gpio.h"
#include   "syn6288.h"

extern char text[];

//  定义KEY3(PB5)和KEY4(PA4)
#define  KEY3_PERIPH            SYSCTL_PERIPH_GPIOB
#define  KEY3_PORT              GPIO_PORTB_BASE
#define  KEY3_PIN               GPIO_PIN_5
#define  KEY4_PERIPH            SYSCTL_PERIPH_GPIOA
#define  KEY4_PORT              GPIO_PORTA_BASE
#define  KEY4_PIN               GPIO_PIN_4

//状态为为PA3
#define BUSY_PERIPH            SYSCTL_PERIPH_GPIOA
#define BUSY_PORT               GPIO_PORTA_BASE
#define BUSY_PIN                  GPIO_PIN_3

           

/*
//特殊功能的命令,已经又固定长度且进行了异或校验
//void SendSpecial(char *s,char longth)
//  {
//   char i;
//   for(i=0;i<longyh;i++)
//     uartPutc(s);
  
//}  */


//  KEY3中断初始化
void KEY3IntInit(void)
{
    SysCtlPeriEnable(KEY3_PERIPH);                          //  使能KEY3所在的GPIO端口
    GPIOPinTypeIn(KEY3_PORT, KEY3_PIN);                     //  设置KEY3所在管脚为输出
    GPIOIntTypeSet(KEY3_PORT, KEY3_PIN, GPIO_LOW_LEVEL);    //  设置KEY3的中断类型
   IntPrioritySet(INT_GPIOB, 1 << 5);                      //  设置KEY3中断优先级为1
    GPIOPinIntEnable(KEY3_PORT, KEY3_PIN);                  //  使能KEY3所在管脚的中断
    IntEnable(INT_GPIOB);                                   //  使能GPIOB端口中断
}

//  KEY4中断初始化
void KEY4IntInit(void)
{
    SysCtlPeriEnable(KEY4_PERIPH);                          //  使能KEY4所在的GPIO端口
    GPIOPinTypeIn(KEY4_PORT, KEY4_PIN);                     //  设置KEY4所在管脚为输出
    GPIOIntTypeSet(KEY4_PORT, KEY4_PIN, GPIO_LOW_LEVEL);    //  设置KEY4的中断类型
   IntPrioritySet(INT_GPIOA, 2 << 5);                      //  设置KEY4中断优先级为2
    GPIOPinIntEnable(KEY4_PORT, KEY4_PIN);                  //  使能KEY4所在管脚的中断
    IntEnable(INT_GPIOA);                                   //  使能GPIOA端口中断
}



//  主函数(程序入口)
int main(void)
  {
    jtagWait();                                             //  防止JTAG失效,重要!
    clockInit();                                            //  时钟初始化:晶振,6MHz
    uartInit();                                             //  UART初始化
   
    SysCtlPeriEnable(BUSY_PERIPH);             //初始PA3用于BUSy检测
    GPIOPinTypeIn(BUSY_PORT, BUSY_PIN);
    GPIOPinWrite(BUSY_PORT, BUSY_PIN,0x00);
    KEY3IntInit();                                          //  KEY3中断初始化
    KEY4IntInit();                                          //  KEY4中断初始化
    IntMasterEnable();                                      //  使能处理器中断
   
   
      
    for (;;)
       {  
       //SendToSys6288(text,30);
       //SysCtlDelay(5000*(TheSysClock/3000));                             
      
       }  
  }   



// GPIOB的中断服务函数
void GPIO_Port_B_ISR(void)
{
    unsigned long ulStatus;
    unsigned long ulStatus2=0x00;
    ulStatus = GPIOPinIntStatus(KEY3_PORT, true);           //  读取中断状态
    GPIOPinIntClear(KEY3_PORT, ulStatus);                   //  清除中断状态,重要
//   SendSpecial(busy,5);
    ulStatus2=GPIOPinRead(BUSY_PORT, BUSY_PIN);
    if ((ulStatus & KEY3_PIN)&&(ulStatus2==0x00))                               //  如果KEY3的中断状态有效
    {
        SendToSyN6288(text,46);            //  
        
     //  for (;;);                                           //  死循环,不退出中断服务函数
    }
}

//  GPIOG的中断服务函数
void GPIO_Port_A_ISR(void)
{
    unsigned long ulStatus;
    unsigned long ulStatus2;
    ulStatus = GPIOPinIntStatus(KEY4_PORT, true);           //  读取中断状态
    GPIOPinIntClear(KEY4_PORT, ulStatus);                   //  清除中断状态,重要
    ulStatus2=GPIOPinRead(BUSY_PORT, BUSY_PIN);
    if ((ulStatus & KEY4_PIN)&&(ulStatus2==0x00))                                //  如果KEY4的中断状态有效
    {
        SendToSyN6288(text+46,35);            //  点亮LED4
   //     for (;;);                                           //  死循环,不退出中断服务函数
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2011-8-12 21:54:47 | 显示全部楼层
补充,syn6288.c的程序如下,原文粘贴有点失误...
#include  "systemInit.h"
#include "syn6288.h"
#include  "uartGetPut.h"

char text[] = {"[V12]msge欢迎使用中国工商银行自动[3]提款机,soundi您好,请您在听到[3]提示音后留言 soundu,海元114[n1]你好114[t0]!明天你是否会惦记曾经最爱哭的你"};
//char busy[5]={0xfd,0x00,0x02,0x21,0xde}
//  普通文本向SYN6288写数据


void SendToSyN6288(char *s,char longth)
  {
  char xor = 0x00;     //校验码初始
  char head[HEADLEN] = {0xfd,0x00,0x00,0x01,0x10};
  char i;
  head[LEN_OFFSET] = longth + 3;  //,head的第三个字节存储正文长度 计算正文长度(1命令字 + 1命令参数 + 文字长度 + 1校验位)
   for(i = 0; i < HEADLEN; i++)          //发送数据包头(0xFD + 2字节长度 + 1字节命令字 + 1字节命令参数)
     {
     xor ^= head;
     UARTCharPut(UART0_BASE,head);//直接发字符到UART0,最好用函数uartPutc(head);一次一字符
     }
   for(i = 0; i < longth; i++)
     {
     xor ^= s;
//    uartPutc(s);
      UARTCharPut(UART0_BASE,s);
     SysCtlDelay(2*(TheSysClock/3000));
     }
   uartPutc(xor);        //发送校验位,也可以用UARTCharPut那个函数

}

出0入0汤圆

发表于 2012-4-6 20:58:09 | 显示全部楼层
非常不错,学习中。。。。

出0入0汤圆

发表于 2012-4-8 11:16:10 | 显示全部楼层
学习 正准备用这个芯片呢

出0入0汤圆

发表于 2012-4-8 16:04:40 | 显示全部楼层
这个芯片不好用,声音很傻,不是很连贯,,

出0入0汤圆

发表于 2012-4-8 16:20:29 来自手机 | 显示全部楼层
这个芯片确实有点问题,再加入功放后,在播音前后会产生波波声,而且只能用带是能的功放用软件来消除,对声音有要求的地方尽量少用哈

出0入0汤圆

发表于 2012-4-10 12:20:57 | 显示全部楼层
如果成本允许,可以看看科大讯飞的TTS语音芯片:)

出90入372汤圆

发表于 2012-5-4 16:19:11 | 显示全部楼层
语音芯片 学习了!

出0入0汤圆

发表于 2012-12-2 22:40:33 | 显示全部楼层
有用过SYN6658的吗,上传点资料来啊。先谢了!

出0入0汤圆

发表于 2012-12-6 17:38:17 | 显示全部楼层
SYN6288 有点贵,如果考虑成本还是自己AD转如何?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 08:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表