STM32——硬件IIC从机通信

发布者:考古专家最新更新时间:2019-02-12 来源: eefocus关键字:STM3  硬件IIC  从机通信 手机看文章 扫描二维码
随时随地手机看文章

前言:

  根据网上的资料,大部分网友表示STM32自带的硬件IIC存在bug,读写时很容易卡死。自己在调试的时候也出现卡死的情况,最后一点一点调试,也还是调通了。本文将记录自己调试STM32硬件IIC从机的一些心得体会。硬件IIC主机通信见另一篇文章:传送门 。


硬件平台:STM32F205


软件平台:keil v5


函数库:标准库


硬件IIC从机初始化

下面看下STM32中IIC的相应设置。 

首先是IIC的管脚配置。


/*---------IIC1---------------*/

uint8_t  Buffer_Rx_IIC1[40];//接收缓存

uint8_t  Rx_Idx_IIC1=0;//接收计数

uint8_t  Flag_RcvOK_IIC1 = 0;// 接收完成标志 

uint8_t  Tx_Idx_IIC1=0;//发送计数

u8 Response_Message[40];//发送缓存


void I2C1_GPIO_Configuration(void)

{

    GPIO_InitTypeDef  GPIO_InitStructure;

    // SCL PB6

    // SDA PB7

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;//必须设置为开漏输出,实现iic的线与逻辑

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;

    GPIO_Init(GPIOB, &GPIO_InitStructure);


    GPIO_PinAFConfig(GPIOB,GPIO_PinSource6,GPIO_AF_I2C1); 

    GPIO_PinAFConfig(GPIOB,GPIO_PinSource7,GPIO_AF_I2C1);

}


  注意上述管脚配置中GPIO_InitStructure.GPIO_PuPd必须配置为GPIO_PuPd_NOPULL,若配置为 GPIO_PuPd_UP或GPIO_PuPd_DOWN,IIC总线会一直繁忙,导致总线出错,检测不到IIC从机。


IIC工作参数配置

void I2C1_Configuration(void)

{

    I2C_InitTypeDef I2C_InitStructure;

    NVIC_InitTypeDef NVIC_InitStructure;


    I2C_DeInit(I2C1);

    I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

    I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

    I2C_InitStructure.I2C_OwnAddress1 = I2C1_Slave_Address; //从机地址,一定要设置正确                          

    I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

    I2C_InitStructure.I2C_AcknowledgedAddress= I2C_AcknowledgedAddress_7bit;

    I2C_InitStructure.I2C_ClockSpeed = 100000;

    I2C_Init(I2C1, &I2C_InitStructure);



    NVIC_InitStructure.NVIC_IRQChannel                   = I2C1_EV_IRQn;//事件中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority        = 0;

    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    NVIC_InitStructure.NVIC_IRQChannel = I2C1_ER_IRQn;//错误中断

    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                 

    NVIC_InitStructure.NVIC_IRQChannelCmd                = ENABLE;

    NVIC_Init(&NVIC_InitStructure);


    I2C_ITConfig(I2C1, I2C_IT_BUF | I2C_IT_EVT |I2C_IT_ERR, ENABLE);   

    I2C_Cmd(I2C1, ENABLE);                                             

}


IIC初始化函数

void I2C1_Init(void)

{


    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    I2C1_GPIO_Configuration();

    I2C1_Configuration();

}


IIC从机中断中接收和发送数据

 这里写图片描述 

从机中断函数中发送的流程:EV1—>EV3-1—>EV3—>EV3-2。

这里写图片描述 

 

从机中断函数中接收的流程:EV1—>EV2—>EV4。 

详细的中断处理程序如下:


void I2C1_EV_IRQHandler(void)

