调了一整天TSL2561光强传感器,IIC是用的战舰的代码移植的,这块肯定是不会有问题。TSL2561驱动代码是网上找的,看了大家的都和我差不多,但是我读器件的ID,读出来是错误的。光强移植显示0,地址用的接地,读地址是0x53,写是0x52,请大神指点下,哪里不对了?调得我真的是心力交瘁
[mw_shl_code=c,true]uchar DataLow0,DataHigh0,DataLow1,DataHigh1;
u16 Channel0,Channel1;
void tsl2561_Init(void)
{
IIC_Init();
TSL2561_Write(CONTROL,0x03); //?è??TSL2561??????×???
TSL2561_Write(TIMING,0x01);
// TSL2561_Write(TIMING,0X02);
// TSL2561_Write(THRESHLOWLOW,0X00);
// TSL2561_Write(THRESHLOWHIGH,0X00);
// TSL2561_Write(INTERRUPT ,0X00);
//TSL2561_Write(TIMING,0x02); //?è???±???????÷
// TSL2561_Write(INTERRUPT,0x25); //??2s
}
void respons()
{
uchar i;
IIC_SCL=1;
delay_us(4);
while((IIC_SDA==1)&&(i<250))
i++;
IIC_SCL=0;
delay_us(4);
}
void TSL2561_Write(uchar command,uchar date)
{
IIC_Start();
IIC_Send_Byte(0x52);
IIC_Wait_Ack();
IIC_Send_Byte(command);
IIC_Wait_Ack();
IIC_Send_Byte(date);
IIC_Wait_Ack();
IIC_Stop();
}
uchar TSL2561_Read(uchar command)
{
uchar date;
IIC_Start();
IIC_Send_Byte(0x52);
IIC_Wait_Ack();
IIC_Send_Byte(command);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0x53);
IIC_Wait_Ack();
date = IIC_Read_Byte(0);
IIC_Stop();
return date;
}
u32 E;
void Read_Light(void)
{
DataLow0 = TSL2561_Read(DATA0LOW);
DataHigh0 = TSL2561_Read(DATA0HIGH);
Channel0 = 256*DataHigh0 + DataLow0;
DataLow1 = TSL2561_Read(DATA1LOW);
DataHigh1 = TSL2561_Read(DATA1HIGH);
Channel1 = 256*DataHigh1 + DataLow1;
delay_ms(410);
if(0.0<Channel1/Channel0&&Channel1/Channel0<=0.50)E=(0.0304*Channel0-0.062*Channel0*pow(Channel1/Channel0, 1.4));
if(0.50<Channel1/Channel0&&Channel1/Channel0<=0.61)E=(0.0224*Channel0-0.031*Channel1);
if(0.61<Channel1/Channel0&&Channel1/Channel0<=0.80)E=(0.0128*Channel0-0.0153*Channel1);
if(0.80<Channel1/Channel0&&Channel1/Channel0<=1.30)E=(0.00146*Channel0-0.00112*Channel1);
if(Channel1/Channel0>1.30)E=0;
/*
if(0.0<Channel1/Channel0&&Channel1/Channel0<=0.52)E=(0.0315*Channel0-0.0593*Channel0*pow(Channel1/Channel0, 1.4));
if(0.52<Channel1/Channel0&&Channel1/Channel0<=0.65)E=(0.0229*Channel0-0.0291*Channel1);
if(0.65<Channel1/Channel0&&Channel1/Channel0<=0.80)E=(0.0157*Channel0-0.0180*Channel1);
if(0.80<Channel1/Channel0&&Channel1/Channel0<=1.30)E=(0.00338*Channel0-0.00260*Channel1);
if(Channel1/Channel0>1.30)E=0;
*/
//delay_ms(200);
}
extern u32 E;
int main(void)
{
u8 id,a;
delay_init(); //???±??????????
NVIC_Configuration(); //?è??NVIC????·?×é2:2??????????????2???ì????????
uart_init(9600); //?®??????????9600
LED_Init();
LCD_Init();
tsl2561_Init();
LCD_ShowString(60,50,200,16,16,"find ID:");
LCD_ShowString(60,70,200,16,16,"GUANGQIANG:");
id= TSL2561_Read(ID);
a=TSL2561_Read(CONTROL);
LCD_ShowNum(60+8*8,50,id,3,16);
LCD_ShowNum(60,110,a,3,16);
while(1)
{
Read_Light();
LCD_ShowNum(60,90,E,8,16);
delay_ms(100);
LED0=!LED0;
}
}
[/mw_shl_code]
|