历史上的今天
返回首页

历史上的今天

今天是:2025年04月01日(星期二)

正在发生

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

2019-04-01 来源: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); //???????

}


推荐阅读

史海拾趣

Amprobe公司的发展小趣事

Amprobe是一家专业生产测试仪器的公司,为电子行业提供各种测试和测量解决方案。以下是Amprobe公司发展的五个相关故事:

  1. 创立与初期发展:Amprobe公司创立于1948年,总部位于美国华盛顿州埃弗雷特市。最初,公司专注于生产便携式测试仪器,如电表、电压计和电流计等,为电工、维修人员和工程师提供便捷的测量工具。公司以其可靠的产品质量和简便易用的设计在市场上建立了良好的声誉。

  2. 技术创新与产品扩展:随着技术的发展和市场需求的变化,Amprobe公司不断进行技术创新,并扩展了产品线。除了传统的电表和电压计,公司开始开发数字式测试仪器、热像仪、电池测试仪等高端产品,以满足客户对更高精度和更多功能的需求。

  3. 全球市场拓展:随着全球经济一体化的发展,Amprobe公司积极拓展国际市场。公司在欧洲、亚洲、南美等地设立了销售代表处和分支机构,建立了完善的全球销售网络。通过与当地经销商和合作伙伴合作,公司的产品销售已经覆盖了全球范围,为客户提供及时的技术支持和服务。

  4. 质量控制与认证:Amprobe公司高度重视产品质量控制,严格遵循国际质量管理标准。公司的生产工艺和质量管理体系通过了ISO 9001质量管理体系认证,并获得了欧洲CE认证和美国UL认证等产品认证。通过持续改进和质量监控,公司确保产品符合客户的要求和行业标准。

  5. 持续发展与未来规划:Amprobe公司未来将继续致力于技术创新和产品研发,不断推出符合市场需求的新产品。公司计划加强与客户的合作关系,深入了解客户的需求,提供定制化的解决方案。同时,公司将继续拓展国际市场,加强与全球合作伙伴的合作,实现持续稳健的发展。

DACHANG公司的发展小趣事

DACHANG公司的起点可追溯到一次重要的技术突破。当时,公司创始人带领团队经过数月的艰苦研发,成功开发出了一款具有革命性意义的新型电子元件。这款元件不仅性能卓越,而且成本较低,极大地满足了市场对于高性价比电子产品的需求。凭借这一技术突破,DACHANG公司迅速在市场上获得了认可,为公司后续的发展奠定了坚实的基础。

Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

为了进一步拓展国际市场,Excelics Semiconductor积极寻求与国际知名企业的合作。他们与欧洲一家领先的芯片制造商签订了战略合作协议,共同开发新一代的智能芯片。这一合作不仅提升了Excelics Semiconductor的技术实力,也为其在国际市场上赢得了更多的份额。

Golledge Electronics公司的发展小趣事

在半导体行业,产品质量是企业生存和发展的关键。Excelics Semiconductor始终将品质管理放在首位,建立了严格的质量控制体系。他们通过引进先进的生产设备和技术,确保每一片芯片都符合高标准的质量要求。这种对品质的执着追求赢得了客户的信任和市场的认可。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

银河微电自成立之初,便专注于半导体分立器件的研发与生产。面对国内外市场的激烈竞争,公司坚持自主创新,不断投入研发力量,终于在某关键技术上取得了重大突破。这一技术突破不仅提高了产品的性能,还降低了生产成本,使得银河微电的产品在市场上更具竞争力。凭借这一技术优势,银河微电逐渐在行业中树立起了自己的地位。

ECS公司的发展小趣事

面对云计算技术的不断发展和市场竞争的加剧,ECS公司制定了面向未来的战略布局。他们将继续加大在研发方面的投入,推动ECS服务的不断升级和创新;同时,他们还将积极探索新的业务领域和市场机会,为客户提供更加全面、丰富的服务。此外,ECS公司还注重可持续发展和社会责任。他们致力于降低能耗和排放、推动绿色计算等方面的工作;同时,他们还积极参与社会公益事业和慈善活动,回馈社会。这些举措使得ECS公司不仅成为了一家领先的云服务提供商,还成为了一家具有社会责任感的企业。

问答坊 | AI 解惑

紧急求教一个电路 很茫然

我只知道是三轴位置传感器接口电路 也不知道是不是 高手来讲解一下哈 谢谢…

查看全部问答>

触摸屏驱动采样请教

DdsiTouchPanelGetPoint(         TOUCH_PANEL_SAMPLE_FLAGS        *pTipStateFlags,         INT                      ...…

查看全部问答>

求助:CodeWarrior for ADS 1.2中编译出错

工程中,用ADS编译,出现了Errors: Could not find or load the file 襐IC.a?for target 褼ebugRel?for project 襱est1.mcp? Could not find or load the file 褻omm.a?for target 褼ebugRel?for project 襱est1.mcp? The following access p ...…

查看全部问答>

请问下PCI PCIE在配置空间的区别

如何通过读取判断机器是PCIE为还是PCI呢???…

查看全部问答>

MSP430F435学习板 超低价格出售 仅售100元

请登陆淘宝进行详细的细节查询 淘宝地址:      http://auction1.taobao.com/auction/0/item_detail-0db2-a975eaf6e989403d6987eeb2fde3c9d9.jhtml    欢迎购买. …

查看全部问答>

跪求 :用VB.Net 在Wince 平台下画一个点

小弟刚入道,就遇到棘手的问题,希望大家帮忙啊,谢谢! 问题如下 在Wince下 我在Form1中添加了一个PictureBox1,想在上面画个点,或者圆 结果发现连Paint()函数都没 ,郁闷;还有 CreatGraphic函数也没,该怎么办啊? 使用VB.net2005 谁能发个 ...…

查看全部问答>

实用型应急灯

    [ 本帖最后由 ddllxxrr 于 2010-8-24 10:49 编辑 ]…

查看全部问答>

《匠人手记》之新手三忌

1.第一忌 自己不动脑筋,一遇到问题就问别人有句话说的好“吃别人咀嚼过的馍不香”。对于新手来说,做每一件事都是一次学习的好机会。有时候,探索的过程比最终的结果更重要。当你经过自己的努力,解决问题时,成就感和自信心会随之逐渐建立。如果 ...…

查看全部问答>

wanghongyang我还惦记着那个3.5液晶

不知道准备的怎么样了?准备随时出手了:D…

查看全部问答>

今早用altium designer6.9画原理图时突然出现了这么一个问题··不得其解啊

就是我放置导线时··本来把我想要连接上的两个引脚端连上就可以了··可是呢··导线的终点却与多个引脚连到一起了··自动产生了很多我不想要连接上的节点··这是怎么回事呢?之前放导线的时候貌似没出现这情况··…

查看全部问答>