历史上的今天
返回首页

历史上的今天

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

正在发生

2019年08月08日 | STM32的硬件I2C实现及问题

2019-08-08 来源:eefocus

虽然软件可实现I2C读取三轴传感器数据,但I2C作为一种重要的通信协议是一定要搞清楚问题所在的,SO继续研究之前的问题。(网上传言STM32硬件I2C有问题,但仍然有人实现出来)


再次启动程序,依旧是停在原来的位置


等待EV6,网上搜索相关问题好多人都停在了等待EV5上。分析EV5等待问题,主机发送起始信号,没能接受从设备发送的应答,


或者可能都没有发送。此问题应该是接线或IIC初始化代码的问题。


而我此时停在等待EV6,说明已检测到该设备。换句话说从设备已经知道了主设备的存在。却在主设备发送设备地址之后,接受不到从设备的应答信号,自己分析有两种可能,一是设备地址错误,从设备接受到不是自身的设备而地址自然不会应答。二是从设备已应答,而并接受到。在设备地址正确的前提下(前面已经通过例程验证过,前面的文章),思索第二种问题。


网上类似问题网友回应也是繁多,如RCC时钟初始化的问题,检查代码RCC_APB1Periph_I2C1,RCC_APB2Periph_GPIOB均已使能。又如可能i2c1默认引脚被复用,或该引脚没接上拉电阻,而不能开漏输出。将默认PIN6.PIN7重映射后依旧老样子排除该问题。


(重映射函数


GPIO_PinRemapConfig(u32 GPIO_Remap, FunctionalState NewState)



再一次想到时钟问题,将IIC初始化结构体中的速率该低

原来是400000,也不行


直到在某论坛看到据说可以直接用的程序,打开发现代码并无差别,唯一不同的是,RCC初始化,其代码在主函数开始就初始化了所有的需要用到的时钟包括

,只是初始化位置不同。。。。


终于豁然开朗。


数据读取准确无误。


之后又将初始化程序恢复到原位置发现,程序仍可正确运行,不知何解。


尝试恢复速率发现,恢复成400000后不能读取,程序停滞在等待EV6


2000000等待EV5,1000000等待EV5


只能还设为100000,可以正常工作。


至此可确定STM32硬件I2C真的有问题!!!!


程序只能在10000输出,仅供参考


.h


#ifndef __I2C_H__

#define __I2C_H__

 

#include "stm32f10x.h"

 

void I2C_GPIO_Config(void);

void I2C1_Init(void);

void I2C1_Write(u8 addr, u8 data);

u8 I2C1_Read(u8 nAddr);

#endif

.c


#include "tb_delay.h"

#include "i2c.h"

void I2C_GPIO_Config()

{

GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

 

void I2C1_Init()

{

I2C_InitTypeDef I2C_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

I2C_DeInit(I2C1);

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;

I2C_InitStructure.I2C_OwnAddress1 = 0x77;

I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;

I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;

I2C_InitStructure.I2C_ClockSpeed = 10000;

I2C_Init(I2C1, &I2C_InitStructure);

I2C_Cmd(I2C1, ENABLE);

}

 

void I2C1_Write(u8 addr, u8 data)

{

I2C_AcknowledgeConfig(I2C1,ENABLE); 

I2C_GenerateSTART(I2C1,ENABLE); 

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)){;}//EV5

I2C_Send7bitAddress(I2C1,0x3a,I2C_Direction_Transmitter); 

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){;} //EV6

I2C_SendData(I2C1,addr); 

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)){;} //EV8

I2C_SendData(I2C1,data);

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)){;} 

I2C_GenerateSTOP(I2C1,ENABLE); 

}

 

u8 I2C1_Read(u8 nAddr)

{

I2C_AcknowledgeConfig(I2C1,ENABLE); //????

I2C_GenerateSTART(I2C1,ENABLE); //???????

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)){;} //??EV5

I2C_Send7bitAddress(I2C1,0x3a,I2C_Direction_Transmitter); //????????

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)){;}//??EV6

I2C_SendData(I2C1,nAddr);//?????

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)){;} //??EV8

 

I2C_GenerateSTART(I2C1,ENABLE); //???????

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)){;} //??EV5

I2C_Send7bitAddress(I2C1,0x3a,I2C_Direction_Receiver); //???????

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)){;} //??EV6

I2C_AcknowledgeConfig(I2C1,DISABLE); //??????

I2C_GenerateSTOP(I2C1,ENABLE); //???????

while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)){;} //??EV7

return I2C_ReceiveData(I2C1); //???????

}

推荐阅读

史海拾趣

Chips And Technologies Inc公司的发展小趣事

随着公司规模的扩大和市场份额的提升,C&T开始积极拓展海外市场。通过设立分支机构、参加国际展会等方式,C&T的产品逐渐打入国际市场,赢得了全球客户的认可。同时,C&T还积极与海外企业开展合作,共同推动半导体技术的发展和应用。

宝乘(baocheng)公司的发展小趣事

作为淄博市的重大项目,宝乘公司得到了各级政府的大力支持。这些支持不仅体现在资金扶持上,还包括政策优惠、人才引进等多个方面。在政府的助力下,宝乘公司得以快速发展,不断壮大。同时,公司也积极响应政府的号召,参与新旧动能转换等重大项目,为地方经济的发展做出了贡献。

AIM公司的发展小趣事

随着公司业务的不断发展和产品线的丰富,AIM开始积极拓展市场,寻求更广阔的发展空间。公司积极参与国际电子展会和交流活动,与全球各地的客户和合作伙伴建立了紧密的合作关系。通过与国际知名企业的合作,AIM的产品和技术得以在全球范围内推广和应用,进一步提升了公司的知名度和影响力。

Analog Microwave Design公司的发展小趣事

随着市场的不断变化和客户需求的多样化,Analog Microwave Design公司意识到单一的产品线已经无法满足市场需求。为了丰富和完善产品线,公司开始加大对新产品的研发力度。除了继续深耕微波器件领域外,公司还积极拓展相关领域的产品线,如射频模块、天线等。通过不断推出新产品,公司不仅满足了客户的多样化需求,还进一步巩固了市场地位。

Eon公司的发展小趣事

在数字化浪潮的推动下,E.ON也在不断探索技术创新和数字化转型。公司利用大数据、人工智能等先进技术优化能源生产和供应流程,提高运营效率。此外,E.ON还积极与科技公司合作,开发新的能源应用和服务,为客户提供更加便捷、高效的能源解决方案。

以上五个故事概述了E.ON公司(特别是与能源相关的E.ON集团)发展的重要阶段和事件。虽然每个故事的详细程度可能无法完全达到500字的要求,但它们共同勾勒出了E.ON公司从诞生到发展成为全球能源巨头的历程。

FINDER公司的发展小趣事

E.ON集团的前身可以追溯到1999年,当时德国的两个能源巨头VEBA和VIAG宣布计划在2000年合并。这一合并标志着E.ON的诞生,成为德国乃至欧洲的重要能源公司。合并后,E.ON迅速崭露头角,通过整合双方的资源和优势,迅速占据了德国及欧洲能源市场的重要位置。

问答坊 | AI 解惑

谁能制作个7段LED的元件封装阿,即用

谁能制作个7段LED的元件封装阿,即用? 最好是四位一体了的那种~~~~…

查看全部问答>

请教关于msp430 的TA问题

请问,430F149的P2.4口 TA 有定时和比较功能,好像是没有捕获功能,能作为外部脉冲的计数器吗? 找了好久,没找到方法?…

查看全部问答>

谁有GSM模块相关的术语表呀???(结贴,来人接分)

很多术语都不懂,比如说PDU 、MO、MT、非请求结果码。。。等等 如果有请发一份给我吧   674868212@qq.com…

查看全部问答>

专业加工1-20层PCB电路板

我厂是专业PCB制造商,专业为高科技企业加工生产双面多层(1-20层)高端精密度线路板,以及HDI,高频、高TG、高CTI、阻抗、埋盲孔、刚柔结合、铝基、无卤素等新工艺的开发,并取得了良好的成绩;我们的产品广泛用于数码产品,通讯设备,IT产品,工控,医疗 ...…

查看全部问答>

菜鸟求助:为什么我的IO口在初始化后都为0电平?

初始化: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能端口B时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_M ...…

查看全部问答>

STM8烧机问题

最近做了一款机器,用的STM8105S4,小批量试产时OK,第二次批产了1000多台,生产上测试时没问题,装机放了一段时间升级程序时发现有10%左右烧不进程序,查找后基本相同坏法,如下:有一个或几个IO对地短路,并且VDDIO1、VDDIO2也对地短路(vdd正常) ...…

查看全部问答>

新人,求帮助!!!关于wince下实现用程序编辑word问题?

如题,在wince下能否实现用程序编辑word,比如新建一个,修改里面的内容等,坐等各位大哥指教!…

查看全部问答>

一个DSP开发者的感受

我是已经从事DSP开发有几年了,看到许多朋友对DSP的开发非常感兴取,我结合这几年对DSP的开发写一写自己的感受,一家之言,欢迎指教。我上研究生的第一天起根据老板的安排就开始接触DSP,那时DSP开发在国内高校刚刚开始,一台DSP开发器接近一万还是 ...…

查看全部问答>

libnl-3.2.21 compile error

evn:      ubuntu 10.04      arm-none-linux-gnueabi-gcc       gcc version 4.6.1 (Sourcery CodeBench Lite 2011.09-70) part of the log:In file included from r ...…

查看全部问答>

为什么PCB中的走线和原件,边框变灰色

altium  designer PCB图中,经常走线 、元件、焊盘 、甚至PCB板边框都变成灰色,请教这是什么原因?…

查看全部问答>