[AVR单片机] 求大神帮忙啊,急着交任务。ISD1760语音芯片

[复制链接]
 楼主| studying123 发表于 2013-3-29 22:08 | 显示全部楼层 |阅读模式
本帖最后由 studying123 于 2013-3-30 21:33 编辑


用ATMEGA16与ISD1760语音芯片想做一个录/放功能的电路,可是程序和电路都弄好。就是看不到效果,求大神费时帮我看下是哪里出错了,急着要交的。谢谢!   调试的时候一直循环在给ISD1760上电的程序中
  1. #include <iom16v.h>
  2. #include <macros.h>
  3. #define uint16 unsigned int
  4. #define uchar16 unsigned char

  5. uchar16 flag=0x00; //标志位

  6. /*ISD1760状态寄存器及各个标志位定义*/

  7. uchar16 SR0_L; //SR0寄存器
  8. uchar16 SR0_H;
  9. uchar16 SR1; //SR1寄存器
  10. uchar16 APCL=0,APCH=0;//APC寄存器
  11. uchar16 PlayAddL=0,PlayAddH=0;//放音指针低位,高位
  12. uchar16 RecAddL=0,RecAddH=0;//录音指针低位,高位

  13. #define CMD (SR0_L&0x01) //SPI指令错误标志
  14. #define FULL (SR0_L&0x02) //芯片存储空间满标志
  15. #define PU (SR0_L&0x04) //上电标志位
  16. #define EOM (SR0_L&0x08) //EOM标志位
  17. #define INTT (SR0_L&0x10) //操作完成标志位
  18. #define RDY (SR1&0x01) //准备接受指令标志位
  19. #define ERASE (SR1&0x02) //擦除标志位
  20. #define PLAY (SR1&0x04) //播放标志位
  21. #define REC (SR1&0x08) //录音标志位

  22. /*标志位定义*/
  23. //#define flag (PORTA&0X0E)

  24. #define flag PORTA
  25. /*#define PR_flag1 (flag|=0x02)
  26. #define PR_flag0 (flag&=~0x02)
  27. #define Erase_flag1 (flag|=0x10)
  28. #define Erase_flag0 (flag~=0x10)
  29. #define Stop_flag1 (flag|=0x80)
  30. #define Stop_flag0 (flag~=0x80)*/
  31. #define Switch_PR1 (PORTA&0x02) //判断录音还是放音与0x02比较
  32. #define Switch_PR0 (PORTA&0x02)

  33. /*端口定义*/
  34. #define LED_ON (PORTA&=0xFE)
  35. #define LED_OFF (PORTA|=0x01)
  36. #define SS_H PORTB|=0x10
  37. #define SS_L PORTB&=~0x10

  38. #define Key_STOP (PORTA&0x04)
  39. #define Key_AN (PORTA&0x08)

  40. //延时程序(ms)
  41. void delay (uint16 ms)
  42. {
  43. uint16 i,j;
  44. for(i=0;i<ms;i++)
  45. for(j=0;j<143;j++);
  46. }

  47. //spi主机发送
  48. unsigned char ISD_SendData(uchar16 cData)
  49. {
  50. SS_L; //片选信号使能
  51. SPDR=cData;//启动数据传输
  52. while(!SPSR&(1<<SPIF));//等待数据发送结束
  53. return SPDR;
  54. }

  55. /*ISD1760上电*/
  56. void ISD_PU(void)
  57. {
  58. ISD_SendData(0x01); //发送PU命令
  59. ISD_SendData(0x00);
  60. SS_H;
  61. }

  62. /*ISD1760下电*/
  63. void ISD_PD(void)
  64. {
  65. ISD_SendData(0x07); //发送PD命令
  66. ISD_SendData(0x00);
  67. SS_H;
  68. }


  69. /*停止当前操作*/
  70. void ISD_STOP(void)
  71. {
  72. ISD_SendData(0x02); //发送STOP命令
  73. ISD_SendData(0x00);
  74. SS_H;
  75. }

  76. /*ISD1760复位*/
  77. void ISD_Reset(void)
  78. {
  79. ISD_SendData(0x03); //发送RESET命令
  80. ISD_SendData(0x00);
  81. SS_H;
  82. }

  83. /*清除中断标志*/
  84. void ISD_Clr_Int(void)
  85. {
  86. ISD_SendData(0x04);
  87. ISD_SendData(0x00);
  88. SS_H;
  89. }

  90. /*ISD1760放音*/
  91. void ISD_Play(void)
  92. {
  93. ISD_SendData(0x40); //发送放音命令
  94. ISD_SendData(0x00);
  95. SS_H;
  96. }

  97. /*定点播放*/
  98. void ISD_SET_PLAY(uchar16 Saddl,uchar16 Saddh,uchar16 Eaddl, uchar16 Eaddh)
  99. {
  100. ISD_SendData(0x80);
  101. ISD_SendData(0x00);
  102. ISD_SendData(Saddl); //开始地址低8位
  103. ISD_SendData(Saddh); //开始地址高8位
  104. ISD_SendData(Eaddl); //结束地址低8位
  105. ISD_SendData(Eaddh); //结束地址高8位
  106. ISD_SendData(0x00);
  107. SS_H;
  108. }


  109. /*ISD1760录音*/
  110. void ISD_Rec(void)
  111. {
  112. ISD_SendData(0x41); //发送录音命令
  113. ISD_SendData(0x00);
  114. SS_H;
  115. }

  116. /*定点录音*/
  117. void ISD_SET_Rec(uchar16 Saddl,uchar16 Saddh,uchar16 Eaddl, uchar16 Eaddh)
  118. {
  119. ISD_SendData(0x81);
  120. ISD_SendData(0x00);
  121. ISD_SendData(Saddl); //开始地址低8位
  122. ISD_SendData(Saddh); //开始地址高8位
  123. ISD_SendData(Eaddl); //结束地址低8位
  124. ISD_SendData(Eaddh); //结束地址高8位
  125. ISD_SendData(0x00);
  126. SS_H;
  127. }


  128. /*ISD1760擦除*/
  129. void ISD_Erase(void)
  130. {
  131. ISD_SendData(0x42); //发送擦除命令
  132. ISD_SendData(0x00);
  133. SS_H;
  134. }

  135. /*定点擦除*/
  136. void ISD_SET_Erase(uchar16 Saddl,uchar16 Saddh,uchar16 Eaddl, uchar16 Eaddh)
  137. {
  138. ISD_SendData(0x82);
  139. ISD_SendData(0x00);
  140. ISD_SendData(Saddl); //开始地址低8位
  141. ISD_SendData(Saddh); //开始地址高8位
  142. ISD_SendData(Eaddl); //结束地址低8位
  143. ISD_SendData(Eaddh); //结束地址高8位
  144. ISD_SendData(0x00);
  145. SS_H;
  146. }

  147. /*ISD1760全体擦除*/
  148. void ISD_G_Erase(void)
  149. {
  150. ISD_SendData(0x43); //发送全体擦除命令
  151. ISD_SendData(0x00);
  152. SS_H;
  153. }

  154. /*读取状态寄存器内容*/
  155. void ISD_Rd_Status(void)
  156. {
  157. unsigned char i;
  158. ISD_SendData(0x05); //发送
  159. ISD_SendData(0x00);
  160. ISD_SendData(0x00);
  161. SS_H;
  162. for(i=2;i>0;i--) //延迟
  163. {;}
  164. SR0_L=ISD_SendData(0x05); //从MISO读出状态
  165. SR0_H=ISD_SendData(0x00);
  166. SR1=ISD_SendData(0x00);
  167. SS_H;
  168. }

  169. /*读取放音指针*/
  170. void ISD_Rd_Playptr(void)
  171. {
  172. uchar16 i;
  173. ISD_SendData(0x06); //发送
  174. ISD_SendData(0x00);
  175. ISD_SendData(0x00);
  176. ISD_SendData(0x00);
  177. SS_H;
  178. for(i=2;i>0;i--) //延迟
  179. {;}
  180. SR0_L=ISD_SendData(0x06); //从MISO读出状态
  181. SR0_H=ISD_SendData(0x00);
  182. PlayAddL=ISD_SendData(0x00); //读取放音指针低8位
  183. PlayAddH=ISD_SendData(0x00); //读取放音指针高8位
  184. SS_H;
  185. }

  186. /*读取录音指针*/
  187. void ISD_Rd_Recptr(void)
  188. {
  189. uchar16 i;
  190. ISD_SendData(0x08); //发送
  191. ISD_SendData(0x00);
  192. ISD_SendData(0x00);
  193. ISD_SendData(0x00);
  194. SS_H;
  195. for(i=2;i>0;i--) //延迟
  196. {;}
  197. SR0_L=ISD_SendData(0x08); //从MISO读出状态
  198. SR0_H=ISD_SendData(0x00);
  199. RecAddL=ISD_SendData(0x00); //读录音指针低8位
  200. RecAddH=ISD_SendData(0x00); //读录音指针高8位
  201. SS_H;
  202. }

  203. /*将APC数据写入NVCFG寄存器中*/
  204. void ISD_WR_NVCFG(uchar16 apcdatl,uchar16 apcdath)
  205. {
  206. ISD_SendData(0x46);
  207. ISD_SendData(apcdatl); //发送低8位数据
  208. ISD_SendData(apcdath); //发送高8位数据
  209. SS_H;
  210. }


  211. /*将NVCFG数据写入APC寄存器中*/
  212. void ISD_LD_NVCFG(void)
  213. {
  214. ISD_SendData(0x47);
  215. ISD_SendData(0x00);
  216. SS_H;
  217. }


  218. /*放音指针下跳一段,指向下一段语音的起始地址*/
  219. void ISD_FWD(void)
  220. {
  221. ISD_SendData(0x48);
  222. ISD_SendData(0x00);
  223. SS_H;
  224. }

  225. /*空间检查*/
  226. void ISD_CHK_MEM(void)
  227. {
  228. ISD_SendData(0x49);
  229. ISD_SendData(0x00);
  230. SS_H;
  231. }


  232. /*启用/关闭 外部时钟模式*/
  233. void ISD_EXTCLK(void)
  234. {
  235. ISD_SendData(0x4a);
  236. ISD_SendData(0x00);
  237. SS_H;
  238. }

  239. /*读取APC寄存器内容*/
  240. unsigned char ISD_Devid(void)
  241. {
  242. uchar16 DeviceNO,i;
  243. ISD_SendData(0x09); //发送
  244. ISD_SendData(0x00);
  245. ISD_SendData(0x00);
  246. SS_H;
  247. for(i=2;i>0;i--) //延迟
  248. {;}
  249. ISD_SendData(0x09);
  250. ISD_SendData(0x00);
  251. DeviceNO=ISD_SendData(0x00);
  252. SS_H;
  253. return DeviceNO;
  254. }

  255. /*设置APC2*/
  256. void ISD_WR_APC2(uchar16 apcdatl,uchar16 apcdath)
  257. {
  258. ISD_SendData(0x65);
  259. ISD_SendData(apcdatl); //发送低8位数据
  260. ISD_SendData(apcdath); //发送高8位数据
  261. SS_H;
  262. }

  263. /*ISD1760初始化*/
  264. void ISD_init(void)
  265. {
  266. unsigned char i=2;
  267. do
  268. {
  269. ISD_PU(); //上电
  270. delay(50);
  271. ISD_Rd_Status(); //读取状态
  272. }while(CMD||(!PU)); //if(CMD_Err==1)||(PU!=1)则再次发送上电指令

  273. ISD_WR_APC2(0x40,0x04); //将0x0440写入APC寄存器,此时语音提示关

  274. do
  275. {
  276. ISD_Rd_Status();
  277. } //等待RDY置位1
  278. while (RDY==0);

  279. do
  280. {
  281. LED_ON;
  282. delay(300);
  283. LED_OFF;
  284. delay(300);
  285. i--;
  286. }
  287. while(i>0);
  288. }

  289. //SPI通信初始化
  290. void spi_init()
  291. {
  292. DDRB|=0xB0;//PB7,5,4设置为输出
  293. SPCR=0x7F;//主机模式,LSB先发送,fosc/128
  294. //SPCR=0x7C;
  295. }

  296. /*ISD1760进行相关操作*/
  297. void ISDWORK(void)
  298. {
  299. unsigned char i;
  300. switch(flag)
  301. {
  302. case 0x06: //放音
  303. do {ISD_Rd_Status();}while(RDY==0); //读取状态寄存器内容,RDY=O表示忙
  304. delay(10);
  305. ISD_Play(); //发送放音命令
  306. delay(2);
  307. LED_ON;
  308. do {ISD_Rd_Status();
  309. if(Key_STOP==0)
  310. {
  311. delay(20);
  312. if(Key_STOP==0) /*暂停键*/
  313. {
  314. ISD_Clr_Int(); //清除中断标志
  315. ISD_STOP(); //停止当前操作
  316. return;
  317. }
  318. }
  319. }while(PLAY==1);
  320. LED_OFF;
  321. ISD_Clr_Int();
  322. do {ISD_Rd_Status();
  323. }while(RDY==0);
  324. delay(10);
  325. ISD_FWD(); //放音指针下跳一段
  326. do {ISD_Rd_Status();
  327. }while(RDY==0);
  328. break;

  329. case 0x04: //录音
  330. ISD_Clr_Int();
  331. do {ISD_Rd_Status();
  332. }while(RDY==0);
  333. LED_ON;
  334. ISD_Rec(); //录音
  335. do {ISD_Rd_Status();
  336. if(FULL==1) //存储空间满
  337. {
  338. for(i=3;i>0;i--)
  339. { LED_ON;
  340. delay(300);
  341. LED_OFF;
  342. delay(200);
  343. }
  344. }
  345. }while(Key_AN==0); /*录音键*/
  346. ISD_Clr_Int();
  347. ISD_STOP();
  348. LED_OFF;
  349. break;

  350. case 0x08: //全体擦除
  351. do {ISD_Rd_Status();
  352. }while(RDY==0);
  353. delay(2);
  354. ISD_G_Erase();
  355. do {ISD_Rd_Status();
  356. }while(RDY==0);
  357. for(i=3;i>0;i--)
  358. { LED_ON;
  359. delay(300);
  360. LED_OFF;
  361. delay(200);
  362. }
  363. break;

  364. case 0x0A: //全体擦除
  365. do {ISD_Rd_Status();
  366. }while(RDY==0);
  367. delay(2);
  368. ISD_G_Erase();
  369. do {ISD_Rd_Status();
  370. }while(RDY==0);
  371. for(i=3;i>0;i--)
  372. { LED_ON;
  373. delay(300);
  374. LED_OFF;
  375. delay(200);
  376. }
  377. break;


  378. case 0x80: //复位下电
  379. ISD_Clr_Int();
  380. ISD_STOP();
  381. ISD_Reset();
  382. ISD_PD();
  383. break;
  384. }
  385. }

  386. void main(void)
  387. {
  388. uchar16 i;
  389. DDRB|=0x10; //SS口设置为输出
  390. DDRA|=0X01; //A0口设置为输出
  391. DDRA&=~0X0E; //A1,A2,A3设置为输入
  392. delay(1);
  393. spi_init(); //SPI通信初始化
  394. ISD_init();
  395. while(1)
  396. {
  397. if(Key_AN==0) /*AN按键按下,若Switch_PR=1则录音,=0则放音*/
  398. {
  399. delay(10);
  400. if(Key_AN==0)
  401. {
  402. if(Switch_PR1==0x02)
  403. {
  404. flag&=0x0E; //flag 值只取A1A2A3三口的值
  405. //PR_flag1;
  406. }
  407. else
  408. {
  409. flag&=0x0E;
  410. //PR_flag0;
  411. }
  412. ISDWORK();
  413. }
  414. }

  415. if(Key_STOP==0) //Key_STOP快速按一次则下电,长按住则全擦除
  416. {
  417. delay(20);
  418. if(Key_STOP==0)
  419. {
  420. for(i=100;i>0;i--)
  421. {
  422. if(Key_STOP==1)
  423. {
  424. flag=0x80; //下电标志
  425. ISDWORK();
  426. ISD_init();
  427. break;
  428. }
  429. delay(30);
  430. }
  431. if(flag==0x80)
  432. {
  433. flag=0x00; //放音标志
  434. continue;
  435. }
  436. flag&=0x0E; //全擦标志
  437. //Erase_flag1;
  438. ISDWORK();
  439. }

  440. }
  441. }
  442. }

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qin552011373 发表于 2013-3-29 22:21 | 显示全部楼层
你确定你的硬件电路没有问题?
qin552011373 发表于 2013-3-30 13:51 | 显示全部楼层
用示波器看看信号输出端有没有信号
yhhsky 发表于 2013-3-30 14:08 | 显示全部楼层
 楼主| studying123 发表于 2013-3-30 19:37 | 显示全部楼层
