打印

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

[复制链接]
13507|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
armrunc|  楼主 | 2012-2-1 11:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
流程图如下:
沙发
yinyangdianzi| | 2012-2-1 11:34 | 只看该作者
是你啊,问题还没解决啊,,新年好,,,,

使用特权

评论回复
板凳
armrunc|  楼主 | 2012-2-1 11:34 | 只看该作者
其实现代码如下:
/**
  * @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
}

i2c_api.rar

4.13 KB

使用特权

评论回复
地板
armrunc|  楼主 | 2012-2-1 11:39 | 只看该作者
是你啊,问题还没解决啊,,新年好,,,,
yinyangdianzi 发表于 2012-2-1 11:34

认错人了吧,测试没有问题啊。

使用特权

评论回复
5
armrunc|  楼主 | 2012-2-1 15:32 | 只看该作者
具体实例,使用硬件 I2C 访问 EEPROM.

12_I2C.pdf

615.08 KB

使用特权

评论回复
6
mochou| | 2012-2-1 17:37 | 只看该作者
帮你顶顶吧,不容易的,

使用特权

评论回复
7
李富贵| | 2012-2-1 20:06 | 只看该作者
都没说到点子上,STM32的IIC问题是必须最高中断优先级或者DMA模式。
简单做一个例子很容易,难的是在一个复杂系统里面应用IIC(无法分配最高优先级或DMA通道),必死无疑。

使用特权

评论回复
8
armrunc|  楼主 | 2012-2-2 22:04 | 只看该作者
都没说到点子上,STM32的IIC问题是必须最高中断优先级或者DMA模式。
简单做一个例子很容易,难的是在一个复杂系统里面应用IIC(无法分配最高优先级或DMA通道),必死无疑。 ...
李富贵 发表于 2012-2-1 20:06


同意,但是你可以看到,我这个中断处理函数非常的短,每个 CASE 的代码量都非常小。即便是最高优先级,对其它中断处理不会有太大的影响。

使用特权

评论回复
9
armrunc|  楼主 | 2012-2-2 22:10 | 只看该作者
帮你顶顶吧,不容易的,
mochou 发表于 2012-2-1 17:37


谢谢。是弄了一段时间。

使用特权

评论回复
10
thcsgpxgy| | 2012-9-29 09:36 | 只看该作者
我也卡在这儿了,受益了

使用特权

评论回复
11
thcsgpxgy| | 2012-10-9 14:46 | 只看该作者
程序不完整啊

使用特权

评论回复
12
香水城| | 2012-10-9 15:57 | 只看该作者
LZ思路很清晰啊

发条裤子:lol

使用特权

评论回复
13
EAMCU| | 2012-10-9 18:14 | 只看该作者
我司使用stm32时,放弃使用i2c,在实际的系统中,为了可靠性,最高优先级往往轮不到i2c来用
其次,一个有病的模块即使看起来好用了,不代表它真的不再出问题了,对于一个实际的系统来说,如果没有精力和能力做超大量的实验,那么尽量选择本身问题较小的方案

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dong_abc + 1
14
arthur02| | 2012-12-5 11:43 | 只看该作者
有没有哪位大侠用 DMA实现的啊?

使用特权

评论回复
15
13249207512| | 2012-12-30 20:49 | 只看该作者
多谢分享

使用特权

评论回复
16
sinadz| | 2012-12-30 21:00 | 只看该作者
很有参考价值

使用特权

评论回复
17
can_all| | 2014-8-21 17:04 | 只看该作者
现如今看来还是挺好的!谢谢lz分享!赞

使用特权

评论回复
18
hqtdzgs| | 2014-8-21 21:43 | 只看该作者
参与下,

使用特权

评论回复
19
1398117027| | 2014-8-30 18:18 | 只看该作者
参考下你的例程

使用特权

评论回复
20
liklon| | 2014-10-10 14:35 | 只看该作者
楼主有STM32iic硬件从发送模式部分吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

13

帖子

0

粉丝