📄 msm9841.c
字号:
#include "typedef.h"
#include "msm9841.h"
#include <intrins.h>
#include "nf_drv.h"
Uchar volatile xdata COMMAND_INPUT _at_ 0xc800;
Uchar volatile xdata DATA_INPUT _at_ 0xc801;
Uint8 voiceSynMethod;
Uint8 volumeVal;
Uint8 samplingFreq;
extern Uchar volatile xdata D12_Y1;//原来的xCONTROLBYTE81K;
extern idata Byte D16CS;//原来的xConByte81KValue;
Byte msm_is_full()
{
if (1 == MSM_FULL)
return OK;
else
return KO;
}
#define msm_input_command(command) (COMMAND_INPUT = (command))
/*
void msm_input_command(Uint8 command)
{
COMMAND_INPUT = command;
}*/
#define msm_input_data(databuf) (DATA_INPUT = (databuf))
/*void msm_input_data(Uint8 databuf)
{
DATA_INPUT = databuf;
}*/
void msm_read_status(Byte* pbuf)
{
*pbuf = COMMAND_INPUT;
}
/**change strobe to 4 machine cycles**/
void msm_modify_strobe_width()
{
// CKCON |= 0x02;
}
void msm_default_strobe_width()
{
// CKCON &= 0xf9;
}
void msm_stop_playback()
{
Uint8 configData;
msm_modify_strobe_width();
configData = STOP|BOTH_SIDEVOICE;
msm_input_command(configData);
msm_default_strobe_width();
}
void msm_change_volume(Byte volume)
{
volatile Uint8 configData;
msm_modify_strobe_width();
configData = VOLUME_SETTING|volume;
//left voice
msm_input_command(configData);
_nop_();
_nop_();
//right voice
configData += 8;
msm_input_command(configData);
msm_default_strobe_width();
}
void msm_set_toneformat()
{
Uint8 configData;
configData = VOICE_SYN+voiceSynMethod;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
}
/*
void tts_reset()
{
Byte i;
MSM_RESET = 0;
for (i=0; i<0xff; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
for (i=0; i<0xff; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
MSM_RESET = 1;
}
*/
void msm9841_reset_init()
{
volatile Uint8 configData;
D16CS &= 0x7f;
D12_Y1 = D16CS;//reset=0
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
D16CS |= 0x80;
D12_Y1 = D16CS;//reset = 1
_nop_();
_nop_();
_nop_();
_nop_();
msm_modify_strobe_width();
msm_set_toneformat();
//analog specification 1;
//we use default config,use monaural playback
configData = ANALOG_SPEC1+0;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
//analog specification 2;
//we use default config
configData = ANALOG_SPEC2+0;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
//set fifo byte configuration
configData = FIFO_CONFIG+BIT1024;//BIT1024;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
//set output signal
configData = SIGNAL_FORMAT+0;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
msm_default_strobe_width();
}
void msm9841_init()
{
volatile Uint8 configData;
//first should reset msm9841
//MSM_CH = 0;
D16CS |= 0x80;
D12_Y1 = D16CS;//reset = 1
for (configData=0; configData<0xff; configData++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
for (configData=0; configData<0xff; configData++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
D16CS &= 0x7f;
D12_Y1 = D16CS;//reset=0
for (configData=0; configData<0xff; configData++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
for (configData=0; configData<0xff; configData++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
D16CS |= 0x80;
D12_Y1 = D16CS;//reset = 1
//delay
for (configData=0; configData<0xff; configData++)
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
//end delay
msm_modify_strobe_width();
//set synthesis method
configData = VOICE_SYN+BIT4_ADPCM;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
//analog specification 1;
//we use default config,use monaural playback
configData = ANALOG_SPEC1+0;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
//analog specification 2;
//we use default config
configData = ANALOG_SPEC2+0;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
//set fifo byte configuration
configData = FIFO_CONFIG+BIT1024;//BIT1024;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
//set output signal
configData = SIGNAL_FORMAT+0;
msm_input_command(configData);
_nop_();
_nop_();
_nop_();
volumeVal = DB_0;
samplingFreq = HZ160K;
msm_default_strobe_width();
}
void msm_start_playback()
{
volatile Uint8 configData;
msm_modify_strobe_width();
configData = PLAYBACK_START + samplingFreq;
msm_input_command(configData);
msm_default_strobe_width();
}
/**************************for test********************************/
/*
xdata Byte testBuf[12*1024];
void init_test_buf()
{
Uint16 i;
Uint32 addr;
addr=0x50000;
i=0;
while (i < 96)
{
nf_read_tobuf(addr, testBuf+(128*i), 128);
// c512_config_read(addr, testBuf+addr, 128);
addr += 128;
i++;
}
}*/
Byte msm_senddata(Byte* pBuf, Byte nLen)
{
Byte datalen = 0;
msm_modify_strobe_width();
while (datalen < nLen)
{
if (1 == MSM_FULL)
break;
msm_input_data(*(pBuf+datalen));
datalen++;
}
msm_default_strobe_width();
return datalen;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -