你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32l053,IIC驱动,接收及发送代码

[复制链接]
stary666 发布时间:2015-4-8 13:35
void
I2C_EEPROM_Init(void)
{
    GPIO_I2CSCLInitial();
    GPIO_I2CSDAInitial();

    RCC->APB1ENR        |= RCC_APB1ENR_I2CEN; /* (1) */
    I2C_CHANNEL->TIMINGR = I2C_TIMINGR;
    I2C_CHANNEL->CR1     = I2C_CR1_PE;        /* (2) */
}
void
I2C_TransferConfig(uint8_t  DevAddress,
                   uint16_t Size,
                   uint32_t Mode,
                   uint32_t Request
                   )
{
    /* clear tmpreg specific bits */
    I2C_CHANNEL->CR2 &= (uint32_t) ~((uint32_t)(I2C_CR2_SADD | I2C_CR2_NBYTES  \
                                                | I2C_CR2_RELOAD | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN \
                                                | I2C_CR2_START | I2C_CR2_STOP));

    /* update tmpreg */
    #if I2C_ADDRESSINGMODE_7BIT
    I2C_CHANNEL->CR2 |= (uint32_t)(((uint32_t)(DevAddress << 1) & I2C_CR2_SADD) \
                                   | (((uint32_t)Size << 16) & I2C_CR2_NBYTES) \
                                   | (uint32_t)Mode | (uint32_t)Request);
    #else
    I2C_CHANNEL->CR2 |= (uint32_t)(((uint32_t)DevAddress & I2C_CR2_SADD) \
                                   | (((uint32_t)Size << 16) & I2C_CR2_NBYTES) \
                                   | (uint32_t)Mode | (uint32_t)Request);
    #endif
}
void
I2C_Master_Transmit(uint8_t         DevAddress,
                    uint8_t         eerom_start_address,
                    const uint8_t * pData,
                    uint16_t        Size
                    )
{
    uint32_t sizetmp;

    if ((pData == NULL) || (Size == 0))
    {
        return;
    }

    while (__HAL_I2C_GET_FLAG(I2C_ISR_BUSY))
    {
    }

    /* Send Slave Address */
    /* Set NBYTES to write and reload if size > I2C_MAX_BYTES and generate RESTART */
    /* Size > I2C_MAX_BYTES, need to set RELOAD bit */
    if (Size > I2C_MAX_BYTES)
    {
        I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_GENERATE_START_WRITE);
        sizetmp = I2C_MAX_BYTES;
    }
    else
    {
        I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_GENERATE_START_WRITE);
        sizetmp = Size;
    }

    while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS))
    {
    }

    I2C_CHANNEL->TXDR = eerom_start_address;

    while ((Size - 1) > 0)
    {
        /* Wait until TXIS flag is set */
        while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS))
        {
        }

        /* Write data to TXDR */
        I2C_CHANNEL->TXDR = (uint32_t)*pData;
        pData++;
        sizetmp--;
        Size--;

        if ((sizetmp == 0) && (Size != 0))
        {
            /* Wait until TXE flag is set */
            while (!__HAL_I2C_GET_FLAG(I2C_ISR_TCR))
            {
            }

            if (Size > I2C_MAX_BYTES)
            {
                I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_NO_STARTSTOP);
                sizetmp = I2C_MAX_BYTES;
            }
            else
            {
                I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_NO_STARTSTOP);
                sizetmp = Size;
            }
        }
    }

    /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
    /* Wait until STOPF flag is set */
    while (!__HAL_I2C_GET_FLAG(I2C_ISR_STOPF))
    {
    }

    /* Clear STOP Flag */
    __HAL_I2C_CLEAR_FLAG(I2C_ISR_STOPF);

    /* Clear Configuration Register 2 */
    __HAL_I2C_RESET_CR2();
}
void
I2C_Master_Receive(uint8_t   DevAddress,
                   uint8_t   eerom_start_address,
                   uint8_t * pData,
                   uint16_t  Size
                   )
{
    uint32_t sizetmp;

    if ((pData == NULL) || (Size == 0))
    {
        return;
    }

    while (__HAL_I2C_GET_FLAG(I2C_ISR_BUSY))
    {
    }

    /* Send Slave Address */
    /* Set NBYTES to write and reload if size > I2C_MAX_BYTES and generate RESTART */
    /* Size > I2C_MAX_BYTES, need to set RELOAD bit */

    I2C_TransferConfig(DevAddress, 1, I2C_CR2_AUTOEND, I2C_GENERATE_START_WRITE);

    while (!__HAL_I2C_GET_FLAG(I2C_ISR_TXIS))
    {
    }

    I2C_CHANNEL->TXDR = eerom_start_address;

    if (Size > I2C_MAX_BYTES)
    {
        I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_GENERATE_START_READ);
        sizetmp = I2C_MAX_BYTES;
    }
    else
    {
        I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_GENERATE_START_READ);
        sizetmp = Size;
    }

    while (Size > 0)
    {
        /* Wait until RXNE flag is set */
        while (!__HAL_I2C_GET_FLAG(I2C_ISR_RXNE))
        {
        }

        /* Write data to RXDR */
        *pData = (uint8_t)I2C_CHANNEL->RXDR;
        pData++;
        sizetmp--;
        Size--;

        if ((sizetmp == 0) && (Size != 0))
        {
            /* Wait until TCR flag is set */
            while (!__HAL_I2C_GET_FLAG(I2C_ISR_TCR))
            {
            }

            if (Size > I2C_MAX_BYTES)
            {
                I2C_TransferConfig(DevAddress, I2C_MAX_BYTES, I2C_CR2_RELOAD, I2C_NO_STARTSTOP);
                sizetmp = I2C_MAX_BYTES;
            }
            else
            {
                I2C_TransferConfig(DevAddress, Size, I2C_CR2_AUTOEND, I2C_NO_STARTSTOP);
                sizetmp = Size;
            }
        }
    }

    /* No need to Check TC flag, with AUTOEND mode the stop is automatically generated */
    /* Wait until STOPF flag is set */
    while (!__HAL_I2C_GET_FLAG(I2C_ISR_STOPF))
    {
    }

    /* Clear STOP Flag */
    __HAL_I2C_CLEAR_FLAG(I2C_ISR_STOPF);
    /* Clear Configuration Register 2 */
    __HAL_I2C_RESET_CR2();
}
收藏 评论5 发布时间:2015-4-8 13:35

