打印

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

[复制链接]
楼主: adofu2008
手机看帖
扫描二维码
随时随地手机跟帖
21
adofu2008|  楼主 | 2010-8-6 15:17 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
20# 香水城
可能是我级别太低吧,我这儿没有高级回复的功能。
只有以下几个功能:
2010-8-6 08:45 | 只看该作者 回复 引用 评分 报告 返回版面 TOP  
得分:0

使用特权

评论回复
22
香水城| | 2010-8-6 18:41 | 只看该作者
晕,每个人都有,就在输入框的右上角,:L

使用特权

评论回复
23
adofu2008|  楼主 | 2010-8-6 22:20 | 只看该作者
哦,没有看见,以前没发过图片。呵呵...
第三次取到的数据是0X00,没有截图。

第一次读数据.JPG (153.66 KB )

第一次读的数据

第一次读的数据

第二次读数据.JPG (197.94 KB )

第二次读数据.JPG

第四次读数据.JPG (198.48 KB )

第四次读数据.JPG

第N次读数据.JPG (183.92 KB )

第N次读数据.JPG

使用特权

评论回复
24
香水城| | 2010-8-7 10:13 | 只看该作者
请贴出波形图。

使用特权

评论回复
25
adofu2008|  楼主 | 2010-8-7 17:49 | 只看该作者
你看一下,是不是这个,谢谢了。

读时序.JPG (27.72 KB )

这个是时序图

这个是时序图

说明.JPG (66.32 KB )

这个是说明

这个是说明

使用特权

评论回复
26
adofu2008|  楼主 | 2010-8-7 17:49 | 只看该作者
24# 香水城
我设置的是一次只读一个寄存器的。

使用特权

评论回复
27
adofu2008|  楼主 | 2010-8-9 08:44 | 只看该作者
24# 香水城
没人回复了?

使用特权

评论回复
28
adofu2008|  楼主 | 2010-8-9 11:35 | 只看该作者
2# 香水城
我想请教您一下:假设SPI1为主设备,SPI2为从设备,这个
SPI_SendData(SPI2,0X55);
函数中的0X55写在SPI2的哪个寄存器了?我看库函数写的是DR寄存器,但是通过SPI-DR寄存器并没有看到0X55这个数啊?谢谢!

使用特权

评论回复
29
香水城| | 2010-8-9 12:02 | 只看该作者
读写SPI_DR操作的是不同的物理寄存器,读时操作的是接收寄存器,写时操作的是发送寄存器,程序员无法读发送寄存器,也无法写接收寄存器!

使用特权

评论回复
30
香水城| | 2010-8-9 15:16 | 只看该作者
STM32的SPI在作为主设备,与一个带有SPI接口的AD芯片通信。
      时钟,相位都配置的对,数据位配置为8位。
      我想问一下:在STM32的SPI主设备从从设备读取数据时,是不是需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据?
      如果是,这个时钟是8个SCLK,还是16个SCLK?
      谢谢!
adofu2008 发表于 2010-8-4 17:32


根据25楼给的时序图,现在可以回答你的问题:为了提供从SPI设备的时钟,主SPI设备需要向从SPI设备任意发送一个字节的数据,才能从从设备中读取数据;这个时钟是8个SCLK。

使用特权

评论回复
31
adofu2008|  楼主 | 2010-8-10 18:05 | 只看该作者
30# 香水城
现在调试出现了一个问题,本来是第一次读就该出来的数据,却在第二次读的时候才出来,例如:从某个SPI芯片读出来的数据,时序图已经贴过,读第一次应出来数据0x52,第二次0X86,第三次0X54,。。。依次把它们放进一个数组中。REGS[],出现这样一个怪现象,REGS[0] = 0X00,REGS[1]=0X52,REGS[2]=0X86,REGS[3]=0X54,。。。,我保证数组索引没有错。数据读时序就是25楼帖的图。想请教一下香大侠:这是什么原因呢?
      我猜是下面的一个原因,不知道对不对?还望指教。
      SPI-DR是一个16位的循环移位寄存器,我设置的是MSB先出,8位的数据格式。可能是这个寄存器先把读出来的8位数据移位到SPI-DR中的高八位,再读进下一个8位数据时,先前读出来的8位数据被移位到低8位,从而被读出来。在读第三个数据时,第二个数据被移位到低8位,依次类推。是不是这样的呢?谢谢。

