打印

想请教一个关于STM32 SPI时钟的问题

[复制链接]
10580|48
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STM32的SPI在作为主设备,与一个带有SPI接口的AD芯片通信。
      时钟,相位都配置的对,数据位配置为8位。
      我想问一下:在STM32的SPI主设备从从设备读取数据时,是不是需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据?
      如果是,这个时钟是8个SCLK,还是16个SCLK?
      谢谢!
沙发
香水城| | 2010-8-4 18:11 | 只看该作者
这个问题要看你的SPI设备什么时候要发送数据,需要多少个时钟周期?

使用特权

评论回复
板凳
adofu2008|  楼主 | 2010-8-5 15:58 | 只看该作者
我用绝对地址去取SPI1_DR的内容,在MEMORY也看到数据了,在SPI1_DR中也看到数据了,就是用指针去指这个绝对地址时总是第一个数据取不出来,其余的数据都可以取出来,而且也都正确,请问您一下这是什么原因呢?

使用特权

评论回复
地板
adofu2008|  楼主 | 2010-8-5 15:59 | 只看该作者
2# 香水城

我用绝对地址去取SPI1_DR的内容,在MEMORY也看到数据了,在SPI1_DR中也看到数据了,就是用指针去指这个绝对地址时总是第一个数据取不出来,其余的数据都可以取出来,而且也都正确,请问您一下这是什么原因呢?

使用特权

评论回复
5
香水城| | 2010-8-5 16:04 | 只看该作者
我不明白“用绝对地址去取SPI1_DR的内容”与“用指针去指这个绝对地址”有什么区别?

如果“总是第一个数据取不出来”,可能需要像你在楼主位说的那样“需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据”。

使用特权

评论回复
6
adofu2008|  楼主 | 2010-8-5 16:16 | 只看该作者
5# 香水城
这是我的附件,东西都在里边呢,不用看帖子上的代码了。

STM32 SPI问题.rar

243.28 KB

使用特权

评论回复
7
香水城| | 2010-8-5 16:23 | 只看该作者
对不起,我没有时间看你的代码。

使用特权

评论回复
8
adofu2008|  楼主 | 2010-8-5 16:34 | 只看该作者
7# 香水城
那我给你贴出来吧,
u32 *p = (u32 *)0x4000380C;//这是定义SPI2—DR的地址
for(im=0;im<25;im++)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, temp++);
Delay(1);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);
Delay(1);
//以上两个发送是一个命令字,提供给某一个SPI接口的芯片命令字。
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);//这个就是任意发送的一个字节,为了给从SPI提供一个时钟信号
Regs_Value[im] = *p;//P指向的就是SPI2-DR,从芯片内部读取数据,放到数组Regs_Value里
Delay(1);
}
以上是我取了25个值,这25个值是由一个芯片输出的。

使用特权

评论回复
9
adofu2008|  楼主 | 2010-8-5 16:40 | 只看该作者
7# 香水城
这个是四张抓图,您看一下吧。

图片.rar

239.58 KB

使用特权

评论回复
10
香水城| | 2010-8-5 17:02 | 只看该作者
我5楼的帖子你看见了吗? 8楼贴出的代码与我5楼的帖子有关吗?

使用特权

评论回复
11
adofu2008|  楼主 | 2010-8-5 17:18 | 只看该作者
10# 香水城
我看过了,可是我在读取数据时已经发送过时钟了啊,况且我后面的数据也都是正确的啊?这个P也就是指向SPI2-DR的地址,我没有用库里的SPI-Receive()函数来读取,(我以前用来,也读不出来的,我才想着用指针去读的),我的那几张截图就是说明这个问题的。我感到很是奇怪,希望您帮我解惑一下。谢谢您!

使用特权

评论回复
12
janeslee| | 2010-8-5 17:49 | 只看该作者
可能是读SPI_DR之前没判断SPI_I2S_FLAG_RXNE位。

使用特权

评论回复
13
adofu2008|  楼主 | 2010-8-5 17:59 | 只看该作者
判断也不行啊,我已经试过了,这个问题困惑我好几天了。有知道的请回复一下,谢谢了。

使用特权

评论回复
14
janeslee| | 2010-8-5 18:15 | 只看该作者
还有个可能,是你前面只SEND,实际SPI_DR也收到数据了但没有读出,会产生OVR错误,后来从SPI_DR读出的是之前的数据。你试试每次SEND之后都读一次SPIDR。

使用特权

评论回复
15
adofu2008|  楼主 | 2010-8-5 18:17 | 只看该作者
好的,我试试吧,我这个芯片是发送两个命令字才送出一个数据的,也就是在第17个时钟沿儿才会有数据的。按你说的,那芯片就错了。我用示波器看过,数据也确定是在第17个时钟沿儿到来的。

使用特权

评论回复
16
adofu2008|  楼主 | 2010-8-5 18:24 | 只看该作者
14# janeslee
不行啊,兄弟,我这个以前也试过了,还是不会出来啊?

使用特权

评论回复
17
香水城| | 2010-8-5 18:34 | 只看该作者
你把图片直接贴出来不好吗? 不知道为什么,我这里不能下载。

使用特权

评论回复
18
janeslee| | 2010-8-5 18:36 | 只看该作者
:funk:没道理啊。。。你把优化级别设置为0看看,或者把你新程序贴出来看看

使用特权

评论回复
19
adofu2008|  楼主 | 2010-8-6 07:38 | 只看该作者
大哥,不是我不想上传,而是这里上传图片太麻烦了。以下是我传到别的网站又转过来的,您看一下吧。谢谢。第一次读数据
第二次读数据

第三次是个0X00所以没截图
以下是第四次的

这个是第N次的

使用特权

评论回复
20
香水城| | 2010-8-6 08:45 | 只看该作者
大哥,不是我不想上传,而是这里上传图片太麻烦了。以下是我传到别的网站又转过来的,您看一下吧。谢谢。第一次读数据
第二次读数据
http:// ...
adofu2008 发表于 2010-8-6 07:38


传图片只需点击"高级回复"即可,这么简单都嫌麻烦?

使用特权

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

本版积分规则

13

主题

142

帖子

1

粉丝