请教下光强度传感器BH1750FVI读数据问题,读出一直是00FF~
下面是抓的读数据的波形,atmega16用IO口模拟的I2C,麻烦大家看看是什么问题?有人说是延时的问题,但是不知道该调整哪里。。。谢谢!芯片说明中读数据操作
实际波形
这么先进? 网上代码不多的是,找个51的改改就行了 f8023m 发表于 2014-4-13 23:01
网上代码不多的是,找个51的改改就行了
是照网上移植的,但是读出来的数据不正确~ 我修改别人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]