SCREA 发表于 2013-9-18 11:09:57

求助:vs1003正弦测试

//        VS1003正弦音测试
void VS_SinTest(unsigned char x)
{            
        VS_WriteReg(0x00,0x0820);//启动测试,向0号寄存器写入0x0820   SM_SDINEW为1   SM_TEST为1
        while(VS_DREQ==0);           //等待DREQ变为高电平
        //VS_XDCS=0;                          //打开数据片选 SDI有效
        VS_SelectData()        ;
        VS_WriteByte(0x53);                //写入以下8个字节,进入正弦测试
        VS_WriteByte(0xef);
        VS_WriteByte(0x6e);
        VS_WriteByte(x);                //参数x用来调整正弦测试中正弦波的频率   FsIdx (b7~b5):采样率表索引   S (b4~b0):正弦波的跃速   频率F=Fs X S / 128
        VS_WriteByte(0);                   //比如x=126 (0b 011 11110) FsIdx=011=3   Fs=22050Hz   S=11110=30    F=22050Hz X 30 /128 =5168 Hz
        VS_WriteByte(0);
        VS_WriteByte(0);
        VS_WriteByte(0);
        Delay_ms(500);                        //这里延时一段时间,为了听到“正弦音”
        VS_WriteByte(0x45);                //写入以下8个字节,退出正弦测试
        VS_WriteByte(0x78);
        VS_WriteByte(0x69);
        VS_WriteByte(0x74);
        VS_WriteByte(0);
        VS_WriteByte(0);
        VS_WriteByte(0);                          
        VS_WriteByte(0);
        //VS_XDCS=1;                          //关闭数据片选 ,SDI无效
        VS_DeselectData();
} =====================================
问 1:这段代码执行耳机就能听到正弦声音?

qq2355355257 发表于 2013-9-18 11:37:07

VS1003正弦波测试的两种模式,播放语音过程中是不可以利用vs1003自带的正弦测试模式来播放正弦波。

并且要注意是在使用从机模式还是standalone模式,主机模式不可以用spi总线,standalone可以用spi总线来传输音频数据流。楼主看下数据手册!
http://www.eechina.com/thread-35875-1-1.html参考下

SCREA 发表于 2013-9-18 12:48:19

本帖最后由 SCREA 于 2013-9-18 12:49 编辑

qq2355355257 发表于 2013-9-18 11:37 static/image/common/back.gif
VS1003正弦波测试的两种模式,播放语音过程中是不可以利用vs1003自带的正弦测试模式来播放正弦波。

并且要 ...

我昨天看了一天的英文datasheet。知道大概怎么操作。但是,怎么启动SPI传输。能说的具体点么。
主机模式?我不太懂,我把我的主控MCU设置为主机模式。你说的主机模式是?

qq2355355257 发表于 2013-9-18 12:57:27

SCREA 发表于 2013-9-18 12:48 static/image/common/back.gif
我昨天看了一天的英文datasheet。知道大概怎么操作。但是,怎么启动SPI传输。能说的具体点么。
主机模式 ...

http://bbs.ednchina.com/BLOG_ARTICLE_260281.HTM参考下

SCREA 发表于 2013-9-18 13:24:09

本帖最后由 SCREA 于 2013-9-18 13:59 编辑

qq2355355257 发表于 2013-9-18 12:57 static/image/common/back.gif
http://bbs.ednchina.com/BLOG_ARTICLE_260281.HTM参考下

   后来,查网上的资料,说VS1003的SPI时序需要注意,如果调不好数据是乱得。于是我试着在每次SPI发送8bit数据之间加了一点延时,其他的地方没变。再试验,果然成功了,读0x00单元内容为0x0800,和数据手册上说的一样了,又试了写寄存器也没有问题了。
===========================
我用的硬件SPI读取unsigned char   SPIPutChar(unsigned char dat)//通过SPI发送一个字节的数据
{
        SPDR = dat;
        while((SPSR & (1 << SPIF)) == 0);
        return (SPDR);
}这个读取   a=SPIPutChar(0x0);   
a应该是0x0800对吧
但我还是0

SCREA 发表于 2013-9-18 14:50:16

本帖最后由 SCREA 于 2013-9-18 15:10 编辑

{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:} {:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}{:huffy:}
哪不对voidMSPI_Init(void)//SPI初始化
{
        SPCR = 0;
        SPCR = (1 << SPE) | (1 << MSTR)   | _BV(SPR1) | _BV(SPR0);        //使能SPI,主机方式,MSB在前,模式0,64分频.
}
voidInitPortVS1003(void)//ATmega16与vs1003的接口的初始化
{
        DDRB |= _BV(PB1) | _BV(PB5) | _BV(PB7);        //XRST,MOSI,SCK设置输出
        DDRB &= ~_BV(PB6);                                //MISO设置输入
        PORTB |= _BV(PB1) | _BV(PB5)| _BV(PB6) | _BV(PB7);                //设置上拉


        DDRD|= _BV(PD6) | _BV(PD7);                //分别是:XCS,XDCS
        DDRD &= ~_BV(PD5);                //DREQ,设置输入
        PORTD |= _BV(PD5) | _BV(PD6) | _BV(PD7);       
        MSPI_Init();                //SPI初始化
}


unsigned char   SPIPutChar(unsigned char dat)//通过SPI发送一个字节的数据
{
        SPDR = dat;
        while(!(SPSR & _BV(SPIF)));
        return (SPDR);
}

SCREA 发表于 2013-9-18 15:11:00

qq2355355257 发表于 2013-9-18 12:57 static/image/common/back.gif
http://bbs.ednchina.com/BLOG_ARTICLE_260281.HTM参考下

大神,帮忙看看。拿错了

qq2355355257 发表于 2013-9-18 15:26:21

SCREA 发表于 2013-9-18 15:11 static/image/common/back.gif
大神,帮忙看看。拿错了





你在参考下Datasheet

SCREA 发表于 2013-9-18 15:34:56

qq2355355257 发表于 2013-9-18 15:26 static/image/common/back.gif
你在参考下Datasheet

手册我看了不少回了。
有些细节可能看不到。
现在初步发现我SPI读取写入遇到了问题,就像这张图片,设计了标志打印。
正常1、2、X、3、X、4(x代表返回值)。现在打印出3后就卡住了。明显SPI出了问题。
以下是我的SPI代码voidMSPI_Init(void)//SPI初始化
{
        SPCR = 0;
        SPCR = (1 << SPE) | (1 << MSTR)   | _BV(SPR1) | _BV(SPR0);        //使能SPI,主机方式,MSB在前,模式0,64分频.
}
voidInitPortVS1003(void)//ATmega16与vs1003的接口的初始化
{
        DDRB |= _BV(PB1) | _BV(PB5) | _BV(PB7);        //XRST,MOSI,SCK设置输出
        DDRB &= ~_BV(PB6);                                //MISO设置输入
        PORTB |= _BV(PB1) | _BV(PB5)| _BV(PB6) | _BV(PB7);                //设置上拉


        DDRD|= _BV(PD6) | _BV(PD7);                //分别是:XCS,XDCS
        DDRD &= ~_BV(PD5);                //DREQ,设置输入
        PORTD |= _BV(PD5) | _BV(PD6) | _BV(PD7);       
        MSPI_Init();                //SPI初始化
}


unsigned char   SPIPutChar(unsigned char dat)//通过SPI发送一个字节的数据
{
        SPDR = dat;
        while(!(SPSR & _BV(SPIF)));
        return (SPDR);
}
页: [1]
查看完整版本: 求助:vs1003正弦测试