OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8503|回复: 25

stm32f103rb 控制语音芯片 ISD1760(ISD1700系列)

[复制链接]

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-5-10
在线时间
4 小时
发表于 2012-7-30 14:25:02 | 显示全部楼层 |阅读模式
不知哪位大神玩过类似的芯片, 从网上下载的一段程序,目前问题出现在,芯片总是初始化成功的概率很低,要程序重新跑好几遍才成功一次。还有 返回检测引脚 miso返回的值就没有检测对的时候,所以那个 do.....while()循环总是跳不出去。快愁死我了。总程序在附件了,这段程序估计是有个哥们从51移植过来的。利用的也是 ALIENTEK 开发资料的模版。很好懂,拜谢大神为小弟解答;
do{
 ISD_PU(); 
 delay_ms(50);
 RdStatus();
 }while((SR0_L&0x01)||!(SR1&0x01)); //if(SR0_L^0==1){system Err}<CMD_Err==1> 

ISD1760驱动程序.rar

649.79 KB, 下载次数: 1347

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-7-30 20:00:35 | 显示全部楼层
你试试这个~

/*ISD1760的录放音程序。  */
/************************************************************************** 
*    SPI操作ISD1760 
*    SPI操作ISD1760 
**************************************************************************/ 
#include <stm32f10x_lib.h>
#include "sys.h"
#include "isd1760.h"
#include "led.h"
#include "delay.h"
#include "usart.h"

u8 SR0_L; 
u8 SR0_H; 
u8 SR1; 
u8 ID,APCL=0,APCH=0; 
u8 SBUF=0;
extern u16 caToneAdd[90];
/************************************************************************** 
*    函数原型: void ISD_SPI_Init(void) 
*    功    能: IO口初始化 
**************************************************************************/
void ISD_SPI_Init(void)
{
    RCC->APB2ENR|=1<<4;    //使能PORTC时钟
   
GPIOC->CRL&=0XF0FFFFFF; 
GPIOC->CRL|=0X03000000;//PC6 推挽输出 --SCLK  
    GPIOC->ODR|=1<<6;      //PC6 上拉
GPIOC->CRL&=0X0FFFFFFF; 
GPIOC->CRL|=0X30000000;//PC7 推挽输出  --MOSI  
    GPIOC->ODR|=1<<7;      //PC7 上拉
GPIOC->CRH&=0XFFFFFFF0; 
GPIOC->CRH|=0X00000003;//PC8 推挽输出  --SS  
    GPIOC->ODR|=1<<8;      //PC8 上拉
GPIOC->CRH&=0XFFFFFF0F;//PC9上拉输入   --MISO
GPIOC->CRH|=0X00000080;
GPIOC->ODR|=1<<9;      
}
/************************************************************************** 
*    函数原型: void ISD_Init(void); 
*    功    能: 初始化 
**************************************************************************/ 
void  ISD_Init(void)
ISD_Reset(); 
do{ 
ISD_PU();
delay_ms(50); 
RdStatus();
}while((SR0_L&0x01)||!(SR1&0x01)); //if(SR0_L^0==1){system Err}<CMD_Err==1>  
SBUF=RD_DevID();//读取芯片ID,----1760为0xa0 
ClrInt(); 
ISD_CHK_MEM();
ISD_WR_APC2(0xa0); 
delay_ms(50);
RdAPC(); 

/************************************************************************** 
*    函数原型: void ISD_PU(void); 
*    功    能: 空间检查 
**************************************************************************/ 
void ISD_CHK_MEM(void)
ISD_SendData(CHK_MEM); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10); 

/************************************************************************** 
*    函数原型: void ISD_PU(void); 
*    功    能: 上电 
**************************************************************************/ 
void ISD_PU(void)
ISD_SendData(PU|0x10); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(50); 