{


  __IO uint32_t SR1Register =0;

  __IO uint32_t SR2Register =0;


  SR1Register = I2C1->SR1;

  SR2Register = I2C1->SR2;


    /* I2C1是从机(MSL = 0) */

  if((SR2Register &0x0001) != 0x0001)

  {

    /* 主机已发送地址,地址为被置位·(ADDR = 1: EV1(包括发送和接收)) */

    if((SR1Register & 0x0002) == 0x0002)

    {

        /* 清除标志位 */

        SR1Register = 0;

        SR2Register = 0;


        Rx_Idx_IIC1=0;

        Tx_Idx_IIC1=0;

    }




    /* 接收数据(RXNE = 1: EV2) */

    if((SR1Register & 0x0040) == 0x0040)

    {

        Buffer_Rx_IIC1[Rx_Idx_IIC1++] = I2C1->DR;

        SR1Register = 0;

        SR2Register = 0;

    }

    /* 检测到停止条件(STOPF =1: EV4) */

    if(( SR1Register & 0x0010) == 0x0010)

    {

        I2C1->CR1 |= 0x0001;

        SR1Register = 0;

        SR2Register = 0;

        Flag_RcvOK_IIC1 = 1;            

    }





    /* 发送数据(TxE = 1: EV3、EV3-1) */

    if((SR1Register & 0x0080) == 0x0080)

    {

        I2C1->DR = Response_Message[Tx_Idx_IIC1++]; 

        SR1Register = 0;

        SR2Register = 0;

    }

    /* 检测到非应答(AF =1: EV3-2) */

    if(( SR1Register & 0x0400) == 0x0400)

    {

        I2C1->SR1 &= 0xFDFF;

        SR1Register = 0;

        SR2Register = 0;        

    }       

  }


}

  上述中断程序中,当主机读取和写入数据时,都会引起地址位被置位,即发生EV1事件(即本中断处理程序中将发送和接收的EV1合并了); 

  当主机写入数据时,中断的执行顺序是EV1—>EV2—>EV4,其中有多个数据EV2会多次执行; 

  当主机读取数据时,中断的执行顺序是EV1—>EV3—>EV3-2,本中断程序中将EV3和EV3-1合并了,若有多个数据,EV3将多次执行。 

错误中断处理函数如下:


void I2C1_ER_IRQHandler(void) {


  __IO uint32_t SR1Register =0;

  __IO uint32_t SR2Register =0;

  SR1Register = I2C1->SR1;

  SR2Register = I2C1->SR2;


    if(I2C_GetITStatus(I2C1,        I2C_IT_SMBALERT)) {

    }

    else if(I2C_GetITStatus(I2C1, I2C_IT_TIMEOUT)) {

    } 

    else if(I2C_GetITStatus(I2C1, I2C_IT_PECERR)) {

    } 

    else if(I2C_GetITStatus(I2C1, I2C_IT_OVR)) {


    }

    else if(I2C_GetITStatus(I2C1, I2C_IT_AF)) {


        I2C_ClearITPendingBit(I2C1, I2C_IT_AF);

    }

    else if(I2C_GetITStatus(I2C1, I2C_IT_ARLO)) {


    }

    else if(I2C_GetITStatus(I2C1, I2C_IT_BERR)) {


    }

        I2C1->CR1 |= 0x0001;

        SR1Register = 0;

        SR2Register = 0;    

}


发送各种错误进行错误中断不做对应的处理,最后只进行清除寄存器(SR1和SR2)操作。



关键字:STM3  硬件IIC  从机通信 引用地址:STM32——硬件IIC从机通信

上一篇:【stm32f407】硬件介绍
下一篇:STM32——硬件IIC主机通信

推荐阅读最新更新时间:2024-03-16 16:23

