本帖最后由 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,然后继续和大家交流。
|