历史上的今天
返回首页

历史上的今天

今天是:2025年08月08日(星期五)

正在发生

2019年08月08日 | STM32F051 I2C slave mode

2019-08-08 来源:eefocus

用STM32F051的I2C从模式做某模块的控制接口,通过主机读状态和写控制命令。


Eclips 环境,gcc编译器,相关源码如下:


#ifdef DEBUG_I2C_EN

#define DEBUG_I2C(...)      printf(__VA_ARGS__)

#else

#define DEBUG_I2C(...)

#endif

 

void I2C_Config(void)

{

    GPIO_InitTypeDef    GPIO_InitStructure;

    I2C_InitTypeDef     I2C_InitStructure;

    NVIC_InitTypeDef    NVIC_InitStructure;

 

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    // I2C port

    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_6 | GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_1);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_1);

 

    // I2C config

    I2C_InitStructure.I2C_Timing               = 0x00731012;

    I2C_InitStructure.I2C_AnalogFilter         = I2C_AnalogFilter_Enable;

    I2C_InitStructure.I2C_DigitalFilter        = 0x00;

    I2C_InitStructure.I2C_Mode                 = I2C_Mode_I2C;

    I2C_InitStructure.I2C_OwnAddress1          = DEV_SLAVE_ADDR;

    I2C_InitStructure.I2C_Ack                  = I2C_Ack_Enable;

    I2C_InitStructure.I2C_AcknowledgedAddress  = I2C_AcknowledgedAddress_7bit;

    I2C_Init(I2C1, &I2C_InitStructure);

    I2C_Cmd(I2C1, ENABLE);

 

    I2C_StretchClockCmd(I2C1, DISABLE);

 

    NVIC_InitStructure.NVIC_IRQChannel         = I2C1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPriority = 2; // Low Medium Hight VeryHigh: 0 - 3

    NVIC_InitStructure.NVIC_IRQChannelCmd      = ENABLE;

    NVIC_Init(&NVIC_InitStructure);

 

    uint32_t temp = I2C_IT_STOPI |

                    I2C_IT_ADDRI |

                    I2C_IT_RXI   |

                    I2C_IT_TXI;

    I2C_ITConfig(I2C1, temp, ENABLE);

}

 

 

static uint8_t  Instruct = 0;

static uint8_t  Offset   = 0;

static uint8_t  MaxBytes = 0;

 

uint8_t *TxBuff;

uint8_t RxBuff[40];

 

void I2C1_IRQHandler(void)

{

    uint8_t  temp;

    uint32_t status = I2C1->ISR;

 

    DEBUG_I2C("I2C1->ISR: %08Xnr", status);

    if(status & I2C_ISR_ADDR)

    {   // I2C1 Address match event occurs

        I2C_ClearITPendingBit(I2C1, I2C_ISR_ADDR);

 

        if(status & I2C_ISR_DIR)

        {   // I2C1: slave enters transmitter mode.

            ;

        }

        else

        {   // I2C1: slave enters receiver mode.

            Instruct = 1;

        }

 

        Offset = 0;

    }

    else if(status & I2C_ISR_RXNE)

    {

        I2C1->ISR |= I2C_ISR_TXE;

        temp = I2C_ReceiveData(I2C1);

        if(Instruct)

        {   // Host Instruct

            switch(temp)

            {

                case 0x00:  // Get DevInfo

                    TxBuff = (uint8_t *)&DevInfo;     // 24 bytes

                    MaxBytes = sizeof(DevInfo);

                    break;

                case 0x18:  // Get DevStatus

                    TxBuff = (uint8_t *)&DevStatus;   // 8 bytes

                    MaxBytes = sizeof(DevStatus);

                    break;

                default: break;

            }

 

            Instruct = 0;

        }

 

        RxBuff[Offset++] = temp;

    }

    else if(status & I2C_ISR_TXIS)

    {

        I2C1->ISR |= I2C_ISR_TXE;

        if(Offset < MaxBytes)

        {

            I2C_SendData(I2C1, TxBuff[Offset++]);

        }

        else

        {

            I2C_SendData(I2C1, 0xFF);

        }

    }

    else if(status & I2C_ISR_STOPF)

    {

        I2C_ClearITPendingBit(I2C1, I2C_ISR_STOPF);

        DEBUG_I2C("I2C1 Host stop, Bytes: %dnr", Offset);

        ; // 指令解析

        ;

    }

    else

    {

        I2C_ClearITPendingBit(I2C1, 0x00003F38);

        printf("I2C1 Unknown event occurs!nr");

    }

}



推荐阅读

史海拾趣

FWBELL公司的发展小趣事
在电池温度允许的范围内,以较大的电流进行快速充电,缩短充电时间。
台湾致强(FORT)公司的发展小趣事

