查看: 5932|回复: 9

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

[复制链接]
  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-11-8 23:51:50 | 显示全部楼层 |阅读模式
    分享到:
         今天我们通过制作一个简易温度计来学习怎么使用PSoC3的I2C。我使用的温度传感器芯片是TI的TMP275,它与单片机的通讯方式为I2C,关于TMP275的使用,请大家自己查阅TI提供的datasheet(后面附件有),这里我们主要讲解PSoC3的I2C的使用。
         PSoC3的I2C使用非常方便,添加一个I2C Master(官方提供的I2C还有其他IP,具体可以看相应的datasheet):
    未命名.jpg
       相应配置如下:
    未命名.jpg
       选择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_NAK_DATA);}
    9.         }
    10.     }
    11.     I2C_MasterSendStop(); /* Send Stop */
    复制代码
    相信代码还是应该很容易看懂的,所以我就不多解释了,下面给出效果图:
    图像142_副本.jpg
      下面是完整的工程,硬件连接在头文件里都有示说明:
    Thermometer.zip (1.78 MB, 下载次数: 141)
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-11-9 00:20:01 | 显示全部楼层
    先把沙发自己占了吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-11-9 08:00:52 | 显示全部楼层
    不错不错 V5
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-11-9 09:09:54 | 显示全部楼层

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

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

    呵呵,谢谢,还是在你洗写的教程中学习了很多的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2012-11-9 09:09:56 | 显示全部楼层

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

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

    呵呵,谢谢,还是在你洗写的教程中学习了很多的
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2013-4-7 21:38:12 | 显示全部楼层
    楼主有没有做过直接把样板上热敏电阻测得的温度直接显示到LCD1602上的实验呢?可不可以给大家共享一下?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

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

    还没有,我可以试下
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

     楼主| 发表于 2013-4-8 00:12:09 | 显示全部楼层
    ming1006 发表于 2013-4-7 23:30
    还没有,我可以试下

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

    使用道具 举报

    该用户从未签到

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

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

    使用道具 举报

  • TA的每日心情
    无聊
    2016-12-20 15:08
  • 签到天数: 510 天

    连续签到: 1 天

    [LV.9]以坛为家II

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

    不客气,一起学习
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-12-24 21:38 , Processed in 0.241139 second(s), 37 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.