/************************************************************************** 
*    函数原型: void ISD_Reset(void); 
*    功    能: 复位 
**************************************************************************/ 
void ISD_Reset(void)
ISD_SendData(RESET); 
ISD_SendData(0x00); 
SS=1; 
    delay_ms(50); 

/************************************************************************* 
*    函数原型: void ISD_SendData(u8 BUF_ISD); 
*    功    能: 发送数据 
**************************************************************************/ 

u8 ISD_SendData(u8 BUF_ISD)
u8 i,dat; 
dat=BUF_ISD;
SS=0; 
    delay_us(18);
for(i=0;i<8;i++)
SCLK=0; 
delay_us(18); 
if(dat&0x01)
MOSI=1; 
else
MOSI=0; 
dat>>=1;
SCLK=1; 
delay_us(18); 
if(MISO)
{
dat|=0x80; 
MOSI=0; 
delay_us(18);
return(dat); 
}  

/************************************************************************** 
*    函数原型: void RdStatus(void); 
*    功    能: 读取状态 
**************************************************************************/ 
void RdStatus(void)
ISD_SendData(RD_STATUS); 
ISD_SendData(0x00); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 
SR0_L =ISD_SendData(RD_STATUS); 
SR0_H =ISD_SendData(0x00); 
SR1 =ISD_SendData(0x00); 
SS=1; 
delay_ms(10); 

/************************************************************************** 
*    函数原型: void RdStatus(void); 
*    功    能: 读取ID 
**************************************************************************/ 
u8 RD_DevID(void)
ISD_SendData(RD_DEVID); 
ISD_SendData(0x00); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 
SR0_L =ISD_SendData(RD_DEVID); 
SR0_H =ISD_SendData(0x00); 
ID =ISD_SendData(0x00); 
SS=1; 
delay_ms(10); 
return(ID); 

/************************************************************************** 
*    函数原型: void RD_APC(void); 
*    功    能: 读取APC 
**************************************************************************/ 
void RdAPC(void)
ISD_SendData(RD_APC); 
ISD_SendData(0x00); 
ISD_SendData(0x00); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 
SR0_L =ISD_SendData(RD_APC); 
SR0_H =ISD_SendData(0x00); 
APCL =ISD_SendData(0x00); 
APCH =ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 

/************************************************************************** 
*    函数原型: void ClrInt(void); 
*    功    能: 清除中断 
**************************************************************************/ 
void ClrInt(void)
ISD_SendData(CLR_INT); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 

/************************************************************************** 
*    函数原型: void ISD_WR_APC2(u8 voiceValue); 
*    功    能: 设置APC2 
**************************************************************************/ 
void ISD_WR_APC2(u8 voiceValue)
ISD_SendData(WR_APC2); 
ISD_SendData(voiceValue); //后3位为音量
ISD_SendData(0x04); //0x04 EOM=0,VALERT=1 ,0x 0C EOM=1
SS=1; 
delay_ms(10);               //延迟10ms 
ISD_WR_NVCFG(); //永久写入寄存器/此程序正在放音要调整音量时不要添加!! 

/************************************************************************** 
*    函数原型: void ISD_WR_NVCFG(void); 
*    功    能: 永久写入寄存器 
**************************************************************************/ 
void ISD_WR_NVCFG(void)
ISD_SendData(WR_NVCFG); 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 