举报

5个回答
stary666 回答时间:2015-4-8 13:36:01
void
GPIO_I2CSCLInitial(void)
{
    /* Enable the peripheral clock of GPIOB */
    RCC->IOPENR      |= RCC_IOPENR_I2CEN;
    I2C_PORT->PUPDR   = (I2C_PORT->PUPDR & ~GPIO_PUPDR_PUPD_SCL);        /* (1) */
    I2C_PORT->OTYPER |= GPIO_OTYPER_OT_SCL;                              /* (2) */
    #if (I2C_SCL_PIN < AFR_MAX_PINNUMBER)
    {
        I2C_PORT->AFR[0] |= (SCL_ALTERNATE_NUMBER << (I2C_SCL_PIN * 4)); /* (5) */
    }
    #else
    {
        I2C_PORT->AFR[1] |= (SCL_ALTERNATE_NUMBER << ((I2C_SCL_PIN - AFR_MAX_PINNUMBER) * 4)); /* (5) */
    }
    #endif
    I2C_PORT->MODER = (I2C_PORT->MODER & ~GPIO_MODER_MODE_SCL) | GPIO_MODER_MODE_SCL_1;
}
stary666 回答时间:2015-4-8 13:36:16
void
GPIO_I2CSDAInitial(void)
{
    /* Enable the peripheral clock of GPIOB */
    RCC->IOPENR |= RCC_IOPENR_I2CEN;

    /* (1) PU for I2C signals */
    /* (2) open drain for I2C signals */
    /* (3) AF1 for I2C signals */
    /* (4) Select AF mode on PB and PB */
    I2C_PORT->PUPDR   = (I2C_PORT->PUPDR & ~GPIO_PUPDR_PUPD_SDA);        /* (1) */
    I2C_PORT->OTYPER |=  GPIO_OTYPER_OT_SDA;                             /* (2) */
    #if (I2C_SDA_PIN < AFR_MAX_PINNUMBER)
    {
        I2C_PORT->AFR[0] |= (SDA_ALTERNATE_NUMBER << (I2C_SDA_PIN * 4)); /* (5) */
    }
    #else
    {
        I2C_PORT->AFR[1] |= (SDA_ALTERNATE_NUMBER << ((I2C_SDA_PIN - AFR_MAX_PINNUMBER) * 4)); /* (5) */
    }
    #endif
    I2C_PORT->MODER = (I2C_PORT->MODER & ~GPIO_MODER_MODE_SDA) | GPIO_MODER_MODE_SDA_1;        /* (4) */
}
294479435@qq.co 回答时间:2015-4-8 18:03:14
看不懂,感觉很厉害
拼命三郎 回答时间:2015-4-8 19:50:26
顶顶顶顶顶顶顶顶顶大大大.jpg
wyxy163@126.com 回答时间:2015-4-8 20:26:26
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版