使用特权

评论回复
32
香水城| | 2010-8-10 18:51 | 只看该作者
你的猜测是错误的,按照你的猜测,就没有必要设置8位或16位模式了。

你把读数据的那部分代码贴出来看看。

使用特权

评论回复
33
adofu2008|  楼主 | 2010-8-12 10:16 | 只看该作者
本帖最后由 adofu2008 于 2010-8-13 10:21 编辑

32# 香水城
 
for(im=0;im<25;im++)
{
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, temp++);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);
//以上两个发送是一个命令字,提供给某一个SPI接口的芯片命令字。
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2, 0X00);//这个就是任意发送的一个字节,为了给从SPI提供一个时钟信号
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE)==RESET);
Regs_Value[im]  =  SPI_I2S_ReceiveData(SPI2);//从芯片内部读取数据,放到数组Regs_Value里

}

使用特权

评论回复
34
adofu2008|  楼主 | 2010-8-12 10:21 | 只看该作者
我用模拟的SPI都没有这个问题,读出来的数据也没有我在31楼所说的问题。但我调试一些ST读SPI接口的FLASH芯片的例程时,也没有发现数据移位的问题。不知道这个为什么会出现这个问题?实在不解,望指教!谢谢!

使用特权

评论回复
35
香水城| | 2010-8-12 10:29 | 只看该作者
你有没有用示波器看看33楼的程序产生的波形?

使用特权

评论回复
36
adofu2008|  楼主 | 2010-8-12 14:50 | 只看该作者
时钟正常,STM32的DIN管脚有数据输入,DR里有值,但就是取不出来。当第二次发送时钟时,数据就出来了。

使用特权

评论回复
37
香水城| | 2010-8-12 14:54 | 只看该作者
时钟正常,STM32的DIN管脚有数据输入,DR里有值,但就是取不出来。当第二次发送时钟时,数据就出来了。
adofu2008 发表于 2010-8-12 14:50


“DR里有值” 什么值?
“但就是取不出来” 什么叫取不出来?前面你怎么知道“DR里有值”?
“第二次发送时钟” 第二次相对什么说的?是发送第二个命令字的时钟吗?

使用特权

评论回复
38
adofu2008|  楼主 | 2010-8-12 17:54 | 只看该作者
本帖最后由 adofu2008 于 2010-8-13 10:22 编辑

1.通过KEIL软件的SPI外设的窗口发现SPI-DR是有值的。且值是对的。
2.“取不出来”意思就是Regs_Value[im] =   SPI_I2S_ReceiveData(SPI2);这条语句没有起作用,或者说,在SPI的下一条发送八个时钟的语句中即下一句:
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);

SPI_I2S_SendData(SPI2, temp++);
才读出了本该在上一次读出的数据。
3.第二次发送时钟就是指我在开始说的:为了向从设备提供一个时钟,不是发送第二个命令字的时钟,而是为了从从设备读取数据。
不知道我描述的清楚了没有?呵呵。。。谢谢!

使用特权

评论回复
39
香水城| | 2010-8-12 18:24 | 只看该作者
1.通过KEIL软件的SPI外设的窗口发现SPI-DR是有值的。且值是对的。
2.“取不出来”意思就是Regs_Value = =  SPI_I2S_ReceiveData(SPI2);这条语句没有起作用,或者说,在SPI的下一条发送八个时钟的语句中即下一句:
w ...
adofu2008 发表于 2010-8-12 17:54


你为什么要用2个等号? 这样能读出数据才叫怪呢!:@

使用特权

评论回复
40
adofu2008|  楼主 | 2010-8-13 10:22 | 只看该作者
不好意思啊,笔误,不小心沾错了。再说了,如果是两个等号,后面的数据应该一个也读不出来啊?呵呵。。。

使用特权

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

本版积分规则