打印

香主,请教个spi的问题

[复制链接]
1362|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yang4469|  楼主 | 2013-11-15 18:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我两片stm32单线双向模式通信,只是主给从发或者从给主发,能4分频,18MHZ的速度。但是如果主先给从发,等待一段时间,从给主发,达不到4分频,只能16分频,4.5MHz
STM32 SPI单线双向的硬件速率提不到那么高吗?
沙发
feilusia| | 2013-11-15 20:04 | 只看该作者
建议加上拉电阻再进行测试。

使用特权

评论回复
板凳
yang4469|  楼主 | 2013-11-16 11:31 | 只看该作者
feilusia 发表于 2013-11-15 20:04
建议加上拉电阻再进行测试。

????上啦电阻。。。。。。。
我现在把主从的DMA通道发送数量调整到合适的时候,可以保证数据正确
可是尼玛木有任何依据啊,找不到原因

使用特权

评论回复
地板
香水城主| | 2013-11-16 11:53 | 只看该作者
“DMA通道发送数量调整到合适的时候,可以保证数据正确”,这个合适的数量是多少?怎么能知道多少合适?

使用特权

评论回复
5
feilusia| | 2013-11-16 11:56 | 只看该作者
yang4469 发表于 2013-11-16 11:31
????上啦电阻。。。。。。。
我现在把主从的DMA通道发送数量调整到合适的时候,可以保证数据正确
可 ...

我以前不会用的时候也是只到4.5M,现在能到18M,原因有两个:
1)主从机在中断函数里都没有判断数据是否完全传输完毕。
2)没有加上拉。

使用特权

评论回复
6
yang4469|  楼主 | 2013-11-16 12:08 | 只看该作者
本帖最后由 yang4469 于 2013-11-16 12:15 编辑
香水城主 发表于 2013-11-16 11:53
“DMA通道发送数量调整到合适的时候,可以保证数据正确”,这个合适的数量是多少?怎么能知道多少合适? ...

我是主机发送6位,从机接受3位,从机在给主发N+1位,主机接受N位,
主机循环发送接受。从机根据中断进入发送接收。从机第一次接受到的是前面3个字节,第二次以后就一直是后面3个字节

使用特权

评论回复
7
yang4469|  楼主 | 2013-11-16 12:12 | 只看该作者
本帖最后由 yang4469 于 2013-11-16 12:23 编辑
feilusia 发表于 2013-11-16 11:56
我以前不会用的时候也是只到4.5M,现在能到18M,原因有两个:
1)主从机在中断函数里都没有判断数据是否 ...

针对你说的两个原因,
1)主从判断数据的接受完成不是判断通道的完成标志吗?
我判断通道3发送完成是用的while( ( DMA1->ISR & 0x200 ) == 0 );请问这样有问题吗?
2)上拉电阻?
我从机配置的上拉输入。而且当接受到主机的数据后,判断正确后就会从硬件模式切换为软件模式,软件拉低控制为从机。发送完成后再切换为硬件模式

使用特权

评论回复
8
feilusia| | 2013-11-16 13:30 | 只看该作者
yang4469 发表于 2013-11-16 12:12
针对你说的两个原因,
1)主从判断数据的接受完成不是判断通道的完成标志吗?
我判断通道3发送完成是用的w ...

/*******************************************************************************
* Function Name  : SPI2_ReceiveSendByte_Completed
* Description    : 等待DMA发送和接收完成,清标志位
* Input          : None
* Return         : SPI2_ReceiveSend_Error or STM32_OK
*******************************************************************************/
u8 SPI2_ReceiveSendByte_Completed(void)
{
        u32 timeout = 0;                                                                                                                                                                                        //超时       

        /******等待DMA接收完毕*********/
        timeout = TIMEOUT;
        while((DMA1->ISR & (1<<13)) == 0)                                                                                                                        //等待通道4传输完成  
        {
                if((timeout--) == 0)
                        return(SPI2_ReceiveSend_Error);
        }
       
        timeout = TIMEOUT;       
        while((DMA1->ISR & (1<<17)) == 0)                                                                                                                        //等待通道5传输完成
        {
                if((timeout--) == 0)
                        return(SPI2_ReceiveSend_Error);
        }
       
        timeout = TIMEOUT;       
        while((SPI2->SR) & (1 << 7))                                                                                                                                        //判断BSY是否忙       
        {
                if((timeout--) == 0)
                        return(SPI2_ReceiveSend_Error);
        }


        /******清除DMA传输完成标志位*********/       
  DMA1->IFCR |= 1 << 13;                                                                                                                                                                //清DMA第4通道传输完成标志       
  DMA1->IFCR |= 1 << 17;                                                                                                                                                                //清DMA第5通道传输完成标志               

       
        DMA1_Channel4->CCR &= ~(1 << 0);                                                                              //关闭DMA通道4接收通道
        DMA1_Channel5->CCR &= ~(1 << 0);                                                                              //关闭DMA通道5发送通道

       
        return(STM32_OK);       
}

使用特权

评论回复
9
cjhk| | 2013-11-17 09:28 | 只看该作者
通过将电平上啦   不知道能不能解决这个问题   楼主

使用特权

评论回复
10
yang4469|  楼主 | 2013-11-17 09:48 | 只看该作者
本帖最后由 yang4469 于 2013-11-17 10:18 编辑
cjhk 发表于 2013-11-17 09:28
通过将电平上啦   不知道能不能解决这个问题   楼主

你们说的是将SCK,MISO,MOSI,NSS都上拉?
我没加上拉电阻,而是通信线上加了个22Ω电阻,问题就解决了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

267

帖子

0

粉丝