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

查看: 6435|回复: 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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版