历史上的今天

今天是:2024年09月12日(星期四)

正在发生

2018年09月12日 | STM32F0 Slave I2C配置

发布者:DreamySerenity 来源: eefocus关键字:STM32F0  Slave  I2C配置 手机看文章 扫描二维码
随时随地手机看文章

F0的I2C与F103不同,Slave I2C接口协议采用寄存器访问的格式。


(1)I2C初始化


void IIC_Slavemode_Init(u8 debug, u8 addr)

{

    GPIO_InitTypeDef GPIO_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;

    I2C_InitTypeDef I2C_InitStructure;



    if(debug == 1)   return;

    //---------------------------- GPIO pins configuration ------------------

    /* I2C Periph clock enable */

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    /* Configure the I2C clock source. The clock is derived from the HSI */

    //RCC_I2CCLKConfig(RCC_I2C1CLK_HSI); //RCC_I2C1CLK_SYSCLK

    // Enable I2C1 SCL and SDA Pin Clock

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);


 //PA10:SDA  PA9:SCL

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9|GPIO_Pin_10;

    // Set GPIO frequency to 50MHz

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    // Select Alternate function mode

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    //Select output Open Drain type

    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;

    // Disable internal Pull-up

    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;//GPIO_PuPd_NOPULL;


    GPIO_Init((GPIO_TypeDef*)GPIOA, &GPIO_InitStructure);





    // Connect PXx to I2C_SCL I2C_SDA    PA10:SDA  PA9:SCL  meilh 201024 GPIO_AF_1->GPIO_AF_4

    GPIO_PinAFConfig((GPIO_TypeDef*)GPIOA,GPIO_PinSource9,GPIO_AF_4);

    GPIO_PinAFConfig((GPIO_TypeDef*)GPIOA,GPIO_PinSource10,GPIO_AF_4);


   //---------------------------- Deinitialize I2C1 clock ------------------

    // Reset I2C1 device clock in order to avoid non-cleared error flags 

    //RCC_APB1PeriphResetCmd((RCC_APB1Periph_I2C1),ENABLE);

    //RCC_APB1PeriphResetCmd((RCC_APB1Periph_I2C1),DISABLE);


    //I2C1 Configuration

    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

    I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;

    I2C_InitStructure.I2C_DigitalFilter = 0x00;

    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

    I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

    I2C_InitStructure.I2C_OwnAddress1 = addr<<1;

    //I2C_InitStructure.I2C_Timing = 0x10805D88;//0x50E30000;//0x20D22E37;//slave: 0x20D20000;

    I2C_Cmd(I2C1,ENABLE);

    I2C_Init(I2C1, &I2C_InitStructure);

    I2C_ITConfig(I2C1, I2C_CR1_ADDRIE | I2C_CR1_STOPIE | I2C_CR1_TXIE | I2C_CR1_RXIE, ENABLE); //meilh 20171025 remove  I2C_CR1_ERRIE|I2C_CR1_NACKIE|

    

    //---------------------------- Peripheral and DMA interrupts Initialization ------------------

    // Initialize I2C1 interrupts

    /* Configure NVIC for I2C1 Interrupt */

    NVIC_InitStructure.NVIC_IRQChannel = I2C1_IRQn;

    NVIC_InitStructure.NVIC_IRQChannelPriority = 3;

    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; 

    NVIC_Init(&NVIC_InitStructure);

}


要注意的地方是:GPIO_PinAFConfig((GPIO_TypeDef*)GPIOA,GPIO_PinSource9,GPIO_AF_4);


之前看例子是用的 GPIO_AF_1,I2C死活没反应,后来找厂家提供了一个可以跑的例子比较寄存器,发现此地方要用GPIO_AF_4,就正常工作了。


(2)中断处理接口


void I2C1_IRQHandler(void)

{

   __IO uint32_t I2CFlagStatus = 0x00000000;

   uint8_t data;

   

   I2CFlagStatus = (uint32_t)(I2C1->ISR & (uint16_t)0x0000100FE);

   if ((I2CFlagStatus & I2C_ISR_ADDR) != 0)

  {

   if(I2C1->ISR&I2C_ISR_DIR) //tx mode

   {

             Tx_count = 0;

          I2C1->ISR |= I2C_ISR_TXE;

             I2C1->ICR |= I2C_ICR_ADDRCF; 

  } 

if((I2C1->ISR&I2C_ISR_DIR)==0) //rx mode

        {           

   Rx_buffer[0] = 0;

   Rx_count= 1;

           I2C1->ICR |= I2C_ICR_ADDRCF; 

        }

    }

   else if ((I2CFlagStatus & I2C_ISR_RXNE) != 0)

   {

    data = I2C_ReceiveData(I2C1);

if(Rx_count < Rx_MAX){

            Rx_buffer[Rx_count++] = data ;

    if(Rx_count == 2){

  reg_offset = Rx_buffer[1];

    }

}

   }

  else if ((I2CFlagStatus & I2C_ISR_TXIS) != 0)

  {

I2C_SendData(I2C1,Tx_buffer[reg_offset+Tx_count]);

Tx_count++;

if(Tx_count >= Tx_MAX)

{

Tx_count = 0; //tx ok

}

  }

  else if ((I2CFlagStatus & I2C_ISR_STOPF) != 0)

  {

  I2C1->ICR |= I2C_ICR_STOPCF;

Rx_buffer[0] = Rx_count;

  Rx_count = 0;

  Tx_count = 0;

  } 

  

}