/************************************************************************** 
*    函数原型: void SetPLAY(u8 cNum); 
*    功    能: 定点播放 
**************************************************************************/ 
void SetPLAY(u8 cNum)
u16 Add_ST,Add_ED;
u8  Add_ST_H, Add_ST_L, Add_ED_H, Add_ED_L; 
do{ 
RdStatus(); 
}while((SR0_L&0x01)||!(SR1&0x01)); //if(SR0_L^0==1){system Err}<CMD_Err==1> 
ClrInt(); 
Add_ST=caToneAdd[cNum*2];
Add_ED=caToneAdd[cNum*2+1];
Add_ST_L=(u8)(Add_ST&0x00ff); 
Add_ST_H=(u8)((Add_ST>>8)&0x00ff); 
Add_ED_L=(u8)(Add_ED&0x00ff); 
Add_ED_H=(u8)((Add_ED>>8)&0x00ff); 
ISD_SendData(SET_PLAY); 
ISD_SendData(0x00); 
ISD_SendData(Add_ST_L);          //S7:S0  开始地址 
ISD_SendData(Add_ST_H);           //S10:S8 
ISD_SendData(Add_ED_L);           //E7:E0  结束地址 
ISD_SendData(Add_ED_H);           //E10:E8 
ISD_SendData(0x00); 
SS=1; 
delay_ms(10);               //延迟10ms 
do{        //等待语音播放完成,注释掉后可以实现播放内容的打断
RdStatus();  
}while((SR0_L&0x01)||(SR1&0x04)); //if(SR0_L^0==1){system Err}<CMD_Err==1> 

/************************************************************************** 
*    函数原型: void ISD_PD(void); 
*    功    能: 掉电 
**************************************************************************/  
void ISD_PD(void)
ISD_SendData(PD); 
ISD_SendData(0x00); 
SS=1; 

/************************************************************************** 
*    END 
*    END 
**************************************************************************/ 



ISD1760驱动程序.zip

759.59 KB, 下载次数: 1401

永远保持一颗学习的心态。
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-30 17:19:31 | 显示全部楼层
回复【楼主位】linux_rookie:
---------------------------------
考虑时序问题.
初始化概率低,可能是你的通信时序打了擦边球.
4004倒是玩过,1700没搞过.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-5-10
在线时间
4 小时
 楼主| 发表于 2012-7-31 09:36:51 | 显示全部楼层
回复【3楼】科科1987:
---------------------------------
谢谢你,我现在就是在这个的基础上调的。但是貌似还是不可以。miso那个管脚,始终接到的数据,不能检验通过。
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-7-31 09:49:36 | 显示全部楼层
我这边可以呀,硬件是原子的板子。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-5-10
在线时间
4 小时
 楼主| 发表于 2012-7-31 10:05:51 | 显示全部楼层
回复【5楼】科科1987:
大哥,加小弟个扣扣:568932351
回复 支持 反对

使用道具 举报

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-5-10
在线时间
4 小时
 楼主| 发表于 2012-7-31 10:08:09 | 显示全部楼层
回复【6楼】linux_rookie:
---------------------------------
我用的也是 那个板子,然后 测试用的板子,是一个小开发板 用杜邦线 连接起来。
回复 支持 反对

使用道具 举报

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-5-10
在线时间
4 小时
 楼主| 发表于 2012-7-31 10:48:58 | 显示全部楼层
回复【5楼】科科1987:
---------------------------------
大哥留个扣扣呗,拜谢!
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-7-31 14:56:46 | 显示全部楼层
回复【8楼】linux_rookie:
回复【5楼】科科1987:
---------------------------------
大哥留个扣扣呗,拜谢!
---------------------------------
784985211
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2012-8-1 09:13:48 | 显示全部楼层
这个问题解决了,程序没有问题,是电平不匹配。语音芯片和STM32须共用电源。
永远保持一颗学习的心态。
回复 支持 反对

使用道具 举报

15

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2012-5-10
在线时间
4 小时
 楼主| 发表于 2012-8-6 08:49:46 | 显示全部楼层

这段代码在起初调试的时候遇到了很多困难,感谢论坛 坛友的大力相助。此段代码在使用中做了一些改进。现在分享给大家希望大家一同学习进步。

程序中的改动:

此段程序实现 上电开始录音 10秒,10秒后自动连续播放刚才录制的音频。

增添了几个录音需要的库函数。void SetREC(u8 cNum);

void ISD_STOP(void);

void ISD_G_ERASE(void);

 

将地址段数组缩小,为了方便测试。起始地址依据手册改成 0x0010

