晓枫VS枯叶 发表于 2014-12-18 09:09:26

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

最近看到好多网友说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;
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= I2C_ReceiveData(I2C1);
        while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
        I2c_Buf= 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.发送结束信号

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

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库的吗
页: [1] 2
查看完整版本: STM32F429硬件I2C驱动TMP275(未出现I2C bug)