你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 6468|回复: 10

[STM32F429] STM32F429硬件I2C驱动TMP275(未出现I2C bug)

[复制链接]

10

主题

196

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-18
发表于 2014-12-18 09:09:26 | 显示全部楼层 |阅读模式
最近看到好多网友说ST的硬件I2C一直卡死,发表一下自己调硬件I2C的心得吧!TMP275和其他的I2C器件不同,它的器件地址有8位,最低位为0是器件的写地址,为1的是器件的读地址,所以读写的时候就要注意地址!

void TMP275_Init(void)
{
   I2C_GPIO_Init();
   I2C_Mode_Init();
   while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
   I2C_AcknowledgeConfig(I2C1, ENABLE);
   I2C_GenerateSTART(I2C1, ENABLE);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
   I2C_Send7bitAddress(I2C1, 0X90, I2C_Direction_Transmitter);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
   I2C_SendData(I2C1, 0X01);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   I2C_SendData(I2C1, 0XFE);
   while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
   I2C_GenerateSTOP(I2C1, ENABLE);
}

这是TMP275的初始化函数,主要配置寄存器,主要操作步骤为:
1.检测SDA是否空闲
2.发起始信号
3.发器件地址(写模式)
4.发寄存器地址
5.发要写入的数据
6.发送结束信号
注意每次操作之后都要检查对应的“事件”是否成功!
uint8_t I2c_Buf[2];
void I2C_Read_TMP275(void)
{
        while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
    I2C_AcknowledgeConfig(I2C1, ENABLE);
    I2C_GenerateSTART(I2C1, ENABLE);
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(I2C1,  0x90, I2C_Direction_Transmitter);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    I2C_SendData(I2C1, 0X00);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_GenerateSTART(I2C1, ENABLE);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1, 0x91, I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
        I2c_Buf[0]= I2C_ReceiveData(I2C1);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
        I2c_Buf[1]= I2C_ReceiveData(I2C1);
    I2C_AcknowledgeConfig(I2C1, DISABLE);
    I2C_GenerateSTOP(I2C1, ENABLE);  
        I2C_AcknowledgeConfig(I2C1, ENABLE);
}

这是TMP275的读取数据函数,数据存放在I2c_Buf中,主要步骤为:
1.检测SDA是否空闲
2.发起始信号
3.发器件地址(写模式)
4.发寄存器地址
5.发器件地址(读模式)
6.读取数据
7.发送结束信号

同样每次操作之后都要检查对应的“事件”是否成功,在函数里面我为了防止接收不到应答信号,重新使能了几次应答

TMP275.zip

下载

609.01 KB, 下载次数: 193, 下载积分: ST金币 -1

<
回复

使用道具 举报

25

主题

455

回帖

63

蝴蝶豆

金牌会员

最后登录
2020-9-21
发表于 2014-12-18 18:57:07 | 显示全部楼层
是429的程序吗?我的429主频倍到160就挂了,你的板子外部晶振是多少MHz?
回复 支持 反对

使用道具 举报

10

主题

196

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-18
 楼主| 发表于 2014-12-18 21:10:11 | 显示全部楼层
8M的晶振,180M完全没问题,应该可以超频到二百多,不过没试过!
回复 支持 反对

使用道具 举报

38

主题

542

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-11-11
发表于 2016-11-16 12:27:27 | 显示全部楼层
谢谢分享            
回复 支持 反对

使用道具 举报

23

主题

588

回帖

0

蝴蝶豆

高级会员

最后登录
2018-4-11
发表于 2016-11-18 09:03:11 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

11

主题

1139

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-10
发表于 2016-11-18 09:28:19 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

11

主题

228

回帖

0

蝴蝶豆

金牌会员

最后登录
2017-9-7
发表于 2016-11-18 16:46:52 | 显示全部楼层
感谢分享;
回复 支持 反对

使用道具 举报

23

主题

588

回帖

0

蝴蝶豆

高级会员

最后登录
2018-4-11
发表于 2016-12-7 08:53:36 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

1

回帖

0

蝴蝶豆

新手上路

最后登录
2019-4-30
发表于 2017-3-28 17:48:21 | 显示全部楼层
多谢。。
回复 支持 反对

使用道具 举报

0

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
1970-1-1
发表于 2017-4-25 12:02:11 | 显示全部楼层
您好,有基于HAL库的吗
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版