查看: 1412|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-28 21:46:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
自己写的一个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 (;;);                                           //  死循环,不退出中断服务函数
    }
}





补充,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那个函数

}


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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