打印

为什么SPI CLK间隔时间这么长呢?求高手解答

[复制链接]
2608|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a868247|  楼主 | 2012-12-20 10:01 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
uint16_t SPI_ReadWriteByte(uint16_t TxData)
{
while((SPI1->SR&1<<1) ==0);                                 //等待发送区空      
SPI1->DR =TxData;                                          //发送一个byte
while((SPI1->SR&1<<0) ==0);                                 //等待接收完一个byte               
return SPI1->DR;
}

主函数
while(1)
{
    SPI_ReadWriteByte(0x5555);
  }

我16M SPI时钟,为什么间隔发送时间这么长呢,按道理SPI发送时,也同时接收。收完应该就再发下个数据中间判断时间不用这么长吧

spi_clk.jpg (22.91 KB )

spi_clk.jpg
沙发
a868247|  楼主 | 2012-12-20 17:17 | 只看该作者
木有人回答?

使用特权

评论回复
板凳
uet_cache| | 2012-12-20 17:31 | 只看该作者
这时间不长吧,你的单位都是US级的,已经很快了。那个时间应该是语句切换和执行时间。

使用特权

评论回复
地板
airwill| | 2012-12-20 20:47 | 只看该作者
恐怕是这个语句的问题!
while((SPI1->SR&1<<1) ==0);   
不妨写成
while((SPI1->SR&(1<<1)) ==0);
再试试.

使用特权

评论回复
5
a868247|  楼主 | 2012-12-24 17:09 | 只看该作者
airwill 发表于 2012-12-20 20:47
恐怕是这个语句的问题!
while((SPI1->SR&1

《 优先级比 & 高!并也在程序试了!确实没影响!

使用特权

评论回复
6
seawwh| | 2012-12-24 22:23 | 只看该作者
代码的主体为函数,函数的进入和退出都回需要时间的,建议这样测试一下:
注意: 调整一下优化级别。
vu16  TT;
while {
  while((SPI1->SR&1<<1) ==0);                           //等待发送区空      
  SPI1->DR =0x5566;                                          //发送一个byte
  while((SPI1->SR&1<<0) ==0);                           //等待接收完一个byte   
  TT=SPI1->DR ;         
}

使用特权

评论回复
7
a868247|  楼主 | 2012-12-25 09:38 | 只看该作者
seawwh 发表于 2012-12-24 22:23
代码的主体为函数,函数的进入和退出都回需要时间的,建议这样测试一下:
注意: 调整一下优化级别。
vu16  TT; ...

这样确实优化了点,现在间隔缩短到1US。

使用特权

评论回复
8
捡漏王子| | 2012-12-25 10:58 | 只看该作者
学习了

使用特权

评论回复
9
seawwh| | 2012-12-25 13:32 | 只看该作者
建议使用SPI 的DMA 发送数据,会提高速率的。

使用特权

评论回复
10
seawwh| | 2012-12-25 13:33 | 只看该作者
建议使用SPI 的DMA 发送数据,会提高速率的。

使用特权

评论回复
11
a868247|  楼主 | 2012-12-25 13:39 | 只看该作者
seawwh 发表于 2012-12-24 22:23
代码的主体为函数,函数的进入和退出都回需要时间的,建议这样测试一下:
注意: 调整一下优化级别。
vu16  TT; ...

这样确实优化了,间隔时间缩小了400NS,但现在还有1US存在

使用特权

评论回复
12
a868247|  楼主 | 2012-12-27 17:27 | 只看该作者
seawwh 发表于 2012-12-25 13:33
建议使用SPI 的DMA 发送数据,会提高速率的。

我是周期性的 。也不好用DMA循环采集吧!如果是单次采集,每次初始化DMA,那时候太长了!

使用特权

评论回复
13
seawwh| | 2012-12-31 15:20 | 只看该作者
对于周期性的采集,使用DMA 自动重复传送可以无需CPU干预自动进行,利用DMA的完成中断通知CPU即可。
需要使用2个DMA通道,分别对SPI Tx 和SPI Rx

使用特权

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

本版积分规则

6

主题

97

帖子

1

粉丝