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

niuaniuya   2010-8-4 17:32 楼主
STM32的SPI在作为主设备,与一个带有SPI接口的AD芯片通信。
      时钟,相位都配置的对,数据位配置为8位。
      我想问一下:在STM32的SPI主设备从从设备读取数据时,是不是需要主SPI为了提供从SPI的时钟而需要向SPI任意发送一个字节的数据才能从从设备中读取数据?
      如果是,这个时钟是8个SCLK,还是16个SCLK?
      谢谢!

回复评论 (45)

                                 这个问题要看你的SPI设备什么时候要发送数据,需要多少个时钟周期?
点赞  2010-8-4 18:11
                                 我用绝对地址去取SPI1_DR的内容,在MEMORY也看到数据了,在SPI1_DR中也看到数据了,就是用指针去指这个绝对地址时总是第一个数据取不出来,其余的数据都可以取出来,而且也都正确,请问您一下这是什么原因呢?
点赞  2010-8-5 15:58


我用绝对地址去取SPI1_DR的内容,在MEMORY也看到数据了,在SPI1_DR中也看到数据了,就是用指针去指这个绝对地址时总是第一个数据取不出来,其余的数据都可以取出来,而且也都正确,请问您一下这是什么原因呢?
点赞  2010-8-5 15:59
我不明白“用绝对地址去取SPI1_DR的内容”与“用指针去指这个绝对地址”有什么区别?

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

这是我的附件,东西都在里边呢,不用看帖子上的代码了。

STM32 SPI问题.rar (243.28 KB)

点赞  2010-8-5 16:16
                                 对不起,我没有时间看你的代码。
点赞  2010-8-5 16:23

那我给你贴出来吧,
  1. u32 *p = (u32 *)0x4000380C;//这是定义SPI2—DR的地址
  2. for(im=0;im<25;im++)
  3. {
  4. while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
  5. SPI_I2S_SendData(SPI2, temp++);
  6. Delay(1);
  7. while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
  8. SPI_I2S_SendData(SPI2, 0X00);
  9. Delay(1);
  10. //以上两个发送是一个命令字,提供给某一个SPI接口的芯片命令字。
  11. while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
  12. SPI_I2S_SendData(SPI2, 0X00);//这个就是任意发送的一个字节,为了给从SPI提供一个时钟信号
  13. Regs_Value[im] = *p;//P指向的就是SPI2-DR,从芯片内部读取数据,放到数组Regs_Value里
  14. Delay(1);
  15. }
  16. 以上是我取了25个值,这25个值是由一个芯片输出的。
复制代码
点赞  2010-8-5 16:34

这个是四张抓图,您看一下吧。

图片.rar (239.58 KB)

点赞  2010-8-5 16:40
                                 我5楼的帖子你看见了吗? 8楼贴出的代码与我5楼的帖子有关吗?
点赞  2010-8-5 17:02

我看过了,可是我在读取数据时已经发送过时钟了啊,况且我后面的数据也都是正确的啊?这个P也就是指向SPI2-DR的地址,我没有用库里的SPI-Receive()函数来读取,(我以前用来,也读不出来的,我才想着用指针去读的),我的那几张截图就是说明这个问题的。我感到很是奇怪,希望您帮我解惑一下。谢谢您!
点赞  2010-8-5 17:18
                                 可能是读SPI_DR之前没判断SPI_I2S_FLAG_RXNE位。
点赞  2010-8-5 17:49
                                 判断也不行啊,我已经试过了,这个问题困惑我好几天了。有知道的请回复一下,谢谢了。
点赞  2010-8-5 17:59
                                 还有个可能,是你前面只SEND,实际SPI_DR也收到数据了但没有读出,会产生OVR错误,后来从SPI_DR读出的是之前的数据。你试试每次SEND之后都读一次SPIDR。
点赞  2010-8-5 18:15
                                 好的,我试试吧,我这个芯片是发送两个命令字才送出一个数据的,也就是在第17个时钟沿儿才会有数据的。按你说的,那芯片就错了。我用示波器看过,数据也确定是在第17个时钟沿儿到来的。
点赞  2010-8-5 18:17

不行啊,兄弟,我这个以前也试过了,还是不会出来啊?
点赞  2010-8-5 18:24
                                 你把图片直接贴出来不好吗? 不知道为什么,我这里不能下载。
点赞  2010-8-5 18:34
                                 没道理啊。。。你把优化级别设置为0看看,或者把你新程序贴出来看看
点赞  2010-8-5 18:36
大哥,不是我不想上传,而是这里上传图片太麻烦了。以下是我传到别的网站又转过来的,您看一下吧。谢谢。第一次读数据
第二次读数据

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

这个是第N次的
点赞  2010-8-6 07:38
大哥,不是我不想上传,而是这里上传图片太麻烦了。以下是我传到别的网站又转过来的,您看一下吧。谢谢。第一次读数据
第二次读数据
http:// ...
传图片只需点击"高级回复"即可,这么简单都嫌麻烦?
点赞  2010-8-6 08:45
123下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复