打印

改变一下函数位置,但逻辑顺序没变,程序就4循环了

[复制链接]
1338|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qQ191727779|  楼主 | 2012-10-7 22:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
某段程序改变一下函数位置,但逻辑顺序没变,程序就4循环了,(个人觉得是时序改变了),求解ing,是与计算机执行指令有关??程序结构大致如下
……、
……
main()
{
IICINT();
IICREAD();
}

改成把IICINT();放在IICREAD()里面,其他都没变,
IICREAD()
{
IICINT();
}
main()
{
IICREAD();
}

相关帖子

沙发
NE5532| | 2012-10-8 09:13 | 只看该作者
检查有几个地方用了Read函数,是不是每个地方都需要init,另外把init放在Read里面本来就是没有道理的事情,何必去伤脑筋??

使用特权

评论回复
板凳
qQ191727779|  楼主 | 2012-10-8 12:11 | 只看该作者
主函数只有一个IICread()函数,但是循环执行256次,每次执行完后,需要再配置,所以才把IICint()放在IICread()里面 2# NE5532

使用特权

评论回复
地板
NE5532| | 2012-10-8 19:06 | 只看该作者
在你的程序里面没有看出来256次循环在哪里,如果确实里面外面有问题,需要考虑时间上的问题,典型的,I2C Stop和Start之间的时间间隔。

使用特权

评论回复
5
qQ191727779|  楼主 | 2012-10-9 11:29 | 只看该作者
就是做iic的读写,请问你说的stop倒start的时间间隔,是在哪里看的???2440中的iic没有提到,看iic协议的说明书?? 4# NE5532

使用特权

评论回复
6
NE5532| | 2012-10-9 12:07 | 只看该作者
2404里有,你没仔细看来着,协议里面也有。

使用特权

评论回复
7
qQ191727779|  楼主 | 2012-10-9 18:55 | 只看该作者
呃,我看了很多次,我想,应该是这里吧-》  在读的编程流程图中,有个处理框"wait until the stop condition takes effect",在前面的步骤中,有个处理“WRITE 0X90(M/R STOP) TO IICSTAT”,可是,单步调试时发现IICSTAT并没有写入0x90,全速跑时,有时就是死在等待不到stop 这个信号    6# NE5532

使用特权

评论回复
8
NE5532| | 2012-10-9 20:19 | 只看该作者
我不知道你用的是硬I2C还是软件模拟的,但是无论哪种,主机侧的STOP信号都不会出现“等不到”的情况,除非是有从机抑制时序的时候,从机拉住CLK没放,你测下呢。

使用特权

评论回复
9
qQ191727779|  楼主 | 2012-10-9 22:04 | 只看该作者
本帖最后由 qQ191727779 于 2012-10-9 22:06 编辑

是不是从机抑制我就不知道了,但是,查看寄存器是有scl被拉低,就是想不明白,在等待stop之前,我按照流程图,先IICSTAT=0x90,再IICCON=0X60 //不产生ack,并且恢复iic操作,检测到没有ack信号,却没有stop信号

void IICRead(unsigned int i ) //current address read
{
  IICInit();
  rIICDS = 0xA1;
  rIICSTAT = 0xB0;
  while( rIICSTAT & 0x1 );  //wait ACK

  ClearInt(); //clear SRCPND , INTPND
  buf = rIICDS;  //全速跑读到A1
  Uart_Printf("buf[");
  Uart_Printf("%d",i);
  Uart_Printf("]: %X\n",buf);
  rIICCON = 0xE0; //resume iic,generate ACK
  while( rIICSTAT & 0x1 );  //wait ACK
  buf = rIICDS;  //全速跑读到43
  Uart_Printf("buf[");  
  Uart_Printf("%d",i);
  Uart_Printf("]: %X\n",buf);
  ClearInt();
  rIICSTAT = 0x90;
  rIICCON = 0x60;     //resume iic, no ACK
  while( ! (rIICSTAT & 0x1 ) );  //wait NO-ACK
    buf = rIICDS;  //全速跑读到 数据6
  Uart_Printf("buf[");
  Uart_Printf("%d",i);
  Uart_Printf("]: %X\n",buf);
  while( (rIICSTAT >> 5) & 1); //wait stop,就死在这里!!!
  IICRest();
}


8# NE5532

使用特权

评论回复
10
Tinnal| | 2012-10-11 10:42 | 只看该作者
如果IICInit()里头有IICRead调用,那第一个程序没有问题,第二个程序就递归调用而陷入4循环!:)

使用特权

评论回复
11
qQ191727779|  楼主 | 2012-10-12 23:19 | 只看该作者
肯定没有啊,大致解决了,很大可能是延时问题,因为自己写的程序比2410的逻辑程序快几秒(就是读数据),个人猜想是iic与E2PROM传输之间实际上需要有延时,尽管芯片说明书只是提到写数据时要延时…… 10# Tinnal

使用特权

评论回复
12
NE5532| | 2012-10-13 17:25 | 只看该作者
肯定没有啊,大致解决了,很大可能是延时问题,因为自己写的程序比2410的逻辑程序快几秒(就是读数据),个人猜想是iic与E2PROM传输之间实际上需要有延时,尽管芯片说明书只是提到写数据时要延时…… 10# Tinnal  ...
qQ191727779 发表于 2012-10-12 23:19


那是当然要延时,至少要等到电源稳定,一般来说上电没这么抓急吧。

使用特权

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

本版积分规则

4

主题

49

帖子

0

粉丝