历史上的今天
返回首页

历史上的今天

今天是:2024年11月28日(星期四)

正在发生

2019年11月28日 | STM32设置为I2C从机

2019-11-28 来源:eefocus

硬件平台: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();    

    }

}


到这里就大功告成了。

推荐阅读

史海拾趣

Ceramics公司的发展小趣事

“跨界陶瓷”公司凭借其前瞻性的战略眼光,积极探索与其他行业的跨界合作。该公司与多家科研机构和高新技术企业建立了战略合作关系,共同研发新型陶瓷电子材料和技术。通过跨界合作,跨界陶瓷成功将陶瓷材料应用于新能源汽车、智能家居等新兴领域,为公司开辟了新的发展空间和市场机会。

这些故事虽然基于虚构,但反映了电子行业中Ceramics公司可能面临的机遇和挑战,以及他们如何通过技术创新、环保理念、国际化战略、品质管理和跨界合作等方式实现发展的普遍现象。当然,实际情况中每家公司的具体发展历程和策略都会有所不同,需要根据具体情况进行分析和评估。

Fujitsu America公司的发展小趣事

在计算机技术发展的早期阶段,Fujitsu就展现出了强大的研发实力。1954年,Fujitsu成功研制出日本第一台电脑FACOM 100,这一里程碑式的成就不仅标志着Fujitsu在计算机领域的正式起步,也为其后续在ICT领域的发展奠定了坚实基础。Fujitsu America作为Fujitsu在全球的重要分支机构,积极将这一创新成果引入北美市场,推动了当地计算机技术的普及和应用。

EIC [EIC discrete Semiconductors]公司的发展小趣事

EIC公司自创立之初,就致力于离散半导体技术的研发与创新。在成立初期,公司面临了技术瓶颈和市场接受度的双重挑战。然而,EIC的研发团队通过不懈努力,成功研发出了一款高性能、低功耗的离散半导体产品,这一技术突破不仅为公司赢得了市场认可,也为后续的产品线扩展奠定了坚实的基础。随着技术的不断进步和产品线的不断丰富,EIC逐渐在电子行业中树立起了自己的品牌形象。

Crystal Clear Technology公司的发展小趣事

Crystal Clear Technology自创立之初,便专注于研发新型显示技术。面对市场上日益增长的高清显示需求,公司投入大量资源进行技术研发,成功推出了一款具有高清晰度和广视角的显示屏产品。这一创新产品迅速获得市场认可,为Crystal Clear Technology打开了新的销售渠道,并奠定了公司在行业内的技术领先地位。

德艺隆(DEALON)公司的发展小趣事

随着环保意识的日益增强,德艺隆积极响应国家环保政策,将绿色环保理念融入产品设计和生产过程中。他们研发出了一系列绿色产品,如环保型连接器、节能型插座等,不仅满足了客户的需求,也为保护环境做出了贡献。同时,公司还加强了废弃物的管理和回收,减少了环境污染,树立了良好的环保形象。

Brainboxes公司的发展小趣事

多年来,Brainboxes一直致力于技术创新和研发投入。公司拥有一支高素质的软件和硬件工程师团队,他们在产品设计和制造方面具有丰富的经验。凭借先进的设计和制造技术,Brainboxes在业界赢得了多项荣誉,如英国制造联合会颁布的“2007年度最佳企业”奖和欧洲电子工业奖的“2005年度制造商”。这些荣誉不仅证明了公司的技术实力,也提升了其在全球电子行业中的影响力。

问答坊 | AI 解惑

单片机控制开关电源的程序!

单片机怎么控制开关电源啊…

查看全部问答>

广告灯

4. 广告灯的左移右移 1. 实验任务 做单一灯的左移右移,硬件电路如图4.4.1所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。 ...…

查看全部问答>

基于CP2102的USB接口设计

基于CP2102的USB接口设计…

查看全部问答>

求protel2004的单片机的PCB封装库

哪位仁兄有单片机的封装库啊?万分感激!!!!…

查看全部问答>

听说这的牛人很多~特来求救!!!!!!!!!!!!

就是关于用vhdl做的一个数字密码锁。。具体要求如下: 1.4位密码十进制数(0-9) 2.密码设置键 开锁键 清屏键 3.显示:4位密码led(开锁时可见。密码设置为x),锁状态1红(lock)1绿(open)密码错误1红(闪烁) 4.密码错误,报警(声音) 5. ...…

查看全部问答>

【已解决】TIM4的Remap死活不干活,请求协助!!!

    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    GPIO_InitStructure.GPIO_Speed =&n ...…

查看全部问答>

UM0721(USBOTGFSlibrary)提供的源码有问题?

UM0721文档里说,打开Project\\RVMDK\\下的keil工程后是这样: 下载 (10.29 KB) 2010-7-8 21:03 下载的um0721.zip解压缩后的确也有这些文件,但是用Keil4那个Uv2工程文件打开却是这样的: 下载 (2.53 ...…

查看全部问答>

怀疑买到的STM32F103VET6是翻新货

最近在淘宝上买到了几片STM32F103VET6的片子,焊在板子上后发现PD8脚作为GPIO的上拉输入无效,读取电平总是高电平,换了另一片后任然是这个问题,换上STM32F103VCT6是没问题的,然后怀疑是这批片子是翻新的,它的外观也和以前买到的ST的ARM不 ...…

查看全部问答>

【课后练习】LaunchPad课后练习四之LCD1602

1.      简单介绍下1602 1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行 ...…

查看全部问答>