luoengineer 发表于 2020-6-29 14:52

arm7单片机移植ucos后i2c地址搜索拖死主机

本帖最后由 luoengineer 于 2020-6-30 17:30 编辑

arm 7核的aduc7026成功移植了ucos-ii,做了一个从i2c中断程序,与2112 通信100k速率正常。但是如果2112主机用i2c地址搜索功能,35k速率没有问题,可以找到7026的从机地址,但是大于35k后,就会把主机的sda 拖低,2112只好reset。
郁闷,移植后其他功能都ok,跑了24小时也没问题,但就是i2c地址搜索这个尾巴。
求解释。

luoengineer 发表于 2020-7-3 08:46

昨日突破了,将I2C改成FIQ后,I2C搜索达到70K bus不会挂掉了

luoengineer 发表于 2020-7-3 10:04

今日再次突破,速率96k i2c 搜索 ok,秘诀:F标志始终不能置1

luoengineer 发表于 2020-7-8 09:55

fiq里面加OSMboxPost,数据没能发到任务,奇怪,请大神指导一下呢

luoengineer 发表于 2020-7-8 10:05

这是OSMboxPost的代码片段, 里面有一个任务调度,这样的话岂不是在中断代码里面就会打断?

OS_ENTER_CRITICAL();
    if (pevent->OSEventGrp != 0) {                  /* See if any task pending on mailbox            */
                                                      /* Ready HPT waiting on event                  */
      (void)OS_EventTaskRdy(pevent, pmsg, OS_STAT_MBOX, OS_STAT_PEND_OK);
      OS_EXIT_CRITICAL();
      OS_Sched();                                 /* Find highest priority task ready to run       */
      return (OS_ERR_NONE);
    }

luoengineer 发表于 2020-7-21 15:33

消息队列LetterQeue如下使用,有没有问题呢?

OS_EVENT*LetterQeue;
#define Letter_Size         32
void * LetterQeueTb;

LetterQeue = OSQCreate(&LetterQeueTb, Letter_Size);

staticvoidAppTaskOne      (void*p_arg)
{
      INT32U msg;
      INT8U err;
      (void)p_arg;        
       
      while (DEF_TRUE)
        {
                msg = (INT32U)OSQPend(LetterQeue, 0, &err);
                switch (msg & 0xFF)
                {
                  ....
               }
      }
}

Fiq:
OSQPost(LetterQeue, (void *)(byIndex));


luoengineer 发表于 2020-7-23 14:46


说好的不使用SVC 管理模式,确发现使用了,求大神解释一下呢



#defineARM_MODE_ARM         0x00000000
#defineARM_MODE_THUMB         0x00000020

#defineARM_SVC_MODE_THUMB    (0x00000013L + ARM_MODE_THUMB)
#defineARM_SVC_MODE_ARM      (0x00000013L + ARM_MODE_ARM)

页: [1]
查看完整版本: arm7单片机移植ucos后i2c地址搜索拖死主机