OpenEdv-开源电子网

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

原子哥,各位高手们,小弟用STM32的GPIO模拟SPI通讯,遇到MISO数据线读取到的永远是高电平,纠结啊。。。----->已解决

[复制链接]

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2013-11-17 10:51:27 | 显示全部楼层 |阅读模式
如题,我连接的从设备是NRF24L01无线发射模块
我将从设备和MCU的MISO连接线断开,直接测从设备上的MISO的波形,输出都是正确的,一连接上MCU就一直是高电平,怎么回事,MCU的上拉输入,下拉输入等等输入输出模式都试过了,都是高电平,拉不低啊


上图是从设备的MISO线连接上MCU得到的波形,下面图是不连接得到的波形


波形图上通道为:Channel 5对应的是MISO,Channel 6对应的是MOSI,Channle 7对应的是CLK
附件是我的模拟SPI程序

soft_spi.h

1.35 KB, 下载次数: 1269

soft_spi.c

2.15 KB, 下载次数: 1233

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2013-11-17 10:52:11 | 显示全部楼层
回复【楼主位】Badu_Space:
---------------------------------
CLK的频率为1MHz左右
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-11-17 11:09:31 | 显示全部楼层
回复【2楼】Badu_Space:
---------------------------------
检查MISO,是不是有问题,一直是3.3V?
强制接GND呢?能拉低么?
可能是焊接问题。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2013-11-17 11:16:21 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
我是用杜邦线连接的,直接和战舰上的杜邦插座相连的,测电压,一直都是3.3V,断开MISO与战舰GPIO,直接测无线模块上的MISO,输出波形正常,一旦连接上GPIO就一直维持高电平

直接拉低还没试,用的NRF24L01模块就是你战舰上面配送的,直接插在战舰上的无线模块接口是可以玩的,用模拟的SPI就不行
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2013-11-17 11:23:56 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我模拟的SPI这样写应该没问题吧,有点担心
u8 Soft_SPI_ReadWrite_Byte(u8 send_data)
{
    u8 i;
    u8 rcv;

//    Soft_SPI_CLK = 0;
    Soft_SPI_MISO_IN(); //设置MISO为输入模式

    for(i = 0;i < 8;i++)
    {
        if(send_data & 0x80)    Soft_SPI_MOSI = 1;  //放上数据
        else    Soft_SPI_MOSI = 0;

        send_data <<= 1;
        rcv <<= 1;

        Soft_SPI_CLK = 0;
        Soft_SPI_CLK = 1;   //上升沿发送数据

        if(Soft_SPI_MISO)   rcv |= 0x01;  //返回来的是"1"
        
//        Soft_SPI_CLK = 0;
    }
    Soft_SPI_CLK = 0;
//    return send_data;   //返回接收到的数据
    return rcv;
}
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-11-17 11:55:00 | 显示全部楼层
回复【5楼】Badu_Space:
---------------------------------
没问题啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2013-11-17 18:23:09 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,调试好了,我用的是GPIOA.3做MISO,原来是485那边影响的,呵呵,谢谢原子哥的解答,准备上51和战舰上调试
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

18

主题

128

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
421
金钱
421
注册时间
2013-2-4
在线时间
214 小时
发表于 2013-12-12 09:41:50 | 显示全部楼层
楼主的 波形是用 什么读的啊?最近也在做nrf24的东西,出了问题,找不到分析的方法。
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2013-12-12 10:39:28 | 显示全部楼层
回复【8楼】sunday151640:
---------------------------------
逻辑分析仪,我用的是这个:http://tradearchive.taobao.com/trade/detail/tradeSnap.htm?spm=a1z09.2.9.21.Fnq3bu&tradeID=247175954754004
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-22
在线时间
0 小时
发表于 2015-6-20 15:43:51 | 显示全部楼层
回复【7楼】八度空间:
---------------------------------
八度空间,您好!
      近几日我用HCS08系列的MCU的I/O口模拟SPI通信,也遇到了与你相同的问题,即当主设备与从设备断开,用逻辑分析仪接从设备时能看到MISO信号变化,可是当主设备与从设备不断开时,看到的MISO信号始终是高电平,请问您是如何解决的,可否告知?谢谢!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-6-21 18:42:04 | 显示全部楼层
回复【10楼】gtf:
---------------------------------
看下有哪些外围和MISO这个管脚相连接的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-22
在线时间
0 小时
发表于 2015-6-23 10:59:26 | 显示全部楼层
回复【11楼】八度空间:
---------------------------------
你好,我按你的回复确认了下,目前只有MISO使用这个管脚,并无与其他外围设备共用!
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-6-23 21:04:29 | 显示全部楼层
回复【12楼】gtf:
---------------------------------
你的初始化代码怎么样的
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2014-12-22
在线时间
0 小时
发表于 2015-6-24 14:22:48 | 显示全部楼层
回复【13楼】八度空间:
---------------------------------
因为MCU选用的是8位的,所以我的初始化代码并没有多复杂,只是对模拟spi总线的四个I/O口做初始化而已,把MOSI、CS片选、SCLK时钟都初始化为输出,而MISO初始化为输入并上拉使能。具体代码如下:
void GPIO_SPI_Init(void) {
  TGDD_PTGDD3=1;    //定义SCLK为输出
  TGSE_PTGSE3=1;
  
  TGDD_PTGDD4=1;    //定义MOSI为输出
  TGSE_PTGSE4=1;
  
  TGDD_PTGDD5=0;    //定义MISO为输入
  TGPE_PTGPE5=1;    //PTG5上拉使能
  
  TGDD_PTGDD6=1;    //定义CS为输出
  TGSE_PTGSE6=1;
  
  SET_CS;         //片选失能
  CLR_SCLK;
}
回复 支持 反对

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
 楼主| 发表于 2015-6-24 20:03:23 | 显示全部楼层
回复【14楼】gtf:
---------------------------------
你确定你控制的SPI从设备空闲时CLK线是低电平?
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2016-12-19
在线时间
14 小时
发表于 2020-5-18 17:56:47 | 显示全部楼层
楼主,如过你这个代码可以,我就用你的 代码了,嘎嘎
回复 支持 反对

使用道具 举报

33

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-7-8
在线时间
177 小时
发表于 2020-6-13 14:29:05 | 显示全部楼层
楼主,能麻烦你一件事吗,我有一个模拟SPI的问题,由于我是第一次模拟,通讯目标是存储芯片W25Q16
帖子是:http://www.openedv.com/forum.php ... d=312492&extra=
不好意思,打扰你一点时间,谢谢了
回复 支持 反对

使用道具 举报

33

主题

114

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-7-8
在线时间
177 小时
发表于 2020-6-13 15:14:14 | 显示全部楼层
抱歉,问题我自己解决了,我选用来模拟的引脚,不知道是哪里有问题,我换一个引脚就正常了,谢谢你了
回复 支持 反对

使用道具 举报

1

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-2-27
在线时间
23 小时
发表于 2020-10-9 10:17:24 | 显示全部楼层
占楼学习
回复 支持 反对

使用道具 举报

1

主题

25

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1784
金钱
1784
注册时间
2019-8-4
在线时间
277 小时
发表于 2022-2-9 17:25:41 | 显示全部楼层
正点原子 发表于 2013-11-17 11:55
回复【5楼】Badu_Space:
---------------------------------
没问题啊

原子哥,我模拟的SPI是这样写的,你看看那个地方有问题呀,我现在是使用模拟spi驱动w25q16,读取芯片id,读出来的ID应该是0xEF14(十进制61204),但是我实际读出来的是61680,不知道那个地方没有处理好。。。。。
static uint8 spi_readwrite0209(uint8 send_data)
{
  uint8 i;
  uint8 rcv;
  
  for(i=0;i<8;i++)
  {
    if(send_data & 0x80)
    {
      W25QXX_MOSI_HIGN();
    }
    else
    {
      W25QXX_MOSI_LOW();
    }
   
    send_data <<=1;
    rcv<<=1;
   
    W25QXX_SCK_HIGN();
    W25QXX_SCK_LOW();
   
    if(W25QXX_MISO_PORT_BIT)
    {
      rcv |= W25QXX_MISO_PORT_BIT;
    }
  }
  W25QXX_SCK_LOW();
  return rcv;
}


回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-20 13:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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