用AT89C51 要使用单片机的IO口来模拟上升沿和下降沿,没接触Cube HAL库,自己做模拟太麻烦了!现在我们来学习一种更简单的方式!
一。介绍
1. 先让我们看如下2段I2C的写入操作
(1) BH1750
我们用STM32 cube 库, 这里ADDR接地!
(2) E2PROM 24C02
我们观察 BH1750写命令和 24C02的数据写入,我们发现在24C02 比 BH1750 少 一个数据 + ACK
比较:
看上边这2个写入指令,分别是HAL库里的 2个I2C的方法!
1. HAL_I2C_Master_Transmit
2. HAL_I2C_Mem_Write
其实下边这2条是等效的,你有没有明白点什么?
// 我们只需要用这个函数,就可以模拟 : ST,从设备地址,ACK,发送指令,ACK,SP 整个过程
HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, (uint8_t *)&BH1750_HL, 1, 1000);
// 这里我们也可用使用 这个是等效的
HAL_I2C_Mem_Write(&hi2c1, BH1750_ADDR, (uint8_t *)&BH1750_HL, I2C_MEMADD_SIZE_8BIT, (void *)0, 1, 1000);
2. 既然有了写入,那当然也有读取,让我们再看下读取
(1) BH1750
看BH1750是怎么读的呢?
就从 从设备地址上读取,1次读取呢回来2个数据位
//那我们就这样读呗,从地址,读2个数据,超时时间1秒
HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR, (uint8_t *)data, 2, 1000);
(2) 24C02
//这是24C02的读取,从设备,从设备的地址,什么样格式,数据,长度,超时
HAL_I2C_Mem_Read(hi2c, DevAddress, MemAddress, MemAddSize, pData, Size, Timeout)
啰啰嗦嗦说了一大堆!就是想说既然有了HAL库,那读取就太简单了!
二。源码
/** I2C光照读取 **/
void BH1750_Value()
{
char data[2];
//先重置
HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, (uint8_t *)&BH1750_TD, 1, 1000);
//发送我要开始读啦
HAL_I2C_Master_Transmit(&hi2c1, BH1750_ADDR, (uint8_t *)&BH1750_HL, 1, 1000);
//等180ms
HAL_Delay(180);
//读数据到数组中
HAL_I2C_Master_Receive(&hi2c1, BH1750_ADDR, (uint8_t *)data, 2, 1000);
//发送到485
send485((uint8_t *)data, 2);
//下一次 延迟下
HAL_Delay(500);
}
三。预览效果
先进入黑暗,然后再加强光,看变化 -_ -
感谢您的支持,写的文章如对您有所帮助,开源不易,请您打赏,谢谢啦~