查看: 1541|回复: 3

[基础] STM32 I2C 硬件中断方式实现方法,带流程图

[复制链接]
  • TA的每日心情
    无聊
    2018-11-16 10:48
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2019-12-26 16:34:43 | 显示全部楼层 |阅读模式
    分享到:
    流程图如下:






    RE:STM32 I2C 硬件中断方式实现方法,带流程图


    I2C 中断处理函数如下:

    /**
      * @brief  This function handles I2C1 Event interrupt request, tx, rx
      *         buffer and number of bytes will be changed.
      * @param  None
      * @retval None
      */
    void I2C1_EV_IRQHandler(void)
    {
    #ifdef ARC_I2C_IRQ
        uint32_t i2cEvent;
        I2C_param_struct __IO *pI2C_param;

        pI2C_param = ARC_get_I2C_param();
        i2cEvent = I2C_GetLastEvent(I2C1);
       
        switch (i2cEvent)
        {
            case I2C_EVENT_MASTER_MODE_SELECT:/* EV5 */
                if(pI2C_param->I2C_DIRECTION == ARC_I2C_DIRECTION_TX)
                {
                    I2C_Send7bitAddress(I2C1, pI2C_param->DeviceAddr, I2C_Direction_Transmitter);
                }
                else
                {
                    I2C_Send7bitAddress(I2C1, pI2C_param->DeviceAddr, I2C_Direction_Receiver);
                }
                break;

            /* Master Transmitter -------------------------------------------------------*/
            case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:
                I2C_SendData(I2C1, pI2C_param->SubAddr);
                if(pI2C_param->TxNumOfBytes == 0)
                    I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
                break;
             
            case I2C_EVENT_MASTER_BYTE_TRANSMITTING:  /* Without BTF, EV8 */   
                if(pI2C_param->TX_I2C_Index < pI2C_param->TxNumOfBytes)
                {
                    I2C_SendData(I2C1, pI2C_param->TxData[pI2C_param->TX_I2C_Index++]);
                }
                else
                {     
                    I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
                }
                break;

            case I2C_EVENT_MASTER_BYTE_TRANSMITTED: /* With BTF EV8-2 */
               if(pI2C_param->TX_Generate_stop == 1)
               {
                 I2C_GenerateSTOP(I2C1, ENABLE);
                 I2C_ITConfig(I2C1, I2C_IT_EVT, DISABLE);
               }
               else
               {
                 pI2C_param->I2C_DIRECTION = ARC_I2C_DIRECTION_RX;
                 I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);
                 I2C_GenerateSTART(I2C1, ENABLE);
               }
               break;

            /* Master Receiver -------------------------------------------------------*/
            case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:
                if(pI2C_param->RX_I2C_Index == (pI2C_param->RxNumOfBytes - 1))
                {
                    I2C_AcknowledgeConfig(I2C1, DISABLE);
                    I2C_GenerateSTOP(I2C1, ENABLE);
                }
                break;

            case I2C_EVENT_MASTER_BYTE_RECEIVED:
                pI2C_param->RxData[pI2C_param->RX_I2C_Index++] = I2C_ReceiveData (I2C1);
                if(pI2C_param->RX_I2C_Index == (pI2C_param->RxNumOfBytes - 1))
                {
                    I2C_AcknowledgeConfig(I2C1, DISABLE);
                    I2C_GenerateSTOP(I2C1, ENABLE);
                }
                break;

            default:
                break;
        }

    #endif
    }
    游客,如果您要查看本帖隐藏内容请回复



    回复

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 13:31 , Processed in 0.166328 second(s), 25 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.