可能是我级别太低吧,我这儿没有高级回复的功能。
只有以下几个功能:
2010-8-6 08:45 | 只看该作者 回复 引用 评分 报告 返回版面 TOP  

得分:0
点赞  2010-8-6 15:17
                                 晕,每个人都有,就在输入框的右上角,
点赞  2010-8-6 18:41
哦,没有看见,以前没发过图片。呵呵...
第三次取到的数据是0X00,没有截图。

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

第一次读的数据

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

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

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

点赞  2010-8-6 22:20
                                 请贴出波形图。
点赞  2010-8-7 10:13
你看一下,是不是这个,谢谢了。

读时序.JPG (27.72 KB)

这个是时序图

说明.JPG (66.32 KB)

这个是说明

点赞  2010-8-7 17:49

我设置的是一次只读一个寄存器的。
点赞  2010-8-7 17:49

没人回复了?
点赞  2010-8-9 08:44

我想请教您一下:假设SPI1为主设备,SPI2为从设备,这个
SPI_SendData(SPI2,0X55);
函数中的0X55写在SPI2的哪个寄存器了?我看库函数写的是DR寄存器,但是通过SPI-DR寄存器并没有看到0X55这个数啊?谢谢!
点赞  2010-8-9 11:35
                                 读写SPI_DR操作的是不同的物理寄存器,读时操作的是接收寄存器,写时操作的是发送寄存器,程序员无法读发送寄存器,也无法写接收寄存器!
点赞  2010-8-9 12:02
STM32的SPI在作为主设备,与一个带有SPI接口的AD芯片通信。
      时钟,相位都配置的对,数据位配置为8位。
      我想问一下:在STM32的SPI主设备从从设备读取数据时,是不是需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据?
      如果是,这个时钟是8个SCLK,还是16个SCLK?
      谢谢!
根据25楼给的时序图,现在可以回答你的问题:为了提供从SPI设备的时钟,主SPI设备需要向从SPI设备任意发送一个字节的数据,才能从从设备中读取数据;这个时钟是8个SCLK。
点赞  2010-8-9 15:16

现在调试出现了一个问题,本来是第一次读就该出来的数据,却在第二次读的时候才出来,例如:从某个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位,依次类推。是不是这样的呢?谢谢。
点赞  2010-8-10 18:05
你的猜测是错误的,按照你的猜测,就没有必要设置8位或16位模式了。

你把读数据的那部分代码贴出来看看。
点赞  2010-8-10 18:51


32# 版主

  1. for(im=0;im<25;im++)
  2. {
  3. while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
  4. SPI_I2S_SendData(SPI2, temp++);

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

  12. }
复制代码
点赞  2010-8-12 10:16
                                 我用模拟的SPI都没有这个问题,读出来的数据也没有我在31楼所说的问题。但我调试一些ST读SPI接口的FLASH芯片的例程时,也没有发现数据移位的问题。不知道这个为什么会出现这个问题?实在不解,望指教!谢谢!
点赞  2010-8-12 10:21
                                 你有没有用示波器看看33楼的程序产生的波形?
点赞  2010-8-12 10:29
                                 时钟正常,STM32的DIN管脚有数据输入,DR里有值,但就是取不出来。当第二次发送时钟时,数据就出来了。
点赞  2010-8-12 14:50
时钟正常,STM32的DIN管脚有数据输入,DR里有值,但就是取不出来。当第二次发送时钟时,数据就出来了。
“DR里有值” 什么值?
“但就是取不出来” 什么叫取不出来?前面你怎么知道“DR里有值”?
“第二次发送时钟” 第二次相对什么说的?是发送第二个命令字的时钟吗?
点赞  2010-8-12 14:54


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.第二次发送时钟就是指我在开始说的:为了向从设备提供一个时钟,不是发送第二个命令字的时钟,而是为了从从设备读取数据。
不知道我描述的清楚了没有?呵呵。。。谢谢!
点赞  2010-8-12 17:54
1.通过KEIL软件的SPI外设的窗口发现SPI-DR是有值的。且值是对的。
2.“取不出来”意思就是Regs_Value = =  SPI_I2S_ReceiveData(SPI2);这条语句没有起作用,或者说,在SPI的下一条发送八个时钟的语句中即下一句:
w ...
adofu2008 发表于 2010-8-12 17:54
点赞  2010-8-12 18:24
                                 不好意思啊,笔误,不小心沾错了。再说了,如果是两个等号,后面的数据应该一个也读不出来啊?呵呵。。。
点赞  2010-8-13 10:22
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复