STM32设置为I2C从机

发布者:独行侠客最新更新时间:2019-08-09 来源: eefocus关键字:STM32  I2C  从机 手机看文章 扫描二维码
随时随地手机看文章

硬件平台:STM32F401 

编辑器 : keil 5.18 

操作系统:win7


一、I2C协议 

在传输数据的时候,SDA线必须在时钟的高电平周期保持稳定,SDA的高或低电平状态只有在SCL 线的时钟信号是低电平时才能改变 。


起始和停止条件 

  SCL 线是高电平时,SDA 线从高电平向低电平切换,这个情况表示起始条件; 

  SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。


寻址方式(7/10位地址方式)


  第一个字节的头7 位组成了从机地址,最低位(LSB)是第8 位,它决定了传输的 普通的和带重复开始条件的7位地址格式方向。第一个字节的最低位是“0”,表示主机会写信息到被选中的从机;“1”表示主机会向从机读信息。当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较,如果一样,器件会判定它被主机寻址,至于是从机接收器还是从机发送器,都由R/W 位决定。


二、I2C从机模式 

1、设置i2c从地址


I2C_HandleTypeDef I2cHandle;


I2cHandle.Instance             = I2C1;

I2cHandle.Init.AddressingMode  = I2C_ADDRESSINGMODE_7BIT;

I2cHandle.Init.ClockSpeed      = 400000;

I2cHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

I2cHandle.Init.DutyCycle       = I2C_DUTYCYCLE_16_9;

I2cHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

I2cHandle.Init.NoStretchMode   = I2C_NOSTRETCH_DISABLE;

I2cHandle.Init.OwnAddress1     = I2C_ADDRESS;

I2cHandle.Init.OwnAddress2     = 0xFE;   


其中如前面介绍,I2C有两种地址方式,在这里I2C_ADDRESSINGMODE_7BIT是将I2C设置为7为从机地址模式。OwnAddress1为本设备I2C地址即我们自己设置的从机地址,OwnAddress2不需要设置。

1

2、I2C引脚与中断初始化


void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)

{  

    GPIO_InitTypeDef  GPIO_InitStruct;


    /* Enable GPIO TX/RX clock */

    I2Cx_SCL_GPIO_CLK_ENABLE();

    I2Cx_SDA_GPIO_CLK_ENABLE();

    /* Enable I2C1 clock */

    I2Cx_CLK_ENABLE(); 


    /*  Configure peripheral GPIO  */  

    /* I2C TX GPIO pin configuration  */

    GPIO_InitStruct.Pin        = I2Cx_SCL_PIN;

    GPIO_InitStruct.Mode       = GPIO_MODE_AF_OD;

    GPIO_InitStruct.Pull       = GPIO_PULLUP;

    GPIO_InitStruct.Speed      = GPIO_SPEED_FAST;

    GPIO_InitStruct.Alternate  = I2Cx_SCL_AF;


    HAL_GPIO_Init(I2Cx_SCL_GPIO_PORT, &GPIO_InitStruct);


    /* I2C RX GPIO pin configuration  */

    GPIO_InitStruct.Pin       = I2Cx_SDA_PIN;

    GPIO_InitStruct.Alternate = I2Cx_SDA_AF;


    HAL_GPIO_Init(I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct);


    /* Configure the NVIC for I2C */   

    /* NVIC for I2C1 */

    HAL_NVIC_SetPriority(I2Cx_ER_IRQn, 0, 2);

    HAL_NVIC_EnableIRQ(I2Cx_ER_IRQn);

    HAL_NVIC_SetPriority(I2Cx_EV_IRQn, 0, 1);

    HAL_NVIC_EnableIRQ(I2Cx_EV_IRQn);

}


三、从发送


uint8_t aTxBuffer[] = "....hello world....";


while (1)

    if(HAL_I2C_Slave_Transmit_IT(&I2cHandle, (uint8_t*)aTxBuffer, TXBUFFERSIZE+1)!= HAL_OK)

    {

        /* Transfer error in transmission process */

        Error_Handler();    

    }

    HAL_Delay(100);


    while (HAL_I2C_GetState(&I2cHandle) != HAL_I2C_STATE_READY)

    {

        Error_Handler();    

    }

}


到这里就大功告成了。

关键字:STM32  I2C  从机 引用地址:STM32设置为I2C从机

上一篇:STM32F103单片机IIC从机模式调试记录
下一篇:STM32——硬件IIC从机通信

推荐阅读最新更新时间:2024-11-06 14:09

