打印
[技术问题解答]

帮忙看看程序那里有问题,可能跟总线时钟有关(已解决)

[复制链接]
1592|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cl234583745|  楼主 | 2014-4-23 11:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 FSL_TICS_A 于 2014-5-5 11:37 编辑

下面这个程序就是一个模拟spi过程来读芯片max6675.开始总线时钟8m的,就总报错,后来我总线改24m了,就一切正常了,这是为什么呢?

uint R_MAX6675(uchar abc)//
{
  uchar i,TongDao;
  uint wd_data;
  
  MAX_SCK=0;DelayNS(10);
  TongDao=abc;
  if(TongDao==1)
  {
      MAX_CS1=0;
      MAX_CS2=1;
      MAX_CS3=1;
      MAX_CS4=1;
  }
  else if(TongDao==2)
  {
      MAX_CS1=1;
      MAX_CS2=0;
      MAX_CS3=1;
      MAX_CS4=1;
  }
  else if(TongDao==3)
  {
      MAX_CS1=1;
      MAX_CS2=1;
      MAX_CS3=0;
      MAX_CS4=1;
  }
  else if(TongDao==4)
  {
      MAX_CS1=1;
      MAX_CS2=1;
      MAX_CS3=1;
      MAX_CS4=0;
  }
  else      
  {
      MAX_CS1=1;
      MAX_CS2=1;
      MAX_CS3=1;
      MAX_CS4=1;
  }
  DelayNS(10);
  
  
  //15
  MAX_SCK=1;DelayNS(10);
  MAX_SCK=0;DelayNS(10);

  wd_data=0;
  //14~3    0-4095  0-1023.75c 温度值=1023.75*转换后的数字量/4095
  for(i=0;i<12;i++)
  {
    MAX_SCK=1;DelayNS(10);
   
    wd_data = wd_data << 1;
    if(MAX_SO==1) wd_data++;
     
    MAX_SCK=0;DelayNS(10);
  }
  
  //2
  MAX_SCK=1;DelayNS(10);
  MAX_SCK=0;DelayNS(10);  
  //1
  MAX_SCK=1;DelayNS(10);
  MAX_SCK=0;DelayNS(10);  
  //0
  MAX_SCK=1;DelayNS(10);
  MAX_SCK=0;DelayNS(10);
      
  MAX_CS1=1;
  MAX_CS2=1;
  MAX_CS3=1;
  MAX_CS4=1;
  DelayNS(10000);
  return wd_data;
}

相关帖子

沙发
FSL_TICS_ZJJ| | 2014-4-23 13:45 | 只看该作者
楼主你好,你说的报错是什么报错? 通信出错吗?
我觉得你可以抓出你的波形,对比下你max6675datasheet对应的通信波形时间要求看看。

使用特权

评论回复
板凳
cl234583745|  楼主 | 2014-4-23 16:02 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-23 13:45
楼主你好,你说的报错是什么报错? 通信出错吗?
我觉得你可以抓出你的波形,对比下你max6675datasheet对应 ...

第一次还能运行,第二个循环开始, 程序运行到MAX_SCK=1;DelayNS(10);或者MAX_CS4=1;错误提示大概是不能设置硬件引脚  然后单片机就重启了。可能跟中断有关系吧。但总线时钟由8m变成24m就好使了。这个度max6675的函数是没有问题的。

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2014-4-23 16:08 | 只看该作者
cl234583745 发表于 2014-4-23 16:02
第一次还能运行,第二个循环开始, 程序运行到MAX_SCK=1;DelayNS(10);或者MAX_CS4=1;错误提示大概是不能 ...

那你使能看门狗了吗?
是不是看门狗时间长没喂狗复位的?

使用特权

评论回复
5
cl234583745|  楼主 | 2014-4-23 16:10 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-23 16:08
那你使能看门狗了吗?
是不是看门狗时间长没喂狗复位的?

SOPT1 = 0xc0;  //看门狗
  SOPT2 = 0x00;



__RESET_WATCHDOG(); /* feeds the dog */

使用特权

评论回复
6
FSL_TICS_ZJJ| | 2014-4-23 16:30 | 只看该作者
cl234583745 发表于 2014-4-23 16:10
SOPT1 = 0xc0;  //看门狗
  SOPT2 = 0x00;

你禁止看门狗试试,会不会出现错误了。

使用特权

评论回复
7
cl234583745|  楼主 | 2014-4-23 16:45 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-23 16:30
你禁止看门狗试试,会不会出现错误了。

不用看门狗就不出错了。怎么回事呢?

使用特权

评论回复
8
FSL_TICS_ZJJ| | 2014-4-23 16:54 | 只看该作者
cl234583745 发表于 2014-4-23 16:45
不用看门狗就不出错了。怎么回事呢?

因为你是看门狗时间长没喂狗复位了。
如果你频率低,那么你操作的时间肯定长,对不对,然后时间长没有喂狗,就导致复位,也就是被狗咬了。
如果你频率调高了,那么你操作时间也短了,这个时候回去喂狗正好还没到复位的时间,所以不会看门狗复位。
你可以将看门狗时间设长点,这个要保证你能及时喂狗。
或者你喂狗勤快点。

使用特权

评论回复
9
cl234583745|  楼主 | 2014-4-24 11:57 | 只看该作者
FSL_TICS_ZJJ 发表于 2014-4-23 16:54
因为你是看门狗时间长没喂狗复位了。
如果你频率低,那么你操作的时间肯定长,对不对,然后时间长没有喂 ...

看门时间太长也不好,总喂也不好,还是处理快点好。
但哪个函数原来就没有问题,也可能是我主循环里面加了很多别的导致的吧

使用特权

评论回复
10
FSL_TICS_ZJJ| | 2014-4-24 12:42 | 只看该作者
cl234583745 发表于 2014-4-24 11:57
看门时间太长也不好,总喂也不好,还是处理快点好。
但哪个函数原来就没有问题,也可能是我主循环里面加了 ...

加多了,你肯定要考虑喂狗时间的。

使用特权

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

本版积分规则

99

主题

644

帖子

1

粉丝