9回答

0收藏

[原创] 【PSoC3心得】I2C应用之简易温度计

英飞凌 英飞凌 7010 人阅读 | 9 人回复 | 2012-11-08

     今天我们通过制作一个简易温度计来学习怎么使用PSoC3的I2C。我使用的温度传感器芯片是TI的TMP275,它与单片机的通讯方式为I2C,关于TMP275的使用,请大家自己查阅TI提供的datasheet(后面附件有),这里我们主要讲解PSoC3的I2C的使用。
     PSoC3的I2C使用非常方便,添加一个I2C Master(官方提供的I2C还有其他IP,具体可以看相应的datasheet):

   相应配置如下:

   选择Master模式,通讯速率设为100kbps,其他的默认。
  编译完之后,系统会生成相应的API函数。I2C在主模式下的使用方式有两种,一种是自动模式,一种是手动模式,这里我给出手动模式的使用方法(自动模式在代码注释中有),首先是数据的发送,代码如下:
  1. /*配置275*/
  2. u8 Config275(u8 configuration)
  3. {
  4.         u8 status,i;
  5.     u8 message[2];
  6.         message[0] = CONF_REG;
  7.         message[1] = configuration;

  8.     status = I2C_MasterSendStart(ADDR, I2C_WRITE_XFER_MODE);  /* Send Start */
  9.     if (status == I2C_MSTR_NO_ERROR) /* Check if start generation completed without errors */
  10.     { /* Send array of 2 bytes */
  11.         for(i=0; i<2; i++)
  12.          {
  13.             status = I2C_MasterWriteByte(message[i]);
  14.                 if (status != I2C_MSTR_NO_ERROR)
  15.                     { break; }
  16.          }
  17.      }
  18.      I2C_MasterSendStop(); /* Send Stop */

  19. /*        I2C_MasterClearStatus();
  20.         I2C_DisableInt();
  21.         I2C_MasterWriteBuf(ADDR,message,2,I2C_MODE_COMPLETE_XFER);
  22.         I2C_EnableInt();
  23.         for(;;)
  24.         {CyDelay(1);
  25.         //        if((I2C_MasterStatus() & I2C_MSTAT_WR_CMPLT))
  26.                 {
  27.                         break;
  28.                 }
  29.         }*/
  30.        
  31.         return 1;
  32. }
复制代码
接收数据的代码也很类似,核心代码如下:
  1. status = I2C_MasterSendStart(ADDR, I2C_READ_XFER_MODE); /* Send Start */
  2.     if(status == I2C_MSTR_NO_ERROR) /* Check if transfer completed without errors */
  3.     {
  4.         /* Read array of 2 bytes */
  5.         for(i=0; i<2; i++)
  6.         {
  7.             if(i < 1) { rdData[i] = I2C_MasterReadByte(I2C_ACK_DATA); }
  8.             else { rdData[i] = I2C_MasterReadByte(I2C_N***_DATA);}
  9.         }
  10.     }
  11.     I2C_MasterSendStop(); /* Send Stop */
复制代码
相信代码还是应该很容易看懂的,所以我就不多解释了,下面给出效果图:

  下面是完整的工程,硬件连接在头文件里都有示说明:
Thermometer.zip (1.78 MB, 下载次数: 141)

  这里是TMP275的datasheet:
tmp275.pdf (633.17 KB, 下载次数: 73)

  最后再附上用时序模拟I2C的简易温度计的PSoC3工程:
TMP275.rar (1.31 MB, 下载次数: 85)



分享到:
回复

使用道具 举报

回答|共 9 个

倒序浏览

沙发

ming1006

发表于 2012-11-9 00:20:01 | 只看该作者

先把沙发自己占了吧
板凳

w932443004

发表于 2012-11-9 08:00:52 | 只看该作者

不错不错 V5
地板

ming1006

发表于 2012-11-9 09:09:54 | 只看该作者

RE: 【PSoC3心得】I2C应用之简易温度计

wangku001wei 发表于 2012-11-9 08:00
不错不错 V5

呵呵,谢谢,还是在你洗写的教程中学习了很多的
5#

ming1006

发表于 2012-11-9 09:09:56 | 只看该作者

RE: 【PSoC3心得】I2C应用之简易温度计

wangku001wei 发表于 2012-11-9 08:00
不错不错 V5

呵呵,谢谢,还是在你洗写的教程中学习了很多的
6#

金小豆

发表于 2013-4-7 21:38:12 | 只看该作者

楼主有没有做过直接把样板上热敏电阻测得的温度直接显示到LCD1602上的实验呢?可不可以给大家共享一下?
7#

ming1006

发表于 2013-4-7 23:30:11 | 只看该作者

金小豆 发表于 2013-4-7 21:38
楼主有没有做过直接把样板上热敏电阻测得的温度直接显示到LCD1602上的实验呢?可不可以给大家共享一下? ...

还没有,我可以试下
8#

ming1006

发表于 2013-4-8 00:12:09 | 只看该作者

ming1006 发表于 2013-4-7 23:30
还没有,我可以试下

刚才试了下发现代码没给全,应该少了个宏定义#define THERM_RREF 10000,还有两个引脚都要是analogy port,不要用数字的
9#

金小豆

发表于 2013-4-8 10:49:33 | 只看该作者

ming1006 发表于 2013-4-8 00:12
刚才试了下发现代码没给全,应该少了个宏定义#define THERM_RREF 10000,还有两个引脚都要是analogy port ...

这两个我之前添加了  我发现自己出了一个很低级的问题:液晶屏的排针没有焊稳,所以显示的时候总是不稳定、乱码。谢谢你哦   以后有问题还要随时请教,发现很有意思。
10#

ming1006

发表于 2013-4-8 11:11:39 | 只看该作者

金小豆 发表于 2013-4-8 10:49
这两个我之前添加了  我发现自己出了一个很低级的问题:液晶屏的排针没有焊稳,所以显示的时候总是不稳定 ...

不客气,一起学习
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条