STM32+ULN2003驱动步进电机
选用的步进电机的型号为28BYJ-48(或MP28GA,5V,转速比1/64),驱动电路选用uln2003芯片的驱动板,其控制时序图如下: 四相八拍:A- AB- B - BC - C - CD - D - DA 其A、B、C、D指的是uln2003芯片驱动板的1N1、1N2、1N3、1N4,波形在上表示有输入信号。 此外至少需要4根杜邦线,还需提供一个5V的直流电源,接线方式如下: PE0接IN1 PE1接IN2 PE2接IN3 PE3接IN4 5V电源(一个是地,一个是正)。 /*******************************************************
[单片机]
基于STM32单片和51单片的人体健康监测仪设计方案
近年来,随着生活节奏加快,工作压力加大,不健康的作息等原因,导致猝死的事件频发,心率情况是身体状态的直接表现,所以做好心率监测可以大大避免一些突发情况的发生。整理了电路城上8个心率监测的电路方案,工程师们不妨动动手,给自己一份健康监测,当然电路城上也还有很多心率监测相关的设计,可以进一步探索。 1、基于STM32单片机的人体健康监测仪设计-蓝牙-心率-ADXL345电路设计方案(原理图+源码) 本设计由STM32F103C8T6单片机核心板电路+蓝牙模块电路+DS18B20温度传感器电路+心率检测传感器电路+0.96寸OLED屏显示电路+ADXL345加速度传感器电路+按键电路+蜂鸣器报警电路组成。 1、开机后,OLE
[单片机]
基于<font color='red'>STM32</font>单片<font color='red'>机</font>和51单片<font color='red'>机</font>的人体健康监测仪设计方案
简析STM32的启动过程
  当前的嵌入式应用程序开发过程里,C语言已成为了绝大部分场合的最佳选择。如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main函数开始执行。但一个经常会被忽略的问题是:微控制器(单片机)上电后,是如何寻找到并执行main函数的呢?很显然微控制器无法从硬件上定位main函数的入口地址,因为使用C语言作为开发语言后,变量/函数的地址便由编译器在编译时自行分配,这样一来main函数的入口地址在微控制器的内部存储空间中不再是绝对不变的。相信读者都可以回答这个问题,答案也许大同小异,但肯定都有个关键词,叫“启动文件”,用英文单词来描述是“Bootloader”。   无论性能高下,结构简繁,价格贵贱,每一种微控制器(
[单片机]
基于STM32和CAN总线的电动车电池管理系统设计
随着电池能源的广泛应用,石油资源的枯竭和环境污染,电动汽车以其节能环保的优势引起越来越多的重视,在电动汽车的研究和发展上,车载电池及其管理系统的研究与制造占据着重要位置。电动汽车动力电池在应用中的主要问题表现在:生产过程中,电池的工艺,技术以及成组技术还不能保证其初始性能具有良好的一致性;使用过程中,对过充电、过放电、过温度、过电流等非常敏感,这类情况的发生会明显缩短电池寿命,甚至会导致电池报废。电池组是几十个甚至上百个单体电池串联,单体电池之间存在不一致性,随着连续的充放电循环,电池间的不一致性加剧,电池组的可用容量受容量最小的单体电池制约。对于这些情况,电池的初始性能必须要依靠企业生产工艺的优化,生产过程关键参数的控制来改善,
[电源管理]
基于<font color='red'>STM32</font>和CAN总线的电动车电池管理系统设计
再造STM32---第二十一部分:串行FLASH文件系统 FatFs
21.1 文件系统简介: 使用SPI FLASH直接存储数据: 当需要记录字符“STM32-F429 SPI FLASH” 时。 可以把这些文字转化成ASCII码,存储在数组中,然后调用SPI_FLASH_BufferWrite函数,把数组内容写入到SPI Flash芯片的指定地址上,在需要的时候从该地址把数据读取出来,再对读出来的数据以ASCII码的格式进行解读。 • 难以记录有效数据的位置 • 难以确定存储介质的剩余空间 • 不明确应以何种格式来解读数据 Windows上的文件系统: 文件系统,就是对数据进行管理的方式。使用文件系统可有效地管理存储介质。 文件系统在计算机中的表现形式: 磁盘的物理结构:
[单片机]
再造STM32---第二十一部分:串行FLASH文件系统 FatFs
STM32 进阶教程 5 - 内联函数
前言 在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支。另外还需要特别注意的是对递归函数的内联扩展可能引起部分编译器的无穷编译。 内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的
[单片机]
<font color='red'>STM32</font> 进阶教程 5 - 内联函数
STM32 USB设备电路设计
当STM32F105配置为USB设备时, PA9/OTG_FS_VBUS是用来检测presense USB主机的。意法半导体设计评估显示PA9/OTG_FS_VBUS引脚通过一个零欧姆电阻连接到5 VBUS 。有这种方法有两个潜在的问题。该第一电势的问题是, PA9/OTG_FS_VBUS输入,虽然它是5V容限,可能损坏(如每ST支持)如果连接到5V时的STM32F105 VDD为0V。这可能发生在两个自供电和主机供电的应用。当电源关闭/拔出,而USB连接到主机仍处于活动状态,这将发生在一个自供电的应用。这将发生在一个主机供电应用过程中所花费的VDD稳压器来达到它的稳压输出电压所需的时间。一些设计师建议之间的PA9/OTG_FS_
[单片机]
<font color='red'>STM32</font> USB设备电路设计
STM32定时器溢出的工作原理是什么?
从来没有一个外设能够这么骚~那说的就是定时器了,或者说没有了定时器的MCU就不完整。 只能说没有定时器的单片机不值得被爱 OKOK,不骚了,这篇文章就是回答几个在我研究过程中比较疑惑的问题。 所以是可以确定一点的就是,如果你想让你的定时器非常精确,那你一定要有一个很稳的时基,这里就是时钟树。 痛苦的回忆来了,具体要查你的定时器在哪里挂着 还想骂的一点是,不知道为什么定时器还排起了辈分按说是从简单到难,但是ARM构架似乎是一把梭哈。 事实上大多数文章都是拿这个图说事情的,我也不能免俗 这个可编程定时器的主要部分是一个带有自动重装载的16位累加计数器,计数器的时钟通过一个预分频器得到。 软件可以读写计数器、自动重装
[单片机]
<font color='red'>STM32</font>定时器溢出的工作原理是什么?
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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