首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

基于STM32 I2C的TMP101温度传感器的C源码(2)

基于STM32 I2C的TMP101温度传感器的C源码(2)

再说说 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 是报警温度次数。
继承事业,薪火相传
返回列表