随着产品技术的不断成熟,致强科技开始积极寻求市场拓展。2016年,致强科技携手上海晟霆电子科技有限公司,共同致力于致强品牌合金电阻在中国内地市场的推广与销售。这一合作不仅扩大了致强产品的市场覆盖范围,还通过本地化服务提升了客户满意度。通过精准的市场定位和高效的营销策略,致强电阻迅速在内地市场占据了一席之地,成为众多电子企业信赖的合作伙伴。

长江微电(cjiang)公司的发展小趣事

2022年8月,美国商务部出台了一项断供禁令,禁止向中国出售用于芯片设计的特定类型的EDA软件。这一制裁措施对中国的半导体行业造成了巨大冲击。然而,长江微电并未因此气馁,反而借此机会加大了对电感产品的研发力度。通过自主创新,公司成功开发出了一系列高性能、高品质的电感产品,满足了国内外客户的需求。这一成就不仅彰显了长江微电应对国际制裁的勇气和智慧,也为中国半导体行业的发展注入了新的活力。

EPSON公司的发展小趣事

EPSON始终将品质视为企业发展的生命线。公司建立了严格的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,EPSON还积极引进先进的生产设备和检测技术,不断提高产品的品质和性能。这种对品质的执着追求使得EPSON的产品在市场上赢得了良好的口碑和信誉,逐渐建立了起强大的品牌形象。

BILIN公司的发展小趣事

EPSON一直注重环保和可持续发展。公司积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,EPSON还致力于研发环保型电子产品,如节能型打印机、环保型投影机等,以减少电子产品对环境的影响。此外,EPSON还积极参与各种环保公益活动,推动电子行业的绿色发展。

ALLIED [Allied Electronics]公司的发展小趣事

EPSON始终将品质视为企业发展的生命线。公司建立了严格的质量管理体系,从原材料采购到生产、检测、包装等各个环节都进行严格的质量控制。同时,EPSON还积极引进先进的生产设备和检测技术,不断提高产品的品质和性能。这种对品质的执着追求使得EPSON的产品在市场上赢得了良好的口碑和信誉,逐渐建立了起强大的品牌形象。

问答坊 | AI 解惑

认识ARM体系结构的发展

处理器的体系结构定义了指令集(ISA)和基于这一体系结构下处理器的程序员模型。尽管每个处理器 性能不同,所面向的应用不同,每个处理器的实现都要遵循这一体系结构。ARM体系结构为嵌入系统发展 商提供很高的系统性能,同时保持优异的功耗和 面 ...…

查看全部问答>

FPGA、CPLD常用protel库

FPGA、CPLD常用protel库…

查看全部问答>

求个用VB.NET做的控制GPIO的小程序

各位看官,小弟现在最大的梦想就是用VB.NET控制我板子上(友善之臂MINI2400)上的那个LED灯,搞来搞去都没成功,请哪位大哥大姐行行好给个源码,只要点下按钮让灯亮就行,拜谢了…

查看全部问答>

那位大虾帮帮忙,明天就考试了,开卷完全找不到答案

11.        基于ARM7 、9、11处理器设计的产品,类似Intel的Xscale架构产品的设计方案 (功能特点、结构、作用  举例子说明设计方案,如GPS、游戏机、POS……) 12.        嵌入式系统实时性? ...…

查看全部问答>

我的cisco2600路由器被人把IOS删掉了,我要从另一个2600路由器下载IOS,怎么下呢??高分求助!

        我用的是COPY FLASH  TFTP命令 ,但是总是报错:TFTP://10.1.1.3 timeout 10.1.1.3是我设置的本机IP。 怎么解决呢》?求高手指教啊 …

查看全部问答>

2008 Google 开发者日活动,火速报名中

Google开发者日活动 和Google的工程师、业界同行们交流利用Google的各种开发工具去构建您的社区应用、移动应用、地图应用,或者基于 AJAXJavaScript的网络应用。 2008年6月12日,北京 北京亚运村北京国际会议中心 报名地址:httpcode.google.co ...…

查看全部问答>

网卡后面的显示灯是红色的,为什么?

以前不是这样的,并且在电脑属性里面的硬件里面的设备管理器中看不到网络适配器.高手们快点过来指点下…

查看全部问答>

水质检测器电路

本帖最后由 jameswangsynnex 于 2015-3-3 19:54 编辑   …

查看全部问答>

user error: Reset failed - Target not halted

ST研讨会的时候拿了一块 DISCOVERY的板子,最近在学习,现在用IAR下程序的时候碰到错误提示user error: Reset failed - Target not halted,有知道为什么会出现这个错误的吗?怎么解决…

查看全部问答>