打印
[STM32]

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

[复制链接]
1580|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,这个数,设大点或设小点,示波器波形看起来都一样,如果特别大,则,好像又停在那里不动了。

unsigned long AD7193_SingleConversion(void)
{
    unsigned long command = 0x0;
    unsigned long regData = 0x0;
        unsigned long i;

    command = AD7193_MODE_SEL(AD7193_MODE_SINGLE) |
              AD7193_MODE_CLKSRC(AD7193_CLK_INT) |
              AD7193_MODE_RATE(0x30);
    PMOD1_CS_LOW;
    AD7193_SetRegisterValue(AD7193_REG_MODE, command, 3, 0);
        
#define SPI3_MISO()  GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4)
        while(SPI3_MISO() != 0)
        {
                i++;
                if(i > 10000000)
                {
                        i = 0;
                        break;
                }
        };
        
regData = AD7193_GetRegisterValue(AD7193_REG_DATA, 3, 0);
    PMOD1_CS_HIGH;
        
    return regData;
}


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





相关帖子

来自 2楼
高个| | 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是由硬件控制的。
最好使用单独的输入口做检测。

使用特权

评论回复
5
善水盈渊| | 2016-3-20 20:34 | 只看该作者
xyz549040622 发表于 2016-3-19 19:11
是因为你的break语句,跳不出while循环,只能跳出里面的if循环吧。

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

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
any012 + 2
6
any012|  楼主 | 2016-3-21 11:17 | 只看该作者
dwq175 发表于 2016-3-19 21:55
硬件SPI的SPI_MISO是由硬件控制的。
最好使用单独的输入口做检测。

这个是由芯片特性决定的。
芯片接受转换指令后开始转换,需要一定时间,转换过程中miso电平被该芯片拉高,直到转换接收后被拉低。

使用特权

评论回复
7
any012|  楼主 | 2016-3-21 11:26 | 只看该作者
高个 发表于 2016-3-20 22:33
i没赋初始值吧?另外10000000是不是太大了

赋初值后可以了,但不明白原因。
i定义为unsigned long类型,应该足够了。
当时是感觉这个延时没起作用,所以就往大了设。
现在可以了,设个几百上千即可。

使用特权

评论回复
8
高个| | 2016-3-21 11:44 | 只看该作者
any012 发表于 2016-3-21 11:26
赋初值后可以了,但不明白原因。
i定义为unsigned long类型,应该足够了。
当时是感觉这个延时没起作用, ...

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

使用特权

评论回复
评分
参与人数 1威望 +3 收起 理由
any012 + 3 很给力!
9
any012|  楼主 | 2016-3-21 14:11 | 只看该作者
高个 发表于 2016-3-21 11:44
没赋初始值,i是个随机数,可能比10000000大。直接就从while出去了,你可以加个打印程序,看看不赋初始值 ...

明白了,i是个局部变量,每次调用都要初始化,可能每次都初始化为一个较大的数,所以延时很快就结束了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

35

主题

232

帖子

6

粉丝