完成单板代码
/*任务4:通过光敏电阻读取光强数值*/
步骤:
4.1、查找电路图(FS_11C14 V3.0.pdf)找到光敏电阻的接口
4.2、这个IC没有使用过,查找这个光敏电阻的IC资料ISL29003.pdf
由光敏电阻的电路资料可知,光敏电阻的 SDA、SCL分别连接到MCU中的I2C总线控制器
4.3、首先初始化I2C总线:
uint32_t I2CInit( uint32_t I2cMode, uint32_t slaveAddr )
{
/* It seems to be bit0 is for I2C, different from
UM. To be retested along with SSP reset. SSP and I2C
reset are overlapped, a known bug, for now, both SSP
and I2C use bit 0 for reset enable. Once the problem
is fixed, change to "#if 1". */
#if 1
LPC_SYSCON->PRESETCTRL |= (0x1<<1);
#else
LPC_SYSCON->PRESETCTRL |= (0x1<<0);
#endif
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<5);
LPC_IOCON->PIO0_4 &= ~0x3F; /* I2C I/O config */
LPC_IOCON->PIO0_4 |= 0x01; /* I2C SCL */
LPC_IOCON->PIO0_5 &= ~0x3F;
LPC_IOCON->PIO0_5 |= 0x01; /* I2C SDA */
/*--- Clear flags ---*/
LPC_I2C->CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC;
/*--- Reset registers ---*/
#if FAST_MODE_PLUS
LPC_IOCON->PIO0_4 |= (0x1<<9);
LPC_IOCON->PIO0_5 |= (0x1<<9);
LPC_I2C->SCLL = I2SCLL_HS_SCLL;
LPC_I2C->SCLH = I2SCLH_HS_SCLH;
#else
LPC_I2C->SCLL = I2SCLL_SCLL;
LPC_I2C->SCLH = I2SCLH_SCLH;
#endif
if ( I2cMode == I2CSLAVE )
{
LPC_I2C->ADR0 = slaveAddr;
}
/* Enable the I2C Interrupt */
NVIC_EnableIRQ(I2C_IRQn);
LPC_I2C->CONSET = I2CONSET_I2EN;
return( TRUE );
}
4.4、光敏电阻的初始化管脚
4.5、对管脚进行初始化
void light_init (void)
{
/* nothing to initialize. light_enable enables the sensor */
//add by terry
GPIOSetDir(PORT0, 7, 1); //set the light pio0_7 output
GPIOSetValue(PORT0, 7, 0); //set the light pio0_7 high
}
4.6、设置光敏电阻的敏感度
void light_setRange(light_range_t newRange)
{
uint8_t ctrl = readControlReg();
/* clear range */
ctrl &= ~(3 << 2);
ctrl |= CTRL_GAIN(newRange);
I2CMasterBuffer[0] = ADDR_CTRL;
I2CMasterBuffer[1] = ctrl;
I2CWrite(LIGHT_I2C_ADDR, I2CMasterBuffer, 2);
switch(newRange) {
case LIGHT_RANGE_1000:
range = RANGE_K1;
break;
case LIGHT_RANGE_4000:
range = RANGE_K2;
break;
case LIGHT_RANGE_16000:
range = RANGE_K3;
break;
case LIGHT_RANGE_64000:
range = RANGE_K4;
break;
}
}
4.7、读取光敏电阻的感光值
uint32_t light_read(void)
{
uint32_t data = 0;
uint8_t buf[1];
buf[0] = ADDR_LSB_SENSOR;
I2CWrite(LIGHT_I2C_ADDR, buf, 1);
I2CRead(LIGHT_I2C_ADDR, buf, 1);
data = buf[0];
buf[0] = ADDR_MSB_SENSOR;
I2CWrite(LIGHT_I2C_ADDR, buf, 1);
I2CRead(LIGHT_I2C_ADDR, buf, 1);
data = (buf[0] << 8 | data);
/* Rext = 100k */
/* E = (range(k) * DATA) / 2^n */
//return (range*data / width);
data *= range;
data /= width;
return data;
}
4.8、测试方法
void Light_Test(void)
{
char buf[24];
uint32_t lux;
//set a title
OLED_ClearScreen();
OLED_DisStrLine(0, 0, "Light");
printf("\r\nLight\r\n");
I2CInit(I2CMASTER, 0);
light_init();
light_enable() //add here
light_setRange(LIGHT_RANGE_4000);
while(1)
{
lux = light_read();
snprintf(buf, 20, "%d ", lux);
OLED_DisStrLine(2, 0, (uint8_t *)buf);
printf("%d ", lux);
delay_ms(300);
if(KEY_Read() == KEY_ESC)
break;
}
}
4.9、编译烧录验证可以实现实时读取感光值