OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 12006|回复: 23

串口通信与SPI通信问题,请教

[复制链接]

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
发表于 2013-3-21 10:22:53 | 显示全部楼层 |阅读模式
我是用stm32f100 通过SPI接收外部的数据,然后通过232串口和485发送出去,现在不用SPI的话232 和485已经可以发送数据了,但是我加上SPI的一些配置后,程序又运行不了了,请问是什么问题呢?是时钟频率的问题吗?前面的图是232和485程序的时钟配置,第三个是加上SPI后的程序,程序运行后就一直停在/* 等待 SPI2 发送缓冲空 */
  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 这里











外部芯片用SPI模式传给f100的时序是这样的,


这个芯片我用f103接收数据的时候是可以的,但是时钟频率设置为72MHZ



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-21 11:06:55 | 显示全部楼层
不知道F100可否软件仿真?可以的话,软件仿真看看SPI寄存器的状态.方便分析问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-21 11:14:51 | 显示全部楼层
就这样


回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-21 11:18:21 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
还有 用keil编程 device选f103的话下面的程序是可以运行的,系统时钟就是72MHZ

while(1)
 { 
   if(Tx_Idx=BufferSize)
  {
   GPIO_SetBits(GPIOB, GPIO_Pin_12);
   Tx_Idx=0;
  }
   if(Rx_Idx=BufferSize)
   Rx_Idx=0;
    while(Tx_Idx<BufferSize)
   {
   GPIO_ResetBits(GPIOB, GPIO_Pin_12);
/* 等待 SPI2 发送缓冲空 */ 
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
/* SPI2 发送数据 */ 
SPI_I2S_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx]);   

SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE) ;

   /* 等待 SPI2 接收数据完毕 */
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);
/* 读出 SPI2 接收的数据 */ 


   if (SPI_I2S_ReceiveData(SPI2)!=0xFF)
   SPI2_Buffer_Rx[Rx_Idx] = SPI_I2S_ReceiveData(SPI2);
      
   SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_RXNE) ;>
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-21 11:22:15 | 显示全部楼层
只有这个啊???
我说的是这个样子的:



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-21 11:26:46 | 显示全部楼层
不好意思


回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-3-21 13:48:00 | 显示全部楼层
你看下 《 STM32F103x的使用限制》

有些是有冲突的, 你看下是否有关

STM32F103x的使用限制.pdf

169.84 KB, 下载次数: 1239

回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-21 15:20:21 | 显示全部楼层
回复【7楼】aleda303:
---------------------------------
谢谢原子哥,我看了下,我用的是串口1和2,没有与SPI2冲突,程序一直停在/* 等待 SPI2 发送缓冲空 */  
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);  
这里还有什么原因呢
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-21 22:02:36 | 显示全部楼层
回复【8楼】jay517217:
---------------------------------
我怀疑SPI2的时钟没开启。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-21 22:26:33 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
时钟已经打开了啊,    /* 打开 SPI2 时钟 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
现在把这句去掉了SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE) ; 


程序又停在  /* 等待 SPI2 接收数据完毕 */ 
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); 
这里了,也就是说f100可以发送了  可是收不到数据,是不是跟时钟频率有关,还有SPI波特率
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-21 22:29:01 | 显示全部楼层
你看看SPI的SCK,有时钟么??
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-21 22:40:03 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
SPI2 的SCK引脚是PB13 使能了啊,RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO, ENABLE);
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-22 00:06:39 | 显示全部楼层
回复【12楼】jay517217:
---------------------------------
我是说用示波器,看看SPI输出的SCK时钟,有没有.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-22 09:37:38 | 显示全部楼层
回复【13楼】正点原子:
---------------------------------
我看了下,示波器说检测到方形波或脉冲,但是很乱,像是干扰波,不是正规的波形
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-22 10:06:41 | 显示全部楼层
回复【14楼】jay517217:
---------------------------------
是SPI有发送数据的话 SCK才有波形的吧?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-22 11:05:24 | 显示全部楼层
是啊,SPI发送就有SCK波形出来的。你写个代码,让SPI一直发送一个数据,就可以测试了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-22 11:28:11 | 显示全部楼层
回复【16楼】正点原子:
---------------------------------
不接外设,只让MCU发送,用下面的程序
 while(Tx_Idx<BufferSize)
   {
   GPIO_ResetBits(GPIOB, GPIO_Pin_12);
/* 等待 SPI2 发送缓冲空 */ 
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
/* SPI2 发送数据 */ 
SPI_I2S_SendData(SPI2, SPI2_Buffer_Tx[Tx_Idx]);   

 SPI_I2S_ClearFlag(SPI2,SPI_I2S_FLAG_TXE) ;
               }
为什么在f103的开发板上可以一直循环,而在f100上循环了一次后就停在/* 等待 SPI2 发送缓冲空 */ 
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 这里了>
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-22 15:59:47 | 显示全部楼层
回复【17楼】jay517217:
---------------------------------
原子哥,现在SCK和MOSI都有输出了,可还是在while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 这里死循环
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-23 10:39:46 | 显示全部楼层
回复【18楼】jay517217:
---------------------------------
原子哥,SCK  MOSI MISO输出波形都正确了,为什么还是在while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 死循环啊
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-23 11:06:32 | 显示全部楼层
我也不解了,呵呵。
观察下寄存器状态看看吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-23 11:36:27 | 显示全部楼层
在那句死循环后  寄存器这样


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-23 14:20:42 | 显示全部楼层
回复【21楼】jay517217:
---------------------------------
你这SR一直是0...
所以退不出去。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

30

主题

77

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
217
金钱
217
注册时间
2012-11-12
在线时间
0 小时
 楼主| 发表于 2013-3-24 15:06:59 | 显示全部楼层
原子哥,您看现在全速运行是这个样子的,但返回的数据都是0 


回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-8-19
在线时间
1 小时
发表于 2015-12-7 20:51:33 | 显示全部楼层
哥们,你的搞好没,我最近也遇到了这样的问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 01:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表