OpenEdv-开源电子网

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

STM32L152+VS1053+NRF24L01

[复制链接]

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
发表于 2016-3-3 16:47:21 | 显示全部楼层 |阅读模式
1金钱
各位大侠大家好:
     我尝试用STM32L152+VS1053+NRF24L01做一个全双工通话。现在是接收端能接受到,发送端的语音。就是不连续,我用LED亮指示接收到数据,没有数据灭。发射端不断发送数据,接收端能看见LED闪烁。软件截取了原子的一些。原子程序中SPI的速率是72M/8=9M。我用的STM32L152最大是32M。这也语句SPIx2_SetSpeed(SPI_SPEED_8);使我的SPI工作在32/8=4M。我把8分频改为4分频后,想加大SPI的速率,结果读写VS1053就不正常。

不知道这是什么原因,为何72M系统下SPI 9M都正常,32M系统下4M都不行???

望大家帮帮忙,谢谢!
void SPIx1_Init(void)
{       
  GPIO_InitTypeDef  GPIO_InitStructure;
        SPI_InitTypeDef  SPI_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//PORTAê±Öóê1Äü        
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//SPI1ê±Öóê1Äü

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;// ¸′ó&#195A5£&#172A6£&#172A7  
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
       
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//è«Ë«1¤Ä£ê½       
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//SPIÖ÷»ú
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8bitêy¾Y¸ñê½       
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;//CPOL=0걿ÕÏDÄ£ê½ÏÂSCKÎa1
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;//μúò»¸öê±ÖóμÄϽμÑØ,CPHA=1 CPOL=1         
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;//Äú2¿′óé豸ѡÔñ
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;//Fsck=Fcpu/2562¨ìØÂê
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//Ïè·¢Ëí¸ßλ
        SPI_InitStructure.SPI_CRCPolynomial = 7;
        SPI_Init(SPI1, &SPI_InitStructure);//¸ù¾Y2Îêy3õê¼»ˉSPI1μÄíaéè¼Ä′æÆ÷
        SPI_Cmd(SPI1, ENABLE); //SPIé豸ê1Äü
        SPIx1_ReadWriteByte(0xff);//Æô¶ˉ′«êä



最佳答案

查看完整内容[请看2#楼]

原子您好,您的意思是缓冲区影响了吗? 我先是一次读取512个字节到缓存,然后发送,每次发送32个字节,循环16次发完。接收端接收到512个字节后,通过SPI一次送到VS1053。 从VS1053读函数: void read2_pcm(void) { u16 w; u16 idx=0; w=VS2_RD_Reg(SPI_HDAT1); if((w>=256)&&(w8; }; } } 发送函数: void send512(u8 *txbuf) { u8 temp[33] = {0}; //óÃà′·Ö±eè¡Ç°32 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
 楼主| 发表于 2016-3-3 16:47:22 | 显示全部楼层
原子您好,您的意思是缓冲区影响了吗?

我先是一次读取512个字节到缓存,然后发送,每次发送32个字节,循环16次发完。接收端接收到512个字节后,通过SPI一次送到VS1053。

从VS1053读函数:
void read2_pcm(void)
{
        u16 w;       
        u16 idx=0;
  w=VS2_RD_Reg(SPI_HDAT1);       
        if((w>=256)&&(w<896))
        {
                PCM_flag = 1;
                idx=0;       
                while(idx<512)
                {         
                        w=VS2_RD_Reg(SPI_HDAT0);//delay_ms(1);                                               
                        recbuf[idx++]=w&0XFF;
                        recbuf[idx++]=w>>8;
                };
   }
}
发送函数:
void send512(u8 *txbuf)
{
        u8 temp[33] = {0};          //ó&#195;à′·&#214;±eè&#161;&#199;°32&#206;&#187;oíoó32&#206;&#187;
        u16 i,j;
        for(i = 0;i < 16;i++)
        {
                for(j = 32*i;j < 32*(i+1);j++)
                {
                        temp[j-32*i] = txbuf[j];
                }
//                NRF24L01_TxPacket(temp);          //μè′y·¢&#203;ííê3é
                while(NRF24L01_TxPacket(temp)!=TX_OK) //μè′y·¢&#203;ííê3é
                {

                        if(KEY1 == 1)
//                                goto listen;
                                break;
                         //LED0=0;
                       
                }
        }
}

接收函数:
void receive512(u8 *rxbuf)
{
        u8 temp[33] = {0};          //ó&#195;à′·&#214;±eè&#161;&#199;°32&#206;&#187;oíoó32&#206;&#187;
        u16 i,j;                                                                                   
        for(i = 0;i < 16;i++)
        {
                while(NRF24L01_RxPacket(temp) != 0)
                {
                        //delay_ms(200);LED0=!LED0;
                        if(KEY1 == 0)break;
                        LED0=1;
                }
                LED0=0;
//                NRF24L01_RxPacket(temp);
                for(j = 32*i;j < 32*(i+1);j++)
                {
                        rxbuf[j] = temp[j-32*i];
                }
        }
}
往VS1053送数据函数:
do
                                {
                                        if((VS2_DQ!=0))  // ·&#199;&#212;Yí£ &#203;íêy&#190;Y&#184;&#248;VS1003
                                        {       
                                            VS2_XDCS=0;   
                                for(n=0;n<32;n++)
                                                {
                                                        SPIx1_ReadWriteByte(recbuf[i++]);
                                                }
                                                VS2_XDCS=1;
                                         }
                                 }
                                 while((i<511));

是不是SPi的速度不够快导致的,程序现在是8分频(32M/8=4),正常应该可以调到8M,也是调到8M,通讯就不正常

麻烦原子,帮忙分析分析。谢谢!!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-3-4 00:38:47 | 显示全部楼层
试试做缓冲了
回复

使用道具 举报

11

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
156
金钱
156
注册时间
2013-4-27
在线时间
14 小时
 楼主| 发表于 2016-3-15 10:44:53 | 显示全部楼层
以上问题已解决,现在新的问题又来了额,用nrf24l01做时分全双工通信不成功
回复

使用道具 举报

9

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
184
金钱
184
注册时间
2016-7-18
在线时间
67 小时
发表于 2017-4-10 22:47:57 | 显示全部楼层
楼主最后你解决了吗?你的想法是VS1053和24L01都是分时双工吗?这样会一卡一卡的吗?
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-4-23
在线时间
4 小时
发表于 2017-4-24 10:46:53 | 显示全部楼层
楼主 你这个发送与接受的程序可不可以发一下给我提供一下思路啊 我最近在搞这个 传输信号老是失真
回复

使用道具 举报

7

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2017-9-8
在线时间
98 小时
发表于 2017-10-30 12:21:51 | 显示全部楼层
本帖最后由 Jin庆 于 2017-11-1 11:02 编辑

原子哥,vs1003adpcm录音后通过stm32f1控制nrf24l01发送出去需要加上wav头?,给另一块板子接收播放
回复

使用道具 举报

7

主题

28

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
237
金钱
237
注册时间
2017-9-8
在线时间
98 小时
发表于 2017-11-9 20:43:56 | 显示全部楼层
xurids 发表于 2016-3-3 16:47
原子您好,您的意思是缓冲区影响了吗?

我先是一次读取512个字节到缓存,然后发送,每次发送32个字节,循 ...

请问您这个问题怎么解决的?接受不连续
回复

使用道具 举报

0

主题

8

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2019-12-11
在线时间
4 小时
发表于 2019-12-20 18:35:57 | 显示全部楼层
楼主麻烦您能发程序给我参考一下么我最近也是在做这个碰到难题了谢谢啦 1393533623@qq.com
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-22 22:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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