查看: 7084|回复: 10

[其他] 關於I2C副程式API I2C_DRV_MasterSendDataBlocking

[复制链接]

该用户从未签到

4

主题

19

帖子

0

注册会员

Rank: 2

积分
90
最后登录
2015-4-30
发表于 2015-1-29 15:07:43 | 显示全部楼层 |阅读模式
本帖最后由 good852 于 2015-1-29 17:45 编辑

FRDM K64 使用I2C_DRV_MasterSendDataBlocking API 發覺會被卡住,然後我一直追蹤到底層 I2C_DRV_MasterWait,會卡在do while裡的 OSA_SemaWait,是有什麼東西要開啟嗎?
i2c_status_t I2C_DRV_MasterSendDataBlocking
(uint32_t instance,

const i2c_device_t * device,

const uint8_t * cmdBuff,

uint32_t cmdSize,

const uint8_t * txBuff,

uint32_t txSize,

uint32_t timeout_ms
)



static i2c_status_t I2C_DRV_MasterWait(uint32_t instance, uint32_t timeout_ms)
{
    assert(instance < HW_I2C_INSTANCE_COUNT);

    /* Get current runtime structure. */
    i2c_master_state_t * master = (i2c_master_state_t *)g_i2cStatePtr[instance];

    osa_status_t syncStatus;

    do
    {
        syncStatus = OSA_SemaWait(&master->irqSync, timeout_ms);
    }while(syncStatus == kStatus_OSA_Idle);

    if (syncStatus != kStatus_OSA_Success)
    {
        master->status = kStatus_I2C_Timeout;
    }

    return master->status;
}

看到國外論壇也有一樣的問題,只是不知道怎解http://community.freescale.com/thread/334038

我知道答案 目前已有10人回答
回复

