-
Notifications
You must be signed in to change notification settings - Fork 1
/
isd4004.c
144 lines (123 loc) · 3.03 KB
/
isd4004.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/***********************************************************
*模块名称:ISD4004
*功能说明:写语音芯片报时程序
***********************************************************/
#include"isd4004.h"
#include"global.h"
/***********************************************************
*函数名称:ISD4004_Reset
*函数功能:语音芯片复位
*入口参数:无
*出口参数:无
*说明:进入主函数前,对ISD4004语音芯片控制脚输出方向配置
***********************************************************/
void ISD4004_Reset(void)
{
ISD_SCLK_OUT; //将时钟端设置为输出
ISD_SS_OUT; //将片选段设为输出
ISD_MOSI_OUT; //将MOSI设为输出
}
/************************************
写入8位数据
************************************/
void ISD4004_WriteChar(uchar z)
{
uchar i,temp=z;
ISD_SCLK_L;
ISD_SS_L;
for(i=0;i<8;i++)
{
if(0x01&temp)
ISD_MOSI_H;
else
ISD_MOSI_L;
temp=temp>>1;
ISD_SCLK_H;
DelayUs(2);
ISD_SCLK_L;
DelayUs(2);
}
}
/************************************
录音前给器件上电
************************************/
void ISD4004_PowerUp_Rec(void)
{
ISD4004_WriteChar(0x20); // POWERUP
ISD_SS_H;
DelayMs(100); // 录音时要两位的上电延时
}
/************************************
播放前给器件上电
************************************/
void ISD4004_PowerUp_Play(void)
{
ISD4004_WriteChar(0x20); // POWERUP
ISD_SS_H;
DelayMs(50); // 上电延时
}
/************************************
暂停当前操作
************************************/
void ISD4004_Stop(void)
{
ISD4004_WriteChar(0x30); //停止当前操作
ISD_SS_H;
DelayMs(25); //一定要延时,给芯片一点时间反应下
}
/************************************
暂停当前操作并掉电
************************************/
void ISD4004_StopDown(void)
{
ISD4004_WriteChar(0x10); //停止当前操作并掉电
ISD_SS_H;
DelayMs(25); //一定要延时,给芯片一点时间反应下
}
/************************************
从某个地址开始播放
************************************/
void ISD4004_SetPlay(uint z)
{
ISD4004_WriteChar(z%256);
ISD4004_WriteChar(z/256);
ISD4004_WriteChar(0xe0);
ISD_SS_H;
DelayMs(4);
ISD4004_Play();
}
/************************************
从当前地址开始播放
************************************/
void ISD4004_Play(void)
{
ISD4004_WriteChar(0xf0);
//ISD_SS_H; //注意如果不注释掉的话,就不会暂停,因为在下一个spi周期会把中断清除掉
DelayUs(4);
}
/************************************
从某个地址开始录音
************************************/
void ISD4004_SetRec(uint z)
{
ISD4004_WriteChar(z%256);
ISD4004_WriteChar(z/256);
ISD4004_WriteChar(0xa0);
ISD_SS_H;
DelayUs(4);
ISD4004_Rec(); //注意如果不加的话就只会播放一个音
}
/************************************
从当前地址开始录音
************************************/
void ISD4004_Rec(void)
{
ISD4004_WriteChar(0xb0);
ISD_SS_H;
DelayUs(4);
}
void ISD4004_Init()
{
ISD4004_Reset(); //复位ISD4004
ISD4004_PowerUp_Play();
}