Apc 设置成线路和mic同时录音 直通模式。

ISD_SendData 函数在时钟上升沿之前加进了 1微妙的延时,确保命令信号保持稳定。(也许没有必要)

 

此改动只是可以实现定点录音 定点放音。其中也许有很多冗余和不足的地方。望大家指教!!

ISD1760驱动程(实现定点录音、定点放音).rar

656.8 KB, 下载次数: 1493

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-8-6 09:12:31 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-7-24
在线时间
0 小时
发表于 2013-7-24 16:09:36 | 显示全部楼层
楼主,遇到和你一样的问题,求指教
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
22
金钱
22
注册时间
2013-7-24
在线时间
0 小时
发表于 2013-7-24 16:18:04 | 显示全部楼层
回复【10楼】科科1987:
---------------------------------
直接用32给芯片供电不行吗?
回复 支持 反对

使用道具 举报

38

主题

527

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1424
金钱
1424
注册时间
2011-11-27
在线时间
122 小时
发表于 2013-7-24 17:02:53 | 显示全部楼层
可以
回复 支持 反对

使用道具 举报

6

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-3-20
在线时间
11 小时
发表于 2013-7-26 16:01:46 | 显示全部楼层
大谢各位大神
微博Sweeneycc
回复 支持 反对

使用道具 举报

27

主题

774

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1473
金钱
1473
注册时间
2013-4-12
在线时间
77 小时
发表于 2013-7-26 16:09:09 | 显示全部楼层
回复【3楼】科科1987:
---------------------------------
这程序好熟悉啊,是您的写的吗?
简单是多么的快乐,而快乐就因你而简单!微芯动力LTKKS
回复 支持 反对

使用道具 举报

6

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2013-3-20
在线时间
11 小时
发表于 2013-7-26 20:59:35 | 显示全部楼层
回复【11楼】linux_rookie:
--------------------------------请教下大神、为什么那个ISD_SPI初始化的时候,用到PC口去了,不是直接用ISD1700上的SPI线直接接SPI1吗?
微博Sweeneycc
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2014-8-20
在线时间
0 小时
发表于 2014-8-20 17:10:18 | 显示全部楼层
我换成库函数的就不能用了
回复 支持 反对

使用道具 举报

3

主题

16

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-9-28
在线时间
0 小时
发表于 2014-10-19 22:38:07 | 显示全部楼层
怎么没有这个h文件啊
#include <stm32f10x_lib.h>,
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-10-27
在线时间
2 小时
发表于 2015-1-8 22:50:45 | 显示全部楼层
#include<stm32f10x_lib.h>没有这个文件啊?小弟能力有限,希望大哥们看看这个程序改咋改?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-10-27
在线时间
2 小时
发表于 2015-1-8 22:51:28 | 显示全部楼层
回复【21楼】有前途:
---------------------------------
我用的是stm32f10x_rc
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2014-10-27
在线时间
2 小时
发表于 2015-1-16 22:47:04 | 显示全部楼层

我大二学生一枚,理解了一下程序,大概照抄了一遍,不能实现,请大家帮忙看看,谢了!

语音.zip

1.06 MB, 下载次数: 942

回复 支持 反对

使用道具 举报

嘉嘉嘉明 该用户已被删除
发表于 2017-4-16 16:41:34 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

10

主题

80

帖子

0

精华

高级会员

Rank: 4

积分
514
金钱
514
注册时间
2017-5-21
在线时间
82 小时
发表于 2019-4-20 08:34:48 来自手机 | 显示全部楼层
楼主你那个是地址全部清除再录音是可以的。但是我想在地址中某一处录音要怎么办呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2020-7-1
在线时间
0 小时
发表于 2020-7-1 16:33:01 | 显示全部楼层
科科1987 发表于 2012-7-30 20:00
你试试这个~

/*ISD1760的录放音程序。 &nbsp;*/

能直接用,效果非常好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 06:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表