官方的I2C例程使用的板子自带的温度传感器,现在我想使用自己的传感器读取数据,但是出现了问题。
1.从设备地址。这个地址是我们自己定义的,还是我们需要参考传感器的数据手册进行查询,查询的原则是按照ADR0=1,ADR1-0么。在网上找了很多的关于4脚光敏传感器的介绍,但是都没有找到,问了淘宝店家,店家也不知道,关于这方面数据该怎么查询呢?
2.I2C引脚。他有两个I2C引脚,一个时钟,一个数据,普通传感器只有一个数据引脚,并没有时钟控制的引脚。这里的时钟是定义给开发板,统一开发板的步调的么?对于外接传感器来说,是不是只要接数据线就可以了?
3.数据接收。官方有两个例程,一个温湿度,一个加速度,对于这两个数据接收,我很纳闷,都是使用字符数组接收的数据,但是温度就需要移位操作,而加速度就不需要了呢?
这是官方的例程
void getTemp(char *temp){int iRetVal=0;unsigned char ucData[2];ucData[0]=1;//初始化I2C_IF_Write(0x41,&ucData[0],1,0);//地址指向温度寄存器//获取温度,1为位数iRetVal=I2C_IF_Read(0x41,&ucData[0],1);//读取温度值存入ucData,Report("ucData=%s\n\r",ucData);//读取成功,处理并显示温度if(!iRetVal){unsigned short usTemp=(ucData[0]<<8)+ucData[1];Report("usTemp=%d\n\r",usTemp);if( !(usTemp & 0x8000) ){//处理正温度值int i=0;i+=sprintf(temp,"%d.",usTemp>>7);//显示整数Report("i=%d\n\r",i);i+=sprintf(temp+i,"%d",( (usTemp & 0x7f)*25 )>>5);//显示小数Report("i=%d\n\r",i);}}} void getAcceleration(char* acc){int iRetVal=0;unsigned char ucData2[6];ucData2[0]=2;I2C_IF_Write(0x18,&ucData2[0],1,0);//地址指向加速度寄存器Report("ucData2[0]=%c\n\r",ucData2[0]);Report("ucData2[1]=%c\n\r",ucData2[1]);iRetVal=I2C_IF_Read(0x18,&ucData2[0],6);//读取加速度值存入ucData2Report("ucData=%s\n\r",ucData);if(!iRetVal){//成功,处理加速度数据int i=0;i+=sprintf(acc+i,"x=%03d ",ucData2[1]);i+=sprintf(acc+i,"y=%03d ",ucData2[3]);i+=sprintf(acc+i,"z=%03d ",ucData2[5]);} }
这是我改写的光敏传感器的代码
void getPhotoSensitive(char* LOutput){int iRetVal=0;unsigned char ucData3[2];ucData3[0]=3;I2C_IF_Write(ADDR,&ucData3[0],1,0);//地址指向光敏电阻寄存器Report("ucData3=%s\n\r",ucData3);iRetVal=I2C_IF_Read(ADDR,&ucData3[0],1);//读取DO输出值存入ucData3Report("iRetVal=%d\n\r",iRetVal);if(!iRetVal){Report("ucData3[0]=%s\n\r",ucData3[0]);Report("ucData3[1]=%s\n\r",ucData3[1]);int i=0;i+=sprintf(LOutput+i,"light is %d ",ucData3[1]);} }
谢谢各位指点~~~
Nancy Wang:
请去以下论坛咨询。
e2echina.ti.com/…/
灰小子:
这个主要是与光敏传感器的通讯。注意观察通讯时序啊。方便说下你使用的光敏传感器的型号吗?
user5984440:
回复 灰小子:
我们知道自己错在什么地方啦,I2C是接受数据的,但是我们输出的是高低电平~谢谢啦
K Mr:
回复 user5984440:
你如果用示波器检测的话,收到的应该都是高低电平,用串口调试工具试下