查看: 2706|回复: 7

[求助] MKL25Z I2C1怎么才能配置正确呢?

[复制链接]

该用户从未签到

11

主题

56

帖子

0

中级会员

Rank: 3Rank: 3

积分
256
最后登录
2016-1-21
发表于 2015-1-28 19:23:50 | 显示全部楼层 |阅读模式
LDD_TDeviceData* I2C1_Init(LDD_TUserData *UserDataPtr)
{
  /* Allocate HAL device structure */
  I2C1_TDeviceData *DeviceDataPrv;

        /* {MQXLite RTOS Adapter} Driver memory allocation: Dynamic allocation is simulated by a pointer to the static object */
  DeviceDataPrv = &DeviceDataPrv__DEFAULT_RTOS_ALLOC;

  DeviceDataPrv->UserData = UserDataPtr; /* Store the RTOS device structure */

  /* Allocate interrupt vector */
  /* {MQXLite RTOS Adapter} Save old and set new interrupt vector (function handler and ISR parameter) */
  /* Note: Exception handler for interrupt is not saved, because it is not modified */
  DeviceDataPrv->SavedISRSettings.isrData = _int_get_isr_data(LDD_ivIndex_INT_I2C1);
  DeviceDataPrv->SavedISRSettings.isrFunction = _int_install_isr(LDD_ivIndex_INT_I2C1, I2C1_Interrupt, DeviceDataPrv);
  DeviceDataPrv->SerFlag = ADDR_7;     /* Reset all flags start with 7-bit address mode */
  DeviceDataPrv->SlaveAddr = 0x3AU;    /* Set variable for slave address */
  DeviceDataPrv->SendStop = LDD_I2C_SEND_STOP; /* Set variable for sending stop condition (for master mode) */
  DeviceDataPrv->InpLenM = 0x00U;      /* Set zero counter of data of reception */
  DeviceDataPrv->OutLenM = 0x00U;      /* Set zero counter of data of transmission */
  DeviceDataPrv->ErrorMask = 0x00U;    /* Clear variable for errors mask value */

        /* SIM_SCGC4: I2C1=1 */
  SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK;                                   

        /* I2C1_C1: IICEN=0,IICIE=0,MST=0,TX=0,TXAK=0,RSTA=0,WUEN=0,DMAEN=0 */
  I2C1_C1 = 0X00u;                     /* Clear control register */

        /* I2C1_FLT: SHEN=0,STOPF=1,STOPIE=0,FLT=0 */
  I2C1_FLT = (I2C_FLT_STOPF_MASK | I2C_FLT_FLT(0x00)); /* Clear bus status interrupt flags */

        /* I2C1_S: TCF=0,IAAS=0,BUSY=0,ARBL=0,RAM=0,SRW=0,IICIF=1,RXAK=0 */
  I2C1_S = I2C_S_IICIF_MASK;           /* Clear interrupt flag */

/* PORTC_PCR10: ISF=0,MUX=2 */
  PORTC_PCR10 = (uint32_t)((PORTC_PCR10 & (uint32_t)~(uint32_t)(
                 PORT_PCR_ISF_MASK |
                 PORT_PCR_MUX(0x00)
                )) | (uint32_t)(
                 PORT_PCR_MUX(0x02)
                ));                                 
  /* PORTC_PCR11: ISF=0,MUX=2 */
  PORTC_PCR11 = (uint32_t)((PORTC_PCR11 & (uint32_t)~(uint32_t)(
                 PORT_PCR_ISF_MASK |
                 PORT_PCR_MUX(0x00)
                )) | (uint32_t)(
                 PORT_PCR_MUX(0x02)
                ));                                 
  /* NVIC_IPR2: PRI_8=0x80 */
  NVIC_IPR2 = (uint32_t)((NVIC_IPR2 & (uint32_t)~(uint32_t)(
               NVIC_IP_PRI_8(0x7F)
              )) | (uint32_t)(
               NVIC_IP_PRI_8(0x80)
              ));                                 

        /* NVIC_ISER: SETENA|=0x0100 */
  NVIC_ISER |= NVIC_ISER_SETENA(0x0100);                                   

        /* I2C1_C2: GCAEN=0,ADEXT=0,HDRS=0,SBRC=0,RMEN=0,AD=0 */
  I2C1_C2 = I2C_C2_AD(0x00);                                   

        /* I2C1_FLT: SHEN=0,STOPF=0,STOPIE=0,FLT=0 */
  I2C1_FLT = I2C_FLT_FLT(0x00);        /* Set glitch filter register */

        /* I2C1_SMB: FACK=0,ALERTEN=0,SIICAEN=0,TCKSEL=0,SLTF=1,SHTF1=0,SHTF2=0,SHTF2IE=0 */
  I2C1_SMB = I2C_SMB_SLTF_MASK;                                   

        /* I2C1_F: MULT=0,ICR=0x14 */
  I2C1_F = (I2C_F_MULT(0x00) | I2C_F_ICR(0x14)); /* Set prescaler bits */
  I2C_PDD_EnableDevice(I2C1_BASE_PTR, PDD_ENABLE); /* Enable device */
  I2C_PDD_EnableInterrupt(I2C1_BASE_PTR); /* Enable interrupt */
  /* Registration of the device structure */
  PE_LDD_RegisterDeviceStructure(PE_LDD_COMPONENT_I2C_ID,DeviceDataPrv);
  return ((LDD_TDeviceData *)DeviceDataPrv); /* Return pointer to the data data structure */
}

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