qin552011373 发表于 2013-3-30 13:51
用示波器看看信号输出端有没有信号

MOSI有信号,MISO没有信号啊
qin552011373 发表于 2013-3-30 21:01 | 显示全部楼层
studying123 发表于 2013-3-30 19:37
MOSI有信号,MISO没有信号啊

你认为什么问题?
 楼主| studying123 发表于 2013-3-30 21:35 | 显示全部楼层
qin552011373 发表于 2013-3-30 21:01
你认为什么问题?

应该是芯片不能正确采集到单片机MOSI输出的信号吧。 我刚贴出的时序图,根据单片机和ISD1760时序表,请问 CPOL和CPHA该怎么选呢?是CPHA=0    CPOL=0吗?
qin552011373 发表于 2013-3-30 22:27 | 显示全部楼层
studying123 发表于 2013-3-30 21:35
应该是芯片不能正确采集到单片机MOSI输出的信号吧。 我刚贴出的时序图,根据单片机和ISD1760时序表,请问 ...

我没用过  你可以按你的想法试试
gampt 发表于 2013-12-12 10:15 | 显示全部楼层
亲 解决问题了吗?怎么回事?mege16的晶振你用的多大的,spi多少分频
hnhdzzc 发表于 2014-1-23 22:10 | 显示全部楼层
studying123 发表于 2013-3-30 19:37
MOSI有信号,MISO没有信号啊

我也遇见这样的问题,MISO没有输出信号。。。。,不知道怎么解决
qin552011373 发表于 2014-1-24 09:02 | 显示全部楼层
hnhdzzc 发表于 2014-1-23 22:10
我也遇见这样的问题,MISO没有输出信号。。。。,不知道怎么解决

你的头像怎么这么漂亮
ningling_21 发表于 2014-1-24 10:52 | 显示全部楼层
studying123 发表于 2013-3-30 21:35
应该是芯片不能正确采集到单片机MOSI输出的信号吧。 我刚贴出的时序图,根据单片机和ISD1760时序表,请问 ...

用示波器测量单片机输出的信号,和资料里的时序图对比,看看是不是相符的,如果不相符ISD芯片肯定识别不了...
山莓草 发表于 2015-5-25 22:07 | 显示全部楼层
我想问你提问的1760语音程序问题解决没有?我也急着交任务。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部