14446|45

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

想请教一个关于STM32SPI时钟的问题 [复制链接]

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

最新回复

                                 哥们,我情况跟你类似: 1. 读SPI2->DR之前必须往SPI2->DR写个什么数(我写0xFF),否则什么都读不到,修改程序后来了第二个问题; 2. 第一个字符死活读不出来,读SPI2->DR是0xFF,实际上示波器观察MISO数据是0x60;后面的数据暂时看起来读入正常; 寄存器设置如下: static void spiConfig(void){     //SPI2->CRCPR = 0x07;    // as default     SPI2->CR1 = 0x202F;    // CRCEN, MSB first, 125 kHz, Master, CPOL = 1, CPHA = 1     SPI2->CR2 = 0x0004;    // SSOE     SPI2->CR1 = 0x206F;    // SPI EN } void spi_sendByte(uint8_t outData){     SPI2->DR = outData;     while (SPI2->SR & 0x0080);    // busy wait } uint8_t spi_readByte(void){     SPI2->DR = 0xFF;     while (SPI2->SR & 0x0080);    // busy wait     return SPI2->DR; } 还有,很奇怪,SPI2->CR2如果不置SSOE的话,写入SPI2->CR1里的0x206F会变成0x202E,也就是说SPE和MSTR被自动清零了  详情 回复 发表于 2010-8-19 11:32
点赞 关注
 

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
                                 这个问题要看你的SPI设备什么时候要发送数据,需要多少个时钟周期?
此帖出自stm32/stm8论坛
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

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

回复

64

帖子

0

TA的资源

一粒金砂(初级)

4
 


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

回复

99

帖子

0

TA的资源

一粒金砂(初级)

5
 
我不明白“用绝对地址去取SPI1_DR的内容”与“用指针去指这个绝对地址”有什么区别?

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

回复

78

帖子

0

TA的资源

一粒金砂(初级)

6
 

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

STM32 SPI问题.rar (243.28 KB)

此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
                                 对不起,我没有时间看你的代码。
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

8
 

那我给你贴出来吧,
  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个值是由一个芯片输出的。
复制代码
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 

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

图片.rar (239.58 KB)

此帖出自stm32/stm8论坛
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

10
 
                                 我5楼的帖子你看见了吗? 8楼贴出的代码与我5楼的帖子有关吗?
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

11
 

我看过了,可是我在读取数据时已经发送过时钟了啊,况且我后面的数据也都是正确的啊?这个P也就是指向SPI2-DR的地址,我没有用库里的SPI-Receive()函数来读取,(我以前用来,也读不出来的,我才想着用指针去读的),我的那几张截图就是说明这个问题的。我感到很是奇怪,希望您帮我解惑一下。谢谢您!
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

12
 
                                 可能是读SPI_DR之前没判断SPI_I2S_FLAG_RXNE位。
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

13
 
                                 判断也不行啊,我已经试过了,这个问题困惑我好几天了。有知道的请回复一下,谢谢了。
此帖出自stm32/stm8论坛
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

14
 
                                 还有个可能,是你前面只SEND,实际SPI_DR也收到数据了但没有读出,会产生OVR错误,后来从SPI_DR读出的是之前的数据。你试试每次SEND之后都读一次SPIDR。
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

15
 
                                 好的,我试试吧,我这个芯片是发送两个命令字才送出一个数据的,也就是在第17个时钟沿儿才会有数据的。按你说的,那芯片就错了。我用示波器看过,数据也确定是在第17个时钟沿儿到来的。
此帖出自stm32/stm8论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

16
 

不行啊,兄弟,我这个以前也试过了,还是不会出来啊?
此帖出自stm32/stm8论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

17
 
                                 你把图片直接贴出来不好吗? 不知道为什么,我这里不能下载。
此帖出自stm32/stm8论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

18
 
                                 没道理啊。。。你把优化级别设置为0看看,或者把你新程序贴出来看看
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

19
 
大哥,不是我不想上传,而是这里上传图片太麻烦了。以下是我传到别的网站又转过来的,您看一下吧。谢谢。第一次读数据
第二次读数据

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

这个是第N次的
此帖出自stm32/stm8论坛
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

20
 
大哥,不是我不想上传,而是这里上传图片太麻烦了。以下是我传到别的网站又转过来的,您看一下吧。谢谢。第一次读数据
第二次读数据
http:// ...
传图片只需点击"高级回复"即可,这么简单都嫌麻烦?
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved