历史上的今天
返回首页

历史上的今天

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

正在发生

2019年08月16日 | 14-HAL库之I2C通信

2019-08-16 来源:eefocus

1.I2C协议介绍


I2C是一个支持多设备的总线,可连接多个I2C通讯设备,每个总线包括一条双向串行数据线(SDA)和一条串行时钟线(SCL)。数据线用来表示数据,时钟线用来数据收发同步。通讯过程如下:


S:主机的I2C接口产生的传输开始信号,连接在I2C总线上的所有从机都会接收到。


SLAVE_ADDRESS:主机广播的从机地址信号,I2C总线上每个从机地址唯一。


R/W:读写方向,置1为读,置0为写。


A/A-:从机接收到匹配的地址后,主机或从机会返回一个应答信号或非应答信号,只有接收到应答信号主机才继续发送接收数据。写数据的时候,每次发送一个字节数据(DATA:8位)后,都要等待应答信号,重复这个过程可以发送N个数据。数据传输结束发送停止传输信号P。读数据时,主机向从机发应答信号,当主机希望停止接收数据时,发送非应答信号。

起始信号和停止信号见上图。


数据有效性见上图。


2.基于HAL库的I2C配置


步骤:时钟使能—GPIO管脚配置—I2C配置


初始化:


void MyI2C_Init(void){

__HAL_RCC_GPIOB_CLK_ENABLE();

GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = GPIO_PIN_6;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_MODE_AF_OD;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;

HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);

//I2C_SCL config

GPIO_InitStruct.Pin = GPIO_PIN_7;

  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

  GPIO_InitStruct.Pull = GPIO_MODE_AF_OD;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;

HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);

//I2C_SDA config

__HAL_RCC_I2C1_CLK_ENABLE();

  

  I2C_HandleTypeDef MyI2C1;

MyI2C1.Instance=I2C1;

MyI2C1.Init.Timing=0x60201E2B;//100KHz

MyI2C1.Init.OwnAddress1=0;

MyI2C1.Init.AddressingMode=I2C_ADDRESSINGMODE_7BIT;

MyI2C1.Init.DualAddressMode=I2C_DUALADDRESS_DISABLE;

MyI2C1.Init.OwnAddress2=0;

MyI2C1.Init.OwnAddress2Masks=I2C_OA2_NOMASK;

MyI2C1.Init.GeneralCallMode=I2C_GENERALCALL_DISABLE;

MyI2C1.Init.NoStretchMode=I2C_NOSTRETCH_DISABLE;

MyI2C1.Mode=HAL_I2C_MODE_MASTER;

HAL_I2C_Init(&MyI2C1);

}

输入输出函数:


阻塞模式:


HAL_I2C_Master_Transmit();   HAL_I2C_Master_Receive();  HAL_I2C_Slave_Transmit();  HAL_I2C_Slave_Receive()

HAL_I2C_Mem_Write();       HAL_I2C_Mem_Read();    HAL_I2C_IsDeviceReady()


带中断非阻塞模式:


HAL_I2C_Master_Transmit_IT();    HAL_I2C_Master_Receive_IT();  HAL_I2C_Slave_Transmit_IT()

HAL_I2C_Slave_Receive_IT();    HAL_I2C_Mem_Write_IT();       HAL_I2C_Mem_Read_IT()


DMA传输非阻塞模式:


HAL_I2C_Master_Transmit_DMA();   HAL_I2C_Master_Receive_DMA();   HAL_I2C_Slave_Transmit_DMA();    HAL_I2C_Slave_Receive_DMA();    HAL_I2C_Mem_Write_DMA();      HAL_I2C_Mem_Read_DMA()


非阻塞模式下的回调函数:


HAL_I2C_MemTxCpltCallback();   HAL_I2C_MemRxCpltCallback();    HAL_I2C_MasterTxCpltCallback()

HAL_I2C_MasterRxCpltCallback();  HAL_I2C_SlaveTxCpltCallback(); HAL_I2C_SlaveRxCpltCallback();   HAL_I2C_ErrorCallback()


这部分可以参照USART中的函数进行理解。



推荐阅读

史海拾趣

Conflux公司的发展小趣事

作为一家具有社会责任感的企业,Conflux始终关注社会公益事业。公司积极参与扶贫、教育等公益活动,为社会做出积极贡献。同时,Conflux还注重环保和可持续发展,通过采用环保材料和节能技术,降低生产过程中的环境污染。这些举措不仅提升了公司的社会形象,也赢得了社会各界的广泛赞誉。

以上五个故事是虚构的,但反映了一个科技公司可能经历的发展阶段和策略选择。在现实中,一个公司的成长和发展往往涉及更多复杂的因素和决策过程。希望这些故事能够为您提供一些启发和参考。

ELDECO公司的发展小趣事