STM32读写TXT文件(可追加数据)的示例代码
/* 说明: * 下面的函数是测试在已有的 大海.txt 文件下继续添加数据 * 测试条件在TF卡中建立 大海.txt 文件,并在文件中添加内容,测试过程中可以分别添加 512数据,=512数据, 512数据进行分别测试 * 作者:Flame * 测试时间:20130711 */ unsigned int FATFSNumSize;//文件大小存储变量,为了查看方便放到函数外部 void OutPutFile(void) { unsigned int a; FILINFO finfo; DIR dirs; char path ={ }; //目录名为空,表示是根目
[单片机]
梳理STM32F429之通信传输部分---NO.2 硬件IIC
一、STM32 的 I2C 特性及架构: 只要遵守协议,就是标准的通讯,不管如何实现它,不管是 ST 生产的控制器还是 ATMEL 生产的存储器, 都能按通讯标准交互。 由于直接控制 GPIO 引脚电平产生通讯时序时,需要由 CPU 控制每个时刻的引脚状态,所以称之为“软件模拟协议”方式。 相对地,还有“硬件协议”方式, STM32 的 I2C 片上外设专门负责实现 I2C 通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来, CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理 I2C协议的方式减轻了 CPU 的工作,且使软件设计更加简单。 1、STM32
[单片机]
梳理STM32F429之<font color='red'>通信</font>传输部分---NO.2 <font color='red'>硬件</font><font color='red'>IIC</font>
STM32-不同芯片的移植
在实际项目中,我们根据项目需求选用最合适的芯片型号,有时会涉及到一个工程代码在不同芯片上的使用,不同型号的芯片如何移植呢?通过本文,您将了解基本的移植过程。 1.准备工作 1.1 根据芯片的命名规则确定要移植的型号的flash大小 其中用到的是芯片类型的flash的大小,比如STM32F103VBT6,表示flash大小的位为“B”,对应的是128k字节,由此可以该型号的flash大小。 1.2 根据flash大小选择合适的启动文件 ST官方提供了3个启动文件,分别适用于不同flash容量的STM32芯片,跟别为: startup_stm32f10x_ld.s 适用于小容量 产品 startu
[单片机]
STM32-不同芯片的移植
STM32自学笔记(1.什么是STM32)
STM32微控制器的核心: Cortex-M3处理器。 嵌套中断向量控制器(NVIC)是Cortex-M3处理器中一个比较关键的组件。提供了标准的中断架构和优秀的中断响应能力,为超过240个终端源提供专门的中断入口,并可以赋予每个中断源单独的优先级。 Cortex-M3的CPU支持两种运行模式: 线程模式和处理模式(都拥有自己独立的堆栈)。 Cortex-M3还包括一个24位的可自动重装载定时器,可以为实现内核(RTOS)提供一个周期性中断。 Cortex-M3支持新型的ARM Thumb-2指令集。 STM32具有精密性、可靠性和安全性 可靠性 有两个看门狗定时器。 第一个叫窗口看门狗,窗口看门狗必
[单片机]
STM32综合网上讲解的几种读保护措施
以下内容是在STM32F103系列单片机实验成功! STM32可以对存储在flash上的程序进行读保护. 启动读保护后,用户就不能再读写程序了. 所以,在烧写程序之前,需要程序调用关闭读保护.关闭读保护后,会自动清空flash上的程序 头文件位于:#include stm32f10x_flash.h 启动保护,用在main()函数初始化时调用: void Set_Protect(void) //启动保护 {   if(FLASH_GetReadOutProtectionStatus() != SET)   {     FLASH_Unlock(); //解锁     FLASH_ReadOutProtection(ENABLE
[单片机]
STM32综合网上讲解的几种读保护措施
STM32硬件IIC
1 /** 2 * @brief 写一个字节到I2C设备中 3 * @param 4 * @arg pBuffer:缓冲区指针 5 * @arg WriteAddr:写地址 6 * @retval 正常返回1,异常返回0 7 */ 8 uint8_t I2C_ByteWrite(u8 pBuffer, u8 WriteAddr) 9 { 10 /* Send STRAT condition */ 11 I2C_GenerateSTART(macI2Cx, ENABLE); 12 13 I2CTimeout = I2CT_FLAG_TIMEOUT; 14 15 16 /*
[单片机]
STM32——硬件IIC通信
前言:   根据网上的资料,大部分网友表示STM32自带的硬件IIC存在bug,读写时很容易卡死。自己在调试的时候也出现卡死的情况,最后一点一点调试,也还是调通了。本文将记录自己调试STM32硬件IIC从机的一些心得体会。硬件IIC主机通信见另一篇文章:传送门 。 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 硬件IIC从机初始化 下面看下STM32中IIC的相应设置。 首先是IIC的管脚配置。 /*---------IIC1---------------*/ uint8_t Buffer_Rx_IIC1 ;//接收缓存 uint8_t Rx_Idx_IIC1=0;//接收计数 ui
[单片机]
STM32——<font color='red'>硬件</font><font color='red'>IIC</font><font color='red'>从</font><font color='red'>机</font><font color='red'>通信</font>
总结stm8硬件IIC主模式的寄存器设置及调试心得
一、开发环境 开发软件:STVD 芯片型号:stm8s103 硬件接口:I2C(主模式) 二、寄存器主要用到的功能(按用户手册的顺序) 1. I2C_CR1(控制寄存器1): (1)bit0:控制I2C模块的启动/禁用。此功能主要用于I2C总线初始化的时候,配置TRISER相关寄存器功能的时候必须先禁用I2C模块才可以进行写操作。 2. I2C_CR2(控制寄存器2) (1)bit7:设置1实现软复位I2C模块。当I2C总线始终处于繁忙状态的时候通过复位实现恢复。 (2)bit3:设置ACK应答的位置。在I2C总线初始化的时候配置,通常是作清零操作,用于表示ACK位控制被移位寄存器正在接收的这个
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved