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

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

[复制链接]
晓枫VS枯叶 提问时间:2014-12-18 09:09 /
最近看到好多网友说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, 下载次数: 209, 下载积分: ST金币 -1

收藏 4 评论10 发布时间:2014-12-18 09:09

举报

10个回答
shanji 回答时间:2014-12-18 18:57:07
是429的程序吗?我的429主频倍到160就挂了,你的板子外部晶振是多少MHz?
晓枫VS枯叶 回答时间:2014-12-18 21:10:11
8M的晶振,180M完全没问题,应该可以超频到二百多,不过没试过!
wdshuang09 回答时间:2016-11-16 12:27:27
谢谢分享            
andypanfan 回答时间:2016-11-18 09:03:11
感谢分享
peter001 回答时间:2016-11-18 09:28:19
谢谢分享
xhzheng 回答时间:2016-11-18 16:46:52
感谢分享;
andypanfan 回答时间:2016-12-7 08:53:36
谢谢分享
ninimo 回答时间:2017-3-28 17:48:21
多谢。。
玄虚子 回答时间:2017-4-25 12:02:11
您好,有基于HAL库的吗
zdsurge 回答时间:2018-1-24 09:20:45
非常感谢楼主。谢谢分享。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版