面对全球电子记录仪市场的快速增长,ELDECO公司制定了国际化发展战略。公司首先在欧洲市场设立了研发中心和生产基地,通过与当地合作伙伴的紧密合作,成功将产品打入欧洲市场。随后,公司又在美国、亚洲等地设立了分支机构,进一步拓展全球市场。通过国际化战略布局,ELDECO公司不仅提高了品牌影响力,还获得了更多的市场机会和客户资源。

科达嘉CODACA公司的发展小趣事

科达嘉电子不仅立足于深圳,还积极布局全球市场。公司通过参加国际电子展会、与国际知名企业合作等方式,不断拓展海外市场。同时,科达嘉还根据客户需求,提供个性化的电感解决方案,赢得了众多客户的信任和合作。公司的主要产品,如一体成型电感、大电流电感等,已广泛应用于工业控制、汽车电子等多个领域。

BK Precision公司的发展小趣事

为了满足全球市场的需求,BK Precision开始实施全球化战略。公司不仅在美国本土设立了多个办事处和研发中心,还在欧洲和亚洲等地建立了分支机构。通过与国际授权分销商的合作,BK Precision成功地将产品推向全球市场,并赢得了众多国际客户的信赖。同时,公司还积极参与国际电子行业的展会和交流活动,提升品牌知名度和影响力。

苏州锋驰(Feng)公司的发展小趣事
确保电源稳定且输入电压在允许范围内。
Genisco Electronics公司的发展小趣事
根据负载的重要性和供电要求,合理设计互投电路,包括选择合适的切换方式(如先断后合、先合后断等)、设置合适的切换时间和延时等。

问答坊 | AI 解惑

大家谁在用示波器测量时候少过器件?

今天调试板子时发现一接上示波器,双路电压源就短路了,呵呵,很险………

查看全部问答>

LED驱动技术的进步表现在效率、大功率、高压技术上

近年来LED驱动由线性调整型(LDO)、电荷泵型向开关型转变,在效率、电流驱动能力方面有了长足进步,效率也大幅提高。随着半导体工艺的进步,特别是高压MOSFET和BCD技术的不断提高,一些外围功率开关管和二极管也被集成进了驱动芯片,使外围电路大大 ...…

查看全部问答>

有没有从事EMS开发的TX

有没有从事EMS开发的TX 一直找不到比较专业的论坛,建立了一个GROUP,大家有兴趣就看看吧。希望能一起讨论EMS或者SNMP开发的话题。 您收到此信息是由于您订阅了 Google 论坛“EMS网管开发”论坛。 要在此论坛发帖,请发电子邮件到 ems-nms@go ...…

查看全部问答>

Win9x_ME, Win2000_XP的驱动怎么在WinCE上面使用?

目前有个触摸显示器,我想用到我的板子上,s3c2440a+WinCE。但是此触摸显示器 的驱动支持WINNT,ME,9X,2000,Xp,就是不支持WINCE。 请问高手能否对现有的驱动进行改动后让它能够支持WINCE?如何改动? 还有我通过depends查看驱动内的dll文件, ...…

查看全部问答>

摄像头在固定位置有细条纹(LCD正常)

各位高手:     不好意思,摄像头问题又有变化,小弟愚钝,只能求救于大家了!         我的摄像头打开时,LCD显示器在固定的几处出现较为明显的细条纹,或一条一处,或多条一处,颜色与周围的不连续,导致图像看 ...…

查看全部问答>

请教关于OEMaddressTable

请教大侠: 为了将nor flash从32M升级到64M,我修改了EBOOT中的flashWrite和flashErase 函数 并且修改了OEMaddressTable 其他都没修改 但是现在把boot烧写到FLASH中,不能从汇编进入到C文件中 以下是我以前的OEMAddressTable: OEMAddressTabl ...…

查看全部问答>

taskSpawn( )的详解

尤其是1st of 10 req\'d task args to pass to func ,就是最后输入参数的10个有什么作用,刚看了英语解释,不是很懂,谢谢…

查看全部问答>

单片机连接gprs模块(装有sim卡),想让手机给模块发短信,那么怎么样才能让单片机知道来了短信

单片机连接gprs模块(装有sim卡),想让手机给模块发短信,那么怎么样才能让单片机知道来了短信?并知道短信序号从而成功读取呢》? 我知道用at+cnmi可以设置短消息提示方式,但是如果是超级终端,短信来了,可以看见提示的是哪一条,从而可以立刻 ...…

查看全部问答>

windows7无法访问linux的samba服务器.问题

我用的是fedora10,配置samba是按着国嵌视频的方法配置的。我上网接的路由IP192.168.1.1,我的IP是192.168.1.100,我fedora设的是192.168.1.44。。虚拟机可以上网。win7上ping虚拟机linux可以通,但是linux ping win7可以ping的通,但进入死循环没 ...…

查看全部问答>