最近看到好多网友说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
是429的程序吗?我的429主频倍到160就挂了,你的板子外部晶振是多少MHz? |
8M的晶振,180M完全没问题,应该可以超频到二百多,不过没试过! |
谢谢分享 |
感谢分享 |
谢谢分享 |
感谢分享; |
谢谢分享 |
多谢。。 |
您好,有基于HAL库的吗 |
非常感谢楼主。谢谢分享。 |
【STM32F429开发日志】汉字显示(取模方式)
【STM32F429开发日志】5.uCOS-ii V2.91 移植OK
图形化玩转Nucleo-STM32F413手机APP远程控制应用开发
【stm32F429开发日志】使用STM32CubeMX配置STM32F429_USB_HID
【STM32F429开发日志】(三)使用STM32Cube开发环境
【STM32F429开发日志】——网络收集的例程分享(包括所有STM32F429Discovery板上外设驱动)
分享个用STM32F429做的网络摄像头
STM32F429UCOS 源代码
【STM32F429开发日志】+hello led(闪烁led灯)
STM32F429DSICOVERY移植到STemWIN(图片+源码)