自己写的一个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那个函数
}
|
|