开发板用的BearPi-HM_Nano,i2c的代码参考的案例B5_basic_i2c_nfc,只修改了I2CTask中的部分代码,代码如下:
static void I2CTask(void)
{
GpioInit();
//GPIO_0复用为I2C1_SDA
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_0, WIFI_IOT_IO_FUNC_GPIO_0_I2C1_SDA);
//GPIO_1复用为I2C1_SCL
IoSetFunc(WIFI_IOT_IO_NAME_GPIO_1, WIFI_IOT_IO_FUNC_GPIO_1_I2C1_SCL);
//baudrate: 100kbps
I2cInit(WIFI_IOT_I2C_IDX_1, 100000);
I2cSetBaudrate(WIFI_IOT_I2C_IDX_1, 100000);
printf("I2C wsd Start\n");
while (1)
{
printf("=======================================\r\n");
printf("***********I2C_WSD_example**********\r\n");
printf("=======================================\r\n");
usleep(2000000);
for (int i = 0; i < 8; ++i)
{
// 发送
WifiIotI2cData bh1750_i2c_data1 = {0};
uint8_t send_data[1] = {0};
bh1750_i2c_data1.sendBuf = send_data;
bh1750_i2c_data1.sendLen = 1;
I2cWrite(WIFI_IOT_I2C_IDX_1, (0x48 << 1) | i, &bh1750_i2c_data1);
// 接收
WifiIotI2cData bh1750_i2c_data = { 0 };
uint8_t recv_data[2] = { 0 };
bh1750_i2c_data.receiveBuf = recv_data;
bh1750_i2c_data.receiveLen = 2;
int ret = I2cRead(WIFI_IOT_I2C_IDX_1,(0x48<<1)|i,&bh1750_i2c_data);
#转换温度
uint16_t temp = recv_data[0] << 3 | recv_data[1] >> 5;
float f_temp = temp * 0.125;
printf("%d: ret = %d, data = %X %.2f\n", i, ret, f_temp, f_temp);
usleep(1000000);
}
usleep(2000000);
}
}
地址:lm75bd,为7位地址,高4位为1001b,低3位通过A0,A1,A2三个引脚控制,高电平为1,低电平为0。
温度值:低5位未使用,用高11位表示分辨率为0.125℃的温度(二进制补码),其中最高位为0,表示温度大于零;最高位为1,表示温度小于零。
运行结果如下: