基于STM32 I2C的TMP101温度传感器的C源码
心得:
函数I2C_CheckEvent ()这个典型的用法是
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
如果经常死在这里面那你就要注意如下的问题:
- GPIO口的模式一定要是GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//开漏复用功能
- 保证的你的接线正确且速度合适。比如:SCL SDA要有上拉电阻 4K7是典型值,100K的速度最好
- I2C_Send7bitAddress()发送要是8位数 例如你的7位地址是1001001 你不能写成0X49正确的是0x92或者是0x93最后的读写位是0(写)还是1(读)不受你添地址的影响,仅受第3个参数I2C_Direction_Transmitter或I2C_Direction_Receiver的影响。这点我是用了示波器才看出来的 呵呵~不知道是谁把示波器CH2通道打开了反相........我差点就怀疑STM32 硬件有问题.....又出现了一些小曲折 唉~
- 最后细心写程序 比如I2C_Send7bitAddress(I2C1, 0x92, I2C_Direction_Receiver);
while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));这样话如论如何你都会死在这里的。反正我是出了不少这种低级错误的。
我用的是3.0的库 这句是I2C_Send7bitAddress(I2C1, 0xFF, I2C_Direction_Transmitter);
红线是起始位,读写位不受0XFF控制的。
SCL SDA 要有上拉电阻,VCC与GND 间最好接个104电容滤波。
串口出温度。
再说说 STM32的固件库.....唉~确实比较另类不过ST的工程师好人做到底了一个库让人轻松一截子 请先看
最头大的 I2C_CheckEvent
flag1 = I2Cx->SR1;
flag2 = I2Cx->SR2;
flag2 = flag2 < 16;
/* Get the last event value from I2C status register */
lastevent = (flag1 | flag2) & FLAG_Mask;
//lastevent = (flag1 | flag2) & I2C_EVENT;
/* Check whether the last event is equal to I2C_EVENT */
if (lastevent == I2C_EVENT )
{
/* SUCCESS: last event is equal to I2C_EVENT */
status = SUCCESS;
}
else
{
/* ERROR: last event is different from I2C_EVENT */
status = ERROR;
}
return status;
看得出STM32 就是靠SR1 与SR2 来判断各种IIC的状态,不同的位组合产生多种情况 汗~~~这个确实有创意。
好在ST的工程师总结好了各种情况 我也推荐大家直接看库函数是怎么写的不要只看那个数据手册...
#define I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED ((uint32_t)0x00060082)/* TRA, BUSY, TXE and ADDR flags */
#define I2C_EVENT_SLAVE_RECEIVER_ADDRESS_MATCHED ((uint32_t)0x00020002)/* BUSY and ADDR flags */
#define I2C_EVENT_SLAVE_TRANSMITTER_SECONDADDRESS_MATCHED ((uint32_t)0x00860080)/* DUALF, TRA, BUSY and TXE flags */
#define I2C_EVENT_SLAVE_RECEIVER_SECONDADDRESS_MATCHED ((uint32_t)0x00820000)/* DUALF and BUSY flags */
#define I2C_EVENT_SLAVE_GENERALCALLADDRESS_MATCHED ((uint32_t)0x00120000)/* GENCALL and BUSY flags */
#define I2C_EVENT_SLAVE_BYTE_RECEIVED ((uint32_t)0x00020040)/* BUSY and RXNE flags */
还有好多.........EVx 每个都有中断的。这太多了我也记不下.....总结一下吧 之说简单常用的的主模式
起始标志I2C_EVENT_MASTER_MODE_SELECT
地址写标志 I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED
数据写标志I2C_EVENT_MASTER_BYTE_TRANSMITTED
地址读标志I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED
数据读标志I2C_EVENT_MASTER_BYTE_RECEIVED
SR1中有些读了寄存器就清了或硬件清零 也可以用 I2C_ClearFlag
注意:标志位DUALF, SMBHOST, SMBDEFAULT, GENCALL, TRA, BUSY,MSL, TXE和RXNE不能被本函数清除
好了再看看TMP101 的手册 挺简单的。 其实TMP101对I2C的时序要求并不严格,应答、非应答、中止都可省略。
网上找的
SHUT DOWN 就是省电啊 less than 1μA 够省吧。F1 与F 0 是报警温度次数。
TM 报警极性.POL 也是报警的 咱先不管.....
这个STM32 历程没有借助DMA 与中断。
#include"STM3
STM32I2CTMP101温度传感 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)