cygnushan 发表于 2014-4-13 22:09:31

请教下光强度传感器BH1750FVI读数据问题,读出一直是00FF~

下面是抓的读数据的波形,atmega16用IO口模拟的I2C,麻烦大家看看是什么问题?有人说是延时的问题,但是不知道该调整哪里。。。谢谢!
芯片说明中读数据操作

实际波形


wxty 发表于 2014-4-13 22:30:51

这么先进?

f8023m 发表于 2014-4-13 23:01:51

网上代码不多的是,找个51的改改就行了

cygnushan 发表于 2014-4-13 23:26:15

f8023m 发表于 2014-4-13 23:01
网上代码不多的是,找个51的改改就行了

是照网上移植的,但是读出来的数据不正确~

sunicecream 发表于 2014-4-14 00:16:41

我修改别人51例程来的,感觉读出来的数据是正常的,可参考下

#ifndef __AD_h__
#define __AD_h__


#define set_SCLPORTC|=(1<<PC0)
#define clr_SCLPORTC&=~(1<<PC0)

#define set_SDAPORTC|=(1<<PC1)
#define clr_SDAPORTC&=~(1<<PC1)

#defineRD_DEVICE_ADDR0x47   //ADDR脚接地时的读地址
#defineWD_DEVICE_ADDR0x46   //ADDR脚接地时的写地址

#defineEEPROM_BUS_ADDRESS 0xa0
#defineTWPS00                        //TWSR值(not bits)
#defineTWPS11
#defineTWEN   2
#defineTWIE   0
#defineTWEA   6
#defineTWINT7
#defineTWSTA5
#defineTWSTO4

#defineTW_START         0x08         //主机
#defineTW_REP_START       0x10
#defineTW_MT_SLA_ACK      0x18         //主机发送器
#defineTW_MT_SLA_NACK   0x20
#defineTW_MT_DATA_ACK   0x28
#defineTW_MT_DATA_NACK    0x30
#defineTW_MT_ARB_LOST   0x38         //主机接收器
#defineTW_MR_ARB_LOST   0x38
#defineTW_MR_SLA_ACK      0x40
#defineTW_MR_SLA_NACK   0x48
#defineTW_MR_DATA_ACK   0x50
#defineTW_MR_DATA_NACK    0x58


/*********************************************************************/

void I2C_init(void)
{
TWSR = 0x00;          // TWI总线初始化
TWBR = 0x00;          // 允许ACK应答:On
TWAR = 0x00;          // 广播呼叫识别 :Off
TWCR = 0x44;          // 比特率:250.000k Hz
set_SCL;            // 当这两个引脚为输入方式时,内部上拉电阻有效,这样可省下两个上拉电阻
set_SDA;
}

/*********************************************************************/

unsigned char I2C_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // 发送      
while(!(TWCR&(1<<TWINT)))                // 等待发送完成
{};
return 1;

}

/*********************************************************************/

void I2C_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send stop command
}

/*********************************************************************/

unsigned char I2C_write(unsigned char c)    //向总线写1字节,并返回有无应答
{
unsigned char ack = 1;                  

TWDR = c;                                 //发送数据写入TWI数据寄存器
TWCR = (1<<TWINT)|(1<<TWEN);             //发送

while(!(TWCR&(1<<TWINT))) {};            //等待发送完成
   
   if((TWSR&0xF8)!=TW_MT_SLA_ACK)         //读取总路线状态
   ack = 0 ;
   
   return ack;          
}

/***********************************************************************/

unsigned char I2C_read(unsigned char ack)   //读1字节,ack=1时应答;ack=0时,不应答
{
if(ack)
    TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA); //读数据,并回送ACK

else
    TWCR = (1<<TWINT)|(1<<TWEN);                  //读数据,并回送nACK
       
while(!(TWCR&(1<<TWINT))) {};            //等待操作完成

return(TWDR);                           //返回读到的数据
}
/***********************************************************************/

unsigned char eeprom_read(unsigned int address)
{
   unsigned char data;
   I2C_start();
   I2C_write(EEPROM_BUS_ADDRESS);
   I2C_write(address>>8);
   I2C_write(address);
   I2C_start();
   I2C_write(EEPROM_BUS_ADDRESS|1);
   data=I2C_read(0);
   I2C_stop();
   
   return data;   
}
/***********************************************************************/

void eeprom_write(unsigned int address,unsigned char data)
{
I2C_start();
I2C_write(EEPROM_BUS_ADDRESS);
I2C_write(address>>8);
I2C_write(address);
I2C_write(data);
I2C_stop();
_delay_ms(10);
}

/***********************************************************************/
unsigned int Read_BH1750()
{
   unsigned int data,data0,data1;
   
   I2C_start();
   I2C_write(WD_DEVICE_ADDR|1);
   data0=I2C_read(1);
   data1=I2C_read(0);
   data=(data0<<8)+data1;
   I2C_stop();
   
   return data;
}


/***********************************************************************/

/***********************************************************************/
unsigned char Write_BH1750(unsigned char data)
{
I2C_start();
I2C_write(WD_DEVICE_ADDR);
I2C_write(data);
I2C_stop();
_delay_ms(10);
}

/***********************************************************************/
#endif
页: [1]
查看完整版本: 请教下光强度传感器BH1750FVI读数据问题,读出一直是00FF~