[mw_shl_code=c,true]部分程序与说明来自互联网,感谢他人共享![/mw_shl_code]
[mw_shl_code=c,true]在网上搜了很久没找到一篇有关于STM8硬件I2C驱动BH1750,于是参考了一个驱动24C02的例子自己写了一个程序。小弟不才,花了很长时间才调出来,现在分享给大家,希望有需要的人可以少走些弯路[/mw_shl_code]
[mw_shl_code=c,true]//相应端口要配置成默认的浮动输入。。。一定要。。
//IAR For STM8S105C6
void i2c_init(void)
{
//I2C_FREQR和I2C_CCRL,CCRH ,I2C_TRISER要对应fMASTER频率计算。。但测试的效果来看好像又没什么影响。
I2C_FREQR |= 0x10; //输入外设时钟频率为16MHz
I2C_CR1 = 0x00; //禁止I2C外设
I2C_TRISER = 0x0c;
I2C_CCRL = 0x37;
I2C_CCRH = 0x00;
I2C_CR1 |= 0x01; //开启I2C外设
I2C_CR2 |= 0x04; //应答使能
I2C_OARL = 0xfe; //自身地址
I2C_OARH = 0x40;
}
void write_BH1750(u8 addr)
{
I2C_CR2 &=~ 0x04; //不返回应答
while(I2C_SR3 & 0x02); //等待总线空闲
I2C_CR2 |= 0x01; //产生起始位
while(!(I2C_SR1 & 0x01)); //等待START发送完
I2C_DR =0x46; //发2器件地址
while(!(I2C_SR1 & 0x02)); //等特7位器件地址发送完
I2C_SR1; //在软件读取SR1后,对SR3寄存器读操作 将清除改位
I2C_SR3; //然后读SR3 清 ADDR(等于库函数I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED))
I2C_DR = addr;
while(!(I2C_SR1 & 0x04));
I2C_SR1; //在软件读取SR1后,对SR3寄存器读操作 将清除改位
I2C_SR3; //然后读SR3 清 ADDR(等于库函数I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED))
// I2C_CR2&=~0x04; //不返回应答
I2C_CR2|=0x02; //产生停止位
}
//。
u16 read_BH1780(void)
{
u8 buf[2];
u16 r_lx;
I2C_CR2 &=~ 0x04; //不返回应答
while(I2C_SR3 & 0x02); //等待总线空闲
I2C_CR2 |= 0x01; //产生起始位
while(!(I2C_SR1 & 0x01)); //等待START发送完
I2C_DR = 0x47; //发器件地址
while(!(I2C_SR1 & 0x02)); //等特7位器件地址发送完
I2C_SR1; //在软件读取SR1后,对SR3寄存器读操作 将清除改位
I2C_SR3; //然后读SR3 清 ADDR(等于库函数I2C_ClearFlag(I2C_FLAG_ADDRESSSENTMATCHED))
[/mw_shl_code]
[mw_shl_code=c,true] //就是因为少了这句,花了很长时间没调出来就是没看清别人例子和STM8规格书
I2C_CR2 |= 0x04; //为一下循环开始 设置 ack使能,上面 EV7_1设置ack=0发送stop后;
//需要手动设置ack=1使能,必要在接收数据之前[/mw_shl_code]
[mw_shl_code=c,true]
while(!(I2C_SR1 & 0x40));
buf[0]=I2C_DR;
// I2C_CR2&=~0x04; //返回应答
while(!(I2C_SR1 & 0x40));
buf[1]=I2C_DR;
I2C_CR2 &= ~0x04; //ack使能
I2C_CR2 |= 0x02; //产生停止位
r_lx=(u16)(((buf[0]<<8)+buf[1])/1.2); //计算公式参考规格书例子
return r_lx;
}
int main(void)
{
system_init();
io_init();
i2c_init();
write_BH1750(0x01); //启动BH1750
write_BH1750(0x11); //连续H分辨率模式2
........
while(1)
{
read_BH1780();
delay_ms(150); //延时至少120ms,参考规格书
...........
}
}
[/mw_shl_code]
[mw_shl_code=c,true]来两张逻辑分析仪的图片[/mw_shl_code]
BH1750中文规格书
|