📄 1700语音芯片spi控制程序.c
字号:
/*********************************************************************************
**本程序为ISD1700芯片控制程序
**这些指令经过测试,完全可用。
**由于资料的不完整,其他的一些控制指令未能写出来
*********************************************************************************/
#include "LPC213x.h"
#include "config.h"
/******************************************************************************
**函数名称:delay()
**函数功能:程序所用的延时函数
**入口参数:无
**出口参数:无
******************************************************************************/
void delay (uint32 dly) //寻迹使用延时
{
uint32 i;
for(; dly>0; dly--)
for(i=0; i<50000; i++);
}
/******************************************************************************
**函数名称:jp_init()
**函数功能:初始化独立键盘所用的管脚p0.00~p0.03
**入口参数:无
**出口参数:无
******************************************************************************/
void jp_init (void)
{
PINSEL0=( PINSEL0&(~0XFF) ); //p0.00~p0.03选择GPIO功能
IO0DIR =( IO0DIR&((~0X0F)) ); //p0.00~p0.03选择为输入口
}
/******************************************************************************
**函数名称:SPI_init()
**函数功能:初始化SPI接口,设置为主机
**入口参数:无
**出口参数:无
******************************************************************************/
void SPI_init(void)
{
PINSEL0=(PINSEL0&(~(0XFF<<8))) | (0X15<<8); //设置引脚连接SPI
IO0DIR=(IO0DIR|(0X01<<7)); //p0.7为输出用于片选语音芯片开始通信
S0SPCCR=0X52; //设置SPI时钟分频
S0SPCR =(1<<3) | //数据在SCK的第一个时钟沿采样
(1<<4) | //SCK为低有效
(1<<5) | //SPI处于主模式
(1<<6) | //输出数据低位在先
(0<<7) ; //SPI中断被禁止
}
/******************************************************************************
**函数名称:SPI_Senddata()
**函数功能:向SPI总线发送数据
**入口参数:data 待发送的数据
**出口参数:无
******************************************************************************/
void SPI_Senddata(uint8 data)
{
uint8 tmp; //用于读取SPI状态寄存器值的变量
S0SPDR=data; //总线需发送的数据
while( (S0SPSR&0X80)==0 ); //等待一次数据传输结束
tmp=S0SPSR; //读取状态寄存器的值,防止写冲突
//return(S0SPCCR); //赞不处理从机发送的数据
}
/******************************************************************************
**函数名称:PU()
**函数功能:1700上电指令程序
**入口参数:无
**出口参数:无
******************************************************************************/
void PU (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x01); //上电指令的数据为:(命令字节 0x01)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:STOP()
**函数功能:停止语音芯片当前操作
**入口参数:无
**出口参数:无
******************************************************************************/
void STOP (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x02); //指令的数据为:(命令字节 0x02)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:RESET()
**函数功能:芯片复位
**入口参数:无
**出口参数:无
******************************************************************************/
void RESET (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x03); //指令的数据为:(命令字节 0x03)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:PD()
**函数功能:1700下电指令程序
**入口参数:无
**出口参数:无
******************************************************************************/
void PD (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x07); //上电指令的数据为:(命令字节 0x07)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:CLR_INT()
**函数功能:清除EOM标志和中断信号
**入口参数:无
**出口参数:无
******************************************************************************/
void CLR_INT (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x14); //清除标志指令的数据为:(命令字节 0x14)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:PLAY()
**函数功能:从当前地址放音至EOM标志
**入口参数:无
**出口参数:无
******************************************************************************/
void PLAY (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x40); //指令的数据为:(命令字节 0x40)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:ERASE()
**函数功能:擦除当前段语音
**入口参数:无
**出口参数:无
******************************************************************************/
void ERASE (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x42); //指令的数据为:(命令字节 0x42)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:G_ERASE()
**函数功能:擦除芯片全部语音
**入口参数:无
**出口参数:无
******************************************************************************/
void G_ERASE (void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x43); //指令的数据为:(命令字节 0x43)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:FWD()
**函数功能:将放音指针指向下一段语音起始地址
**入口参数:无
**出口参数:无
******************************************************************************/
void FWD(void)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x48); //指令的数据为:(命令字节 0x48)
SPI_Senddata(0x00); // +(数据字节 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:SET_PLAY()
**函数功能:从起始地址放音到结束地址
**入口参数:start_address:放音的开始地址,end_address:放音结束地址
**出口参数:无
******************************************************************************/
void SET_PLAY(uint8 start_address,uint8 end_address )
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x90); //指令的数据为:(命令字节 0x90)
SPI_Senddata(0x00); // +(数据字节 0x00)
SPI_Senddata(start_address); // +(起始地址低8位 S7~S0)
SPI_Senddata(0x00); // +(起始地址高8位 00000 s10~s8)
SPI_Senddata(end_address); // +(结束地址低8位 E7~E0)
SPI_Senddata(0x00); // +(结束地址高8位 00000 E10~E8)
SPI_Senddata(0x00); // +(结束地址值 0x00)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:WR_APC2()
**函数功能:写数据D11~D0到APC寄存器,并由D2~D0位控制音量
**入口参数:data_low,data_high: 要写入APC寄存器的数据
**出口参数:无
******************************************************************************/
void WR_APC2 (uint8 data_low,uint8 data_high)
{
IO0CLR=1<<7; //SSEL0置低,开始发送数据
SPI_Senddata(0x65); //指令的数据为:(命令字节 0x65)
SPI_Senddata(data_low); // +(数据字节 D7~D0)
SPI_Senddata(data_high); // +(数据字节 0000 D11~D8)
IO0SET=1<<7; //SSEL0置高,结束发送数据
}
/******************************************************************************
**函数名称:main()
**函数功能:控制语音芯片
**入口参数:无
**出口参数:无
******************************************************************************/
void main (void)
{
uint8 yinl=0x0;
jp_init(); //键盘接口初始化
SPI_init(); //初始化和语音芯片通信的SPI口
PU(); //芯片上电
delay(1);
//CLR_INT(); //清除EOM标志和中断信号
delay(1);
while(1)
{
SET_PLAY(0x10,0x5f); //读一地址段录音,仅供测试用
delay(10000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -