打印

LM3S811使用心得之数字温度计

[复制链接]
3174|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baixichi|  楼主 | 2011-11-20 13:10 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 baixichi 于 2011-11-20 13:14 编辑

昨天表姐夫生日,顺便去城隍庙问了一下811的芯片,谁知道找遍了都没有卖这块芯片的,好像他们卖得多一点的是些电源转换之类的芯片。
决定过几天网购一块换上,现在的811小板子成了6911的仿真器了。

看到6911板子上有一个温度传感器TMP75,就和5110配合着做了一个简易的数字温度计。
下边上一个图:


TMP75也是TI公司的,用I2C两根线控制,挺节省IO口的。它的物理地址文档里边已经写得很清楚了,可以自己配置,也可以用默认的。
用过几个I2C控制的外设,他们的物理地址都需要右移1位才正确,至于为什么,我现在也不明白,期待高手解答。。。。
5110的驱动代码在上一个帖子里已经说过了,这里就贴一个TMP75的驱动和我的主函数:

tmp75.c:

#include "tmp75.h"
//#define TMP75_ADDR 0x48...在.h的文件中定义
//*************************************************
//*****************初始化I2C
void Init_I2c()
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C1);
  GPIOPinTypeI2C(GPIO_PORTA_BASE,GPIO_PIN_6|GPIO_PIN_7);
  I2CMasterInitExpClk(I2C1_MASTER_BASE,SysCtlClockGet(),true);
  //I2CSlaveEnable(I2C1_SLAVE_BASE);
// I2CSlaveInit(I2C0_SLAVE_BASE,TMP75_ADDR);
}
//**************************************************
//*******************读取温度值
float Tmp75ReadTemp()
{
  unsigned long datah,datal;
  float data;
  
//设置从机地址,写模式
  I2CMasterSlaveAddrSet(I2C1_MASTER_BASE,TMP75_ADDR,false);
  
  //放置要发送的控制命令字到I2C master
  //I2CMasterDataPut(I2C1_MASTER_BASE,0x00);
  //发送控制命令字
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_SEND_START);
  while(I2CMasterBusy(I2C1_MASTER_BASE));//等待发送完成
  
  //从设备地址+读写位写入发送数据寄存器
  I2CMasterSlaveAddrSet(I2C1_MASTER_BASE,TMP75_ADDR,true);

  //再发从设备地址+读写位
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_START);  
  while(I2CMasterBusy(I2C1_MASTER_BASE));
  
  datah=I2CSlaveDataGet(I2C1_MASTER_BASE);
  
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_CONT);  
  while(I2CMasterBusy(I2C1_MASTER_BASE));
  
  datal=I2CSlaveDataGet(I2C1_MASTER_BASE);
  
  I2CMasterControl(I2C1_MASTER_BASE,I2C_MASTER_CMD_BURST_RECEIVE_FINISH);
  while(I2CMasterBusy(I2C1_MASTER_BASE));
  
  data=(((datah<<4)|(datal>>4))&0xfff)*0.0625;
   
  return data;
}



这里是main.c:


#include "hw_memmap.h"
#include "hw_types.h"
#include "sysctl.h"
#include "gpio.h"
#include "lcd.h"
#include "tmp75.h"
unsigned long TheSysClock=0;
unsigned char data[5];
float pt=0.0;
int main(void)
{
  SysCtlClockSet(SYSCTL_XTAL_8MHZ
                 |SYSCTL_OSC_MAIN
                 |SYSCTL_USE_PLL
                 |SYSCTL_SYSDIV_4);
  
  TheSysClock=SysCtlClockGet();
  
  LCD_Init();
  LCD_Clear();
  Init_I2c();
  
  while(1)
  {
    pt= Tmp75ReadTemp();   
   
    data[0]=(char)pt/10;
    data[1]=(char)(pt-(data[0]*10)/1);
    data[2]='.';
    data[3]=(char)(pt*10-(data[0]*100)-data[1]*10)%10;
   
    LCD_Set_XY(24,2);
   
    Display_int(data[0]);
    Display_int(data[1]);
    Display_char(data[2]);
    Display_int(data[3]);   
    SysCtlDelay(TheSysClock/30);
    LCD_Clear();
  }
  
}



本来想通过nRF24L01做一个无线温度传输系统的,可是我的811还没有修复,一个nRF并不好调试,还有在对SPI的FIFO的理解上
还有问题,等找齐两块板子,再去调试nRF,然后继续和大家交流。

相关帖子

沙发
heziyan| | 2011-11-24 16:14 | 只看该作者
你的板子看着比811更有诱惑呀:lol

使用特权

评论回复
板凳
weshiluwei6| | 2011-11-24 17:46 | 只看该作者
牛人啊牛人啊牛人啊

使用特权

评论回复
地板
马善松| | 2011-11-25 11:31 | 只看该作者
楼主好辛苦啊 传了那么多 一定好好的学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

57

帖子

1

粉丝