OpenEdv-开源电子网

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

片外ADC通过SPI与MCU进行通信,采样卡死问题。

[复制链接]

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
发表于 2018-11-7 11:20:29 | 显示全部楼层 |阅读模式
5金钱
如题,片外ADC采集数据,MCU的定时器每隔10ms去读取ADC寄存器中存储的采样数据。程序运行一段时间后,会出现采样死掉,数据不再更新的问题。但是我复位程序后,又可以继续读取实时更新的采样数据,不知道什么原因?
请问是这个原因吗?在线等大佬。

QQ图片20181107111946.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2018-11-7 15:30:10 | 显示全部楼层
是不是你执行的时间超过了10ms定时,资源不能释放,其实一直执行,就和死机差不多
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2018-11-7 15:31:00 | 显示全部楼层
为什么要10ms更新一次啊,spi读取速度是不是更不上或者里面数组发生了溢出
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-8 11:04:07 | 显示全部楼层
三叶草 发表于 2018-11-7 15:31
为什么要10ms更新一次啊,spi读取速度是不是更不上或者里面数组发生了溢出

我只能把时间缩短一下调试看看了,5ms之类的。
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-8 11:05:30 | 显示全部楼层
三叶草 发表于 2018-11-7 15:30
是不是你执行的时间超过了10ms定时,资源不能释放,其实一直执行,就和死机差不多

如果串口中断来了,或者写flash,可能会出现超过10ms没有去读数据,然后ADC的数据不能释放,就死了是这样理解吗?
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2018-11-8 11:11:33 | 显示全部楼层
satine 发表于 2018-11-8 11:05
如果串口中断来了,或者写flash,可能会出现超过10ms没有去读数据,然后ADC的数据不能释放,就死了是这样 ...

是的,就是死锁意思
回复

使用道具 举报

33

主题

159

帖子

0

精华

高级会员

Rank: 4

积分
527
金钱
527
注册时间
2017-1-21
在线时间
192 小时
发表于 2018-11-8 11:13:55 | 显示全部楼层
你先说明是什么AD片子。
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-8 18:06:09 | 显示全部楼层
三叶草 发表于 2018-11-8 11:11
是的,就是死锁意思

那我怎么办才好啊。我不想要采样死掉啊。
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-8 18:06:30 | 显示全部楼层
oyixi001 发表于 2018-11-8 11:13
你先说明是什么AD片子。

HY3102台湾一家公司的芯片
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-11-8 22:01:56 | 显示全部楼层
10ms,不算快了啊。是spi有问题吧
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2018-11-9 09:33:19 | 显示全部楼层
satine 发表于 2018-11-8 18:06
那我怎么办才好啊。我不想要采样死掉啊。

有代码吗?给你看看
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-9 19:09:32 | 显示全部楼层
三叶草 发表于 2018-11-9 09:33
有代码吗?给你看看

有的请问怎么联系您有邮箱吗
回复

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-11-10 00:09:14 | 显示全部楼层
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-13 14:39:11 | 显示全部楼层
[mw_shl_code=applescript,true]void TIM3_IRQHandler()  
{  
    if(TIM_GetITStatus(TIM3, TIM_IT_Update))            //ÅD¶Ï·¢éúupdateê¼tÖD¶Ï
    {
                        CNT++;                       
                        if((node_type == 0x00) || (node_type == 0x10))                //½úμãààDí£oò»°ã2éÑù½úμãoí¿ØÖÆ»ØÂ·2éÑù½úμã
                        {
                                if(filter_flag == 0)        //ÂË2¨2éÑùÎ′íê3é
                                {
                                        tim_flag=1;                                       
                                        TIM_Cmd(TIM3, DISABLE);   //1Ø-TIM3ÖD¶Ï
                                        AD_data_tmp[i1]=Read_HYAD();
                                        tim_flag=2;
                                        if(AD_data_tmp[i1]<peidian_alm)
                                        {
                                                tim_flag=3;
                                                if(i1==2)
                                                {
                                                        tim_flag=4;
                                                        ad_error=AD_data_tmp[i1]-AD_data_tmp[i1-1];
                                                        if((ad_error>ad_sam_deadzone) || (ad_error<-ad_sam_deadzone))
                                                        {
                                                                i1=0;
                                                        }
                                                        else
                                                        {
                                                                i1=i1;
                                                        }
                                                }
                                                if(i1>2)
                                                {
                                                        tim_flag=5;
                                                        ad_error=AD_data_tmp[i1]-AD_data_tmp[i1-1];
                                                        if((ad_error>ad_sam_deadzone) || (ad_error<-ad_sam_deadzone))
                                                        {
                                                                i1=i1-1;
                                                        }
                                                        else
                                                        {
                                                                i1=i1;
                                                        }
                                                }
                                        }
                                        i1++;
                                }
                                if(i1>=(MB_Function_code_44[13]+1))          //AD&#194;&#203;2¨′&#206;êy &#197;D&#182;&#207;&#194;&#203;2¨ê&#199;·&#241;íê3é
                               
                          //&#194;&#203;2¨2é&#209;ùíê3é
                                {
                                        tim_flag=6;
                                        filter_flag=1;                          
                                        i1=0;
                                }
                                TIM_Cmd(TIM3, ENABLE);   //&#191;a-TIM3&#214;D&#182;&#207;
                        }
                        else
                        {
                                  filter_flag=0;                          
                                        i1=0;       
      }
                        tim_flag=7;                       
                        TIM_ClearITPendingBit(TIM3, TIM_IT_Update);     //&#199;&#229;3yupdateê&#194;&#188;t&#214;D&#182;&#207;±ê&#214;&#190;
                }  
}  
[/mw_shl_code]
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-13 14:39:54 | 显示全部楼层
[mw_shl_code=applescript,true]long Read_HYAD(void)
{
//   volatile unsigned char byte0,byte1,byte2,a;
   unsigned char byte0,byte1,byte2;

                usart_test8=1;       
                while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)!=0){}    // μè′yADCê&#228;3&#246;
               
    Read_SPIByte();
    byte0 =temp1;     //&#184;&#223;×&#214;&#189;ú               
