分享:STM8S105硬件I2C驱动BH1750

2019-07-19 21:20发布

[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中文规格书

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。