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

STM32F0 IIC slave mode

[复制链接]
bennett 发布时间:2018-12-8 14:11
void I2C_Configuration(void)
{
       GPIO_InitTypeDef  GPIO_InitStructure;
       I2C_InitTypeDef I2C_InitStruct;
       NVIC_InitTypeDef NVIC_InitStructure;
       
               
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
        RCC_I2CCLKConfig(RCC_I2C1CLK_SYSCLK);
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);
       
       
        GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7 | GPIO_Pin_8; //管脚号
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; //速度
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //输入 输出 复用 模拟
        GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//推挽输出  开漏输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//上拉  下拉
        GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1);
        GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_1);
        I2C_DeInit(I2C1);                                                  //复位I2C
        I2C_Cmd(I2C1, DISABLE);
       
       
        I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
        I2C_InitStruct.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
        I2C_InitStruct.I2C_DigitalFilter = 0x00;
        I2C_InitStruct.I2C_OwnAddress1 =0xA0;
        I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
        I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
        I2C_InitStruct.I2C_Timing = 0x00900000; // 100Kbits 0x40B22536   0x30e30000     0x30E32E44
          
        I2C_Init(I2C1, &I2C_InitStruct);
        I2C_StretchClockCmd(I2C1,  ENABLE);                                       //使能I2C
        I2C_ITConfig(I2C1, I2C_IT_RXI | I2C_CR1_ERRIE | I2C_IT_TXI| I2C_IT_NACKI|I2C_IT_ADDRI | I2C_IT_STOPI, ENABLE);//
        I2C_Cmd(I2C1, ENABLE);
        NVIC_InitStructure.NVIC_IRQChannel = I2C1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority=0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);

}

void I2C1_IRQHandler(void)
{               
                uint8_t  temp;
    uint32_t status =  (uint32_t)(I2C1->ISR & (uint16_t)0x0000100FE);
               
                if(status & I2C_ISR_ADDR)
    {   
                       

         if(I2C1->ISR&I2C_ISR_DIR) //tx mode
        {
       
            I2C1->ICR |= I2C_ICR_ADDRCF;
          
                                                                       
        }
        if((I2C1->ISR&I2C_ISR_DIR)==0) //rx mode
        {

           I2C1->ICR |= I2C_ICR_ADDRCF;
           Instruct = 1;
        }       
        Offset = 0;
    }
    else if(status & I2C_ISR_RXNE)                        //0x04
    {
                               
        temp = I2C_ReceiveData(I2C1);
                                 
        if(Instruct)
        {  
                                         switch(temp)
                                         {
                                                 case 0x02: // Get DevInfo
                                                 TxBuff = (uint8_t *)&DevInfo; // 24 bytes                                                 
                                                 MaxBytes = sizeof(DevInfo);       
                                                                                         
                                                 I2C1->ISR |= I2C_ISR_TXE;                                         
                                                 break;
                                                 default: break;
                                         }
                                        Instruct = 0;

        }
                       
        RxBuff[Offset++] = temp;
        }
               
    else if(status & I2C_ISR_TXIS)   //0x02
    {

        if(Offset < MaxBytes)
        {
            I2C_SendData(I2C1, TxBuff[Offset++]);
                                               
        }
        else
        {
            I2C_SendData(I2C1, 0xFF);
        }
                               
   }
    else if(status & I2C_ISR_NACKF)   //0x02
    {
       I2C1->ISR |= I2C_ISR_TXE;
       I2C_ClearITPendingBit(I2C1, I2C_ISR_NACKF);               
        }
    else if(status & I2C_ISR_STOPF)
    {
          I2C1->ICR |= I2C_ICR_STOPCF;     
        }
                else
    {
        I2C_ClearITPendingBit(I2C1, 0x00003F38);

    }

}




收藏 评论1 发布时间:2018-12-8 14:11

举报

1个回答
bennett 回答时间:2018-12-8 14:12:27
非常稳定,

所属标签

相似分享

官网相关资源

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