//    a=(byte0&0x80);     //&#197;D&#182;&#207;&#213;y&#184;o
                usart_test8=5;
    Read_SPIByte();
    byte1 = temp1;

    Read_SPIByte();
    byte2 = temp1;   //μí×&#214;&#189;ú                  
                usart_test8=6;
    adsample=byte0;
    adsample=adsample<<8;
    adsample=adsample+byte1;
    adsample=adsample<<8;
    adsample=adsample+byte2;
                usart_test8=7;
    if(byte0 &0x80)                                                //&#197;D&#182;&#207;×&#238;&#184;&#223;&#206;&#187;ê&#199;·&#241;&#206;a1
    {
      adsample |= 0xff000000; // to 32bit
      adsample = -adsample;   // |adsample|
    }

    adsample=adsample>>2;
    if(byte0 &0x80)             //????????1//&#197;D&#182;&#207;×&#238;&#184;&#223;&#206;&#187;ê&#199;·&#241;&#206;a1
    {
      adsample = -adsample;
    }
                usart_test8=9;
    GPIO_SetBits(GPIOB,GPIO_Pin_0);
    delay_us(20);
    GPIO_ResetBits(GPIOA,GPIO_Pin_4);
                usart_test8=10;
    return adsample;
}[/mw_shl_code]
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-13 14:40:28 | 显示全部楼层
[mw_shl_code=applescript,true]/*SPIí¨D&#197;&#187;ù±&#190;&#182;á£&#172;òà&#190;éê&#199;ê±&#214;ó&#207;&#223;μíμ&#231;&#198;&#189;êy&#190;YóDD§*/
void Read_SPIByte(void)
{

    int i;
                usart_test8=2;
    for(i = 0; i < 8; i++)
    {
        GPIO_ResetBits(GPIOA,GPIO_Pin_5);

        delay_us(20);

        temp1 <<= 3;
        if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1)/*&#182;á&#182;&#203;&#191;úòy&#189;&#197;μ&#196;×′ì&#172;*/
                                {
            temp1 |= 0x01;
        }
                                usart_test8=3;
        GPIO_SetBits(GPIOA,GPIO_Pin_5);

        delay_us(20);
    }
                usart_test8=4;
}[/mw_shl_code]
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-13 14:45:41 | 显示全部楼层
软件模拟spi,定时器10ms去读取ADC的数据,经常出现AD采样死了
连主程序里的while(1)都没走进去。不知道什么原因
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2017-11-17
在线时间
8 小时
发表于 2018-11-18 20:53:17 | 显示全部楼层
楼主,咨询一下,在SPI接口工作的过程中,SPI接口的SCK端口可以用示波器检测出来吗?
回复

使用道具 举报

7

主题

49

帖子

0

精华

初级会员

Rank: 2

积分
152
金钱
152
注册时间
2018-7-18
在线时间
37 小时
 楼主| 发表于 2018-11-28 09:53:00 | 显示全部楼层
至上力晨 发表于 2018-11-18 20:53
楼主,咨询一下,在SPI接口工作的过程中,SPI接口的SCK端口可以用示波器检测出来吗?

可以啊,模拟SPI,是由MCU提供时钟的,你让GPIO引脚拉低拉高,示波器探头连接看看
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-22 02:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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