你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
any_014 提问时间:2016-3-19 16:19 /
悬赏5ST金币已解决
本帖最后由 any_014 于 2016-3-19 16:34 编辑

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数据寄存器值。中间的间隔,无论我修改数大小,都没有明显变化。
scope_0.png




最佳答案

查看完整内容

unsigned long i;///应该 unsigned long i = 0; i 需要初始化
收藏 评论9 发布时间:2016-3-19 16:19

举报

9个回答
snowsunset-3964 最优答案 回答时间:2016-3-20 16:28:56
unsigned long i;///应该 unsigned long i = 0; i 需要初始化
power568 最优答案 回答时间:2016-3-21 15:11:38
unsigned long AD7193_SingleConversion(void)
{
    unsigned long command = 0x0;
    unsigned long regData = 0x0;
        unsigned long i;

你的i是局部变量,即使有全部变量同名,也被局部变量屏蔽了...
snowsunset-3964 回答时间:2016-3-19 16:19:21
unsigned long i;///应该 unsigned long i = 0; i 需要初始化
any_014 回答时间:2016-3-21 08:57:29
snowsunset-3964 发表于 2016-3-20 16:29
unsigned long i;///应该 unsigned long i = 0; i 需要初始化

谢谢回复。
c语言默认变量初始化为0吧?
而且,在循环里还有个i = 0;
any_014 回答时间:2016-3-21 09:55:47
snowsunset-3964 发表于 2016-3-20 16:28
unsigned long i;///应该 unsigned long i = 0; i 需要初始化

试了下,确实有效。
但是,不明白啊。
即使i没有初始化,只是影响第一次循环吧?
power568 回答时间:2016-3-21 12:49:32
如果初始化不成功,每次调用该函数都会有影响...
any_014 回答时间:2016-3-21 14:11:03
power568 发表于 2016-3-21 12:49
如果初始化不成功,每次调用该函数都会有影响...

明白了,忘了i是个局部变量了。
之前可能每次调用该函数时初始化为一个比较大的数,所以延时很快就结束了。
zcl201207 回答时间:2016-3-21 21:27:16
65413.546586545 回答时间:2016-3-22 14:39:42
同意8楼的说法,全局变量在局部变量引用时会被局部变量覆盖。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版