F0的I2C状态判断比较容易,不过可能也因为使用的频率低暂未发现问题,后来F103也仿照这个形式进行了修改。

其它就没什么好说的,自己根据自己的协议接口进行修改。


关键字:STM32F0  Slave  I2C配置 引用地址:STM32F0 Slave I2C配置

上一篇:STM32F4 开发笔记2: IO输出的设置
下一篇:stm32——串口1和串口2初始化

推荐阅读

  欧洲太阳能协会SPE发布了一份白皮书,解释了在六个案例研究中使用太阳能的好处,储能技术在商业中的应用可以优化太阳能的供给。通过这份白皮书SPE太阳能与储能工作组携手太阳能和储能领域25家行业领先企业呼吁欧洲政策的制定者采取如下措施:   1. 电网费应按进入电网的每千瓦时数进行计量收取   2. 储能可按需求储存和释放电力,不应加收税...
据韩国“News1”新闻网9月8日报道,由于中国竞争对手产能过剩,LG、三星等韩国生产商将实施与生产线调整计划相配套的“人力结构调整”措施。据报道,三星一直以来定期实施自愿退休策略,LG则计划不久后实施人力结构调整。LG有关负责人表示,“目前正考虑进行人力结构调整。但具体计划还没有同工会协商,尚未确定。”三星方面有关负责人表示,他们在确定将...
据企查查最新消息显示,混合模拟集成电路制造商西安睿芯微电子有限公司日前发生了投资人(股东)变更,其中新增股东之一为湖北小米长江产业基金合伙企业(有限合伙),持股比例为9.2636%。图源:企查查据悉,睿芯微电子成立于2014年,主要产品包括超低相位噪声晶振、DSD音频解码芯片、智能音频功放芯片以及数字耳机芯片等,主要应用于移动通讯领域,同时还...
重播 播放 00:00 / 00:00 正在直播 00:00 进入全屏 画中画 点击按住可拖动视频 2021世界机器人大会9月10日至13日在北京举办。做饭、沏茶、写字、打太极……还有更多你意想不到的酷炫黑科技!跟梦竾和宇辰一起打卡这场地表最强机器人盛会,感受...

史海拾趣

问答坊 | AI 解惑

开关电源设计知识介绍

开关电源设计1 电子产品,特别是军用稳压电源的设计是一个系统工程,不但要考虑电源本身参数设计,还要考虑电气设计、电磁兼容设计、热设计、安全性设计、三防设计等方面。因为任何方面那怕是最微小的疏忽,都可能导致整个电源的崩溃,所以我们应充分认 ...…

查看全部问答∨

CMOS射频集成电路的现状与进展

  摘 要: 随着低功耗!可移动个人无线通信的发展和CMOS工艺性能的提高,用CMOS工艺实现无线通信系统的射频前端不仅必要而且可能.本文讨论了用CMOS工艺实现射频集成电路的特殊问题.首先介绍各种收发器的体系结构,对它们的优缺点进行比较,指出在设 ...…

查看全部问答∨

DIY电子钟套件,有兴趣来做啊

[qq]188383251[/qq]采用6*7方型LED点阵模块,比较漂亮。所有资料来源于网络,传些PP给大家看看 希望熟悉软件的朋友,开源自己的软件设计~~ 附:0730LED点阵电子钟设计方案 现在DS18B20价格贵,大家其实可以申请样片,如果特别需要的话,这个器件是 ...…

查看全部问答∨

关于检测RXD和TXD是否短路的程序源码的问题!!!!

//检查连接线RXD跟TXD是否短路 uint32 Device_HasShortBetweenTxdRxd(uint8* acCheckSelfQueryPacket, uint32 nPacketLen) {         //自身连接线检查         uint8 acBuffer[4];     &n ...…

查看全部问答∨

单片机控制步进电机选型的问题~用什么片子好点~大侠们推荐一下 谢谢了!

我想做一个单片机控制步进电机的板子 大侠们给我推荐一些比较实惠的芯片啊~网上找的是各人说各人的好处~小弟初来咋到~先谢谢各位拉!!!…

查看全部问答∨

什么书适合VHDL初学者

想买本书看看,书太多不知道选哪本,请教各位啦。 还有谁看过《基于Quartus2的FPGA/CPLD数字系统设计实例》,谈谈感受吧。…

查看全部问答∨

2407片外扩充RAM最大值的问题

有资料说“2407的片外扩展程序空间 和 数据空间最大都只能是32K字,再多了也是浪费。” 但是,F2407用仿真器仿真的时候,一般是用的是F2407片外的RAM存储器,这个时候MP/MC引脚应该是高电平。reset后dsp从外部程序空间的0000H开始执行。这样不是 ...…

查看全部问答∨

【MSP430共享】MSP5438无线语音开发板资料

  这些资料足够大家做个无线对讲机了…

查看全部问答∨

Launchpad完全手册

本帖最后由 paulhyde 于 2014-9-15 04:17 编辑 参加TI杯的童鞋们  …

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved