[STM32] 请大家看下这个超时判断函数有什么问题?

[复制链接]
1893|8
 楼主| any012 发表于 2016-3-19 16:36 | 显示全部楼层 |阅读模式
本帖最后由 any012 于 2016-3-19 16:38 编辑

stm32通过spi和ad7193芯片通讯。
主循环里每1秒读取一次ad7193的数据并通过串口发送出来。

和ad7193通讯是这样的:通过spi发送单次转换命令,ad7193接收命令后开始数据转换,转换接收后,将spi_miso引脚拉低,表示转换结束可以读取。然后stm32再通过spi读ad7193数据寄存器。

现在,发送转换命令后,尝试一直等待SPI_MISO管脚为电平,结果程序好像停在了那里。
于是,想加个超时判断,发送转换命令后,如果SPI_MISO管脚为高电平,i++,如果i>60000,则跳出循环执行后面的语句。
发现,我将i>60000,这个数,设大点或设小点,示波器波形看起来都一样,如果特别大,则,好像又停在那里不动了。

  1. unsigned long AD7193_SingleConversion(void)
  2. {
  3.     unsigned long command = 0x0;
  4.     unsigned long regData = 0x0;
  5.         unsigned long i;

  6.     command = AD7193_MODE_SEL(AD7193_MODE_SINGLE) |
  7.               AD7193_MODE_CLKSRC(AD7193_CLK_INT) |
  8.               AD7193_MODE_RATE(0x30);
  9.     PMOD1_CS_LOW;
  10.     AD7193_SetRegisterValue(AD7193_REG_MODE, command, 3, 0);
  11.         
  12. #define SPI3_MISO()  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4)
  13.         while(SPI3_MISO() != 0)
  14.         {
  15.                 i++;
  16.                 if(i > 10000000)
  17.                 {
  18.                         i = 0;
  19.                         break;
  20.                 }
  21.         };
  22.         
  23. regData = AD7193_GetRegisterValue(AD7193_REG_DATA, 3, 0);
  24.     PMOD1_CS_HIGH;
  25.         
  26.     return regData;
  27. }


绿色为sclk波形,黄色为miso波形, sclk可看到是分成了两部分,第一部分为发送单次转换命令,第二部分为读取ad7193数据寄存器值。中间的间隔,无论我修改数大小,都没有明显变化。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
高个 发表于 2016-3-20 22:33 来自手机 | 显示全部楼层
i没赋初始值吧?另外10000000是不是太大了

评分

参与人数 1威望 +3 收起 理由
any012 + 3 赞一个!

查看全部评分

xyz549040622 发表于 2016-3-19 19:11 | 显示全部楼层
是因为你的break语句,跳不出while循环,只能跳出里面的if循环吧。
dwq175 发表于 2016-3-19 21:55 | 显示全部楼层
硬件SPI的SPI_MISO是由硬件控制的。
最好使用单独的输入口做检测。
善水盈渊 发表于 2016-3-20 20:34 | 显示全部楼层
xyz549040622 发表于 2016-3-19 19:11
是因为你的break语句,跳不出while循环,只能跳出里面的if循环吧。

if 不是循环啊,break跳出的就是while循环吧

评分

参与人数 1威望 +2 收起 理由
any012 + 2

查看全部评分

 楼主| any012 发表于 2016-3-21 11:17 | 显示全部楼层
dwq175 发表于 2016-3-19 21:55
硬件SPI的SPI_MISO是由硬件控制的。
最好使用单独的输入口做检测。

这个是由芯片特性决定的。
芯片接受转换指令后开始转换,需要一定时间,转换过程中miso电平被该芯片拉高,直到转换接收后被拉低。
 楼主| any012 发表于 2016-3-21 11:26 | 显示全部楼层
高个 发表于 2016-3-20 22:33
i没赋初始值吧?另外10000000是不是太大了

赋初值后可以了,但不明白原因。
i定义为unsigned long类型,应该足够了。
当时是感觉这个延时没起作用,所以就往大了设。
现在可以了,设个几百上千即可。
高个 发表于 2016-3-21 11:44 来自手机 | 显示全部楼层
any012 发表于 2016-3-21 11:26
赋初值后可以了,但不明白原因。
i定义为unsigned long类型,应该足够了。
当时是感觉这个延时没起作用, ...

没赋初始值,i是个随机数,可能比10000000大。直接就从while出去了,你可以加个打印程序,看看不赋初始值i是多少。

评分

参与人数 1威望 +3 收起 理由
any012 + 3 很给力!

查看全部评分

 楼主| any012 发表于 2016-3-21 14:11 | 显示全部楼层
高个 发表于 2016-3-21 11:44
没赋初始值,i是个随机数,可能比10000000大。直接就从while出去了,你可以加个打印程序,看看不赋初始值 ...

明白了,i是个局部变量,每次调用都要初始化,可能每次都初始化为一个较大的数,所以延时很快就结束了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部