使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-1-29 09:50:38 | 显示全部楼层
    楼主能否详细说一下问题呢?这些代码的配置和使用不正确吗?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    56

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    256
    最后登录
    2016-1-21
     楼主| 发表于 2015-1-29 10:44:39 | 显示全部楼层
    是这样的I2C1的配置如上图有许多理解不到位,我自己简单的改写了下I2C1_init();
            SIM_SCGC4 |= SIM_SCGC4_I2C1_MASK;  
      
            /* configure GPIO for I2C0 function */
            PORTC_PCR10 |= PORT_PCR_MUX(2); //SCL
      PORTC_PCR11 |= PORT_PCR_MUX(2); //SDA

      I2C1_C1 =I2C_C1_IICEN_MASK;   /* Clear control register */
      I2C0_F  = 0x14;                 /* set MULT and ICR */

    其中的 I2C1_C1的作用不太理解,
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    124

    主题

    3600

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5781
    最后登录
    1970-1-1
    发表于 2015-1-29 10:46:28 | 显示全部楼层
    你好,楼主!
    请参考以下例程!
    https://www.nxpic.org.cn/module/forum/thread-563356-1-1.html
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    56

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    256
    最后登录
    2016-1-21
     楼主| 发表于 2015-1-29 10:50:27 | 显示全部楼层
    我想知道I2C1_F  = 0x14U;  这个怎么配置。理解得不是很到位。
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-1-29 16:58:05 | 显示全部楼层
    这个是配置波特率的,计算公式如下,根据需要的I2C波特率和系统时钟来推算I2C1_F的值。
    I2C baud rate = bus speed (Hz)/(mul × SCL divider)
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]初来乍到

    305

    主题

    4701

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    377
    最后登录
    2023-8-16
    发表于 2015-1-29 16:58:48 | 显示全部楼层
    mul × SCL divider,这个占位分布建议看一下寄存器手册。手册下载地址:
    http://cache.freescale.com/files ... on&fileExt=.pdf
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    11

    主题

    56

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    256
    最后登录
    2016-1-21
     楼主| 发表于 2015-1-29 20:03:44 | 显示全部楼层
           asm("NOP"); 可以使用吗?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-22 10:20 , Processed in 0.104914 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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