使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-1-29 16:26:45 | 显示全部楼层
    楼主用的是SDK吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    90
    最后登录
    2015-4-30
     楼主| 发表于 2015-1-29 16:40:07 | 显示全部楼层
    安 发表于 2015-1-29 16:26
    楼主用的是SDK吗?

    是的.....
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    难过
    2021-12-15 16:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-1-29 16:51:36 | 显示全部楼层
    OSA_Init();
    这个调用了没有?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    90
    最后登录
    2015-4-30
     楼主| 发表于 2015-1-29 16:55:54 | 显示全部楼层
    本帖最后由 good852 于 2015-1-29 16:58 编辑
    安 发表于 2015-1-29 16:51
    OSA_Init();
    这个调用了没有?

    用了.....
    也用了   OSA_Start();

    MQX_KSDK_1.0.0 我是用官網下載的這個有差嗎?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-1-30 09:45:45 | 显示全部楼层
    告诉我,代码来自哪个具体例程,我这边复现一下问题?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    90
    最后登录
    2015-4-30
     楼主| 发表于 2015-1-30 13:32:05 | 显示全部楼层
    本帖最后由 good852 于 2015-1-30 13:35 编辑
    FSL_TICS_ZP 发表于 2015-1-30 09:45
    告诉我,代码来自哪个具体例程,我这边复现一下问题?

    我是使用Hello world裡添加 I2C_1控制

    使用KSDK_1.1.0 Library

    hello_frdmk64f/ksdk_Files/pin_mux.c修改
    void configure_i2c_pins(uint32_t instance)
    {
      switch(instance) {   
    //----------------------------------------------------------------------------------------------------------------------I2C
      case HW_I2C0:                       /* I2C0 */
          /* Affects PORTE_PCR24 register */
          PORT_HAL_SetMuxMode(PORTE_BASE,24u,kPortMuxAlt5);
          PORT_HAL_SetOpenDrainCmd(PORTE_BASE,24u,true);
          /* Affects PORTE_PCR25 register */
          PORT_HAL_SetMuxMode(PORTE_BASE,25u,kPortMuxAlt5);
          PORT_HAL_SetOpenDrainCmd(PORTE_BASE,25u,true);
          break;
        case HW_I2C1:                       /* I2C1 */
          /* Affects PORTC_PCR10 register */
          PORT_HAL_SetMuxMode(PORTC_BASE,10u,kPortMuxAlt2);
    //      PORT_HAL_SetOpenDrainCmd(PORTC_BASE,10u,true);<=拿掉
          /* Affects PORTC_PCR11 register */
          PORT_HAL_SetMuxMode(PORTC_BASE,11u,kPortMuxAlt2);
    //      PORT_HAL_SetOpenDrainCmd(PORTC_BASE,11u,true); <=拿掉
          break;
    //----------------------------------------------------------------------------------------------------------------------I2C
        default:
          break;
      }
    }
    hello_frdmk64f/ksdk_Files/hardware_init.c修改
    void hardware_init(void) {

      uint8_t i;
      
      /* enable clock for PORTs */
      for (i = 0; i < HW_PORT_INSTANCE_COUNT; i++) {
        CLOCK_SYS_EnablePortClock(i);
      }

      /* Setup board clock source. */
      g_xtal0ClkFreq = 50000000U;
      g_xtalRtcClkFreq = 32768U;

      for (i = 0; i < HW_PORT_INSTANCE_COUNT; i++) {
        configure_gpio_pins(i);
      }
    //----------------------------------------------------------------------------------------------------------------------I2C
        configure_i2c_pins(0u);
        configure_i2c_pins(1u);
    //----------------------------------------------------------------------------------------------------------------------I2C
    }

    hello_frdmk64f/sources/hello.c修改 world_task副程式

    unsigned char A1[8]={0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
    unsigned char A2[8]={0xff,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC};
    extern void I2C1_IRQHandler(void);

    void world_task
       (
          uint32_t initial_data
       )
    {
       _task_id hello_task_id;
       unsigned long i;

       hello_task_id = _task_create(0, HELLO_TASK, 0);
       if (hello_task_id == MQX_NULL_TASK_ID) {
          printf ("\n Could not create hello_task\n");
       } else {
          printf(" World \n");
       }



    //----------------------------------------------------------------------------------------------------------------------I2C
          i2c_master_state_t master;
          i2c_status_t returnValue;

          i2c_device_t slave =
          {
              .address = 0x50,//0x78A0,//0B10100000,//0xA0,
              .baudRate_kbps = 5
          };
          OSA_Init();
          OSA_InstallIntHandler(I2C1_IRQn, I2C1_IRQHandler);
    //      NVIC_SetPriority(I2C0_IRQn, 4);
          NVIC_SetPriority(I2C1_IRQn, 4);
          I2C_DRV_MasterInit(1, &master);
       //   I2C_DRV_MasterDeinit(1);
          I2C_DRV_MasterSetBaudRate(1,&slave);
          OSA_Start();

       //   OSA_TimeDelay(200);
       //   returnValue = I2C_DRV_MasterSendDataBlocking(1,&slave,cmdBuff,1,sendBuff,sizeof(sendBuff),500);
       //   returnValue = I2C_DRV_MasterSendDataBlocking(1,&slave,ABCD,1,ABCD,sizeof(sendBuff),500);

       while(1)
       {
       //   I2C_DRV_MasterSendDataBlocking(1,&I2CDevice, ABCD, 2, ABCD, 2, 2);
               I2C_DRV_MasterSendDataBlocking(1,&slave,NULL,0,A2,1,20);
       //        I2C_DRV_MasterReceiveDataBlocking(1,&slave,ABCD,1,ABCD,1,50);
            printf(" World \n");
               for(i=0;i<4999999;i++)
               {}

       /*        for(i=0;i<4999999;i++)
               {}
               for(i=0;i<4999999;i++)
               {}
       */
       }
    //----------------------------------------------------------------------------------------------------------------------I2C


       _task_block();

    }

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    26

    帖子

    0

    注册会员

    Rank: 2

    积分
    197
    最后登录
    2020-9-24
    发表于 2015-1-30 17:01:06 | 显示全部楼层
    good852 发表于 2015-1-30 13:32
    我是使用Hello world裡添加 I2C_1控制

    使用KSDK_1.1.0 Library

    楼主,请检查你的中断函数是怎样设置的。
    如果按照KSDK1.1.0 默认的中断函数,路径是这样的:
    (1)中断向量表对应得的中断函数 是 fsl_i2c_irq.c 文件中的
    void I2C1_IRQHandler(void)
    {
        I2C_DRV_IRQHandler(HW_I2C1);
    }
    (2)
       然后真正的中断函数内容在 fsl_i2c_shared_function.c 文件中的函数
    void I2C_DRV_IRQHandler(uint32_t instance){}

    如果中断没有设置正确,程序也会一直在等待函数这执行。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    90
    最后登录
    2015-4-30
     楼主| 发表于 2015-2-2 11:34:11 | 显示全部楼层
    本帖最后由 good852 于 2015-2-2 11:36 编辑

    我使用KSDK1.1.0
    找到
    fsl_i2c_irq.c 裡面是
    #include "fsl_i2c_shared_function.h"
    #include "fsl_device_registers.h"
    void I2C0_IRQHandler(void)
    {
        I2C_DRV_IRQHandler(HW_I2C0);
    }
    void I2C1_IRQHandler(void)
    {
        I2C_DRV_IRQHandler(HW_I2C1);
    }
    void I2C2_IRQHandler(void)
    {
        I2C_DRV_IRQHandler(HW_I2C2);
    }

    fsl_i2c_shared_function.c 裡面是
    #include <assert.h>
    #include "fsl_i2c_hal.h"
    #include "fsl_i2c_shared_function.h"
    #include "fsl_device_registers.h"
    extern const uint32_t g_i2cBaseAddr[HW_I2C_INSTANCE_COUNT];
    void I2C_DRV_IRQHandler(uint32_t instance)
    {
        assert(instance < HW_I2C_INSTANCE_COUNT);
        uint32_t baseAddr = g_i2cBaseAddr[instance];

        if (I2C_HAL_IsMaster(baseAddr))
        {
            /* Master mode.*/
            I2C_DRV_MasterIRQHandler(instance);
        }
        else
        {
            /* Slave mode.*/
            I2C_DRV_SlaveIRQHandler(instance);
        }
    }

    設置這樣是有問題的嗎?還是搞不太懂要怎麼解這問題....
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    19

    帖子

    0

    注册会员

    Rank: 2

    积分
    90
    最后登录
    2015-4-30
     楼主| 发表于 2015-2-3 08:14:07 | 显示全部楼层
    先前貼的程式有貼
    OSA_InstallIntHandler(I2C1_IRQn, I2C1_IRQHandler);<=這樣代表就有設置成功嗎?
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-22 18:00 , Processed in 0.103585 second(s), 30 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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