项目是在官方提供的源码基础上改的,板子用的是小熊派的,使用的是I2C0,先谈谈遇到的几个问题,第一个是从机地址,在I2C写数据时从机地址时0xAE,读从机数据时是0xAF,找了很久才找到的。
然后是I2C读取数据和写数据的先后顺序,官方文档是这样子的:
读一个字节首先是发送从机地址,发送从机地址之后接着发送寄存器地址,然后再次发送从机读的地址,Max30102就会把之前发送的寄存器地址的数据传输到主机读。整个流程的代码如下:
u8 max30102_Bus_Read(u8 Register_Address)
{
uint8_t data1;
uint32_t result;
uint8_t data[1];
uint8_t buffer[] = {Register_Address};
hi_i2c_data i2cData = {0};
i2cData.send_buf = buffer;
i2cData.send_len = sizeof(buffer);
result = hi_i2c_write(HI_I2C_IDX_0, max30102_WR_address, &i2cData);
if (result != HI_ERR_SUCCESS) {
printf("I2C AP3216C status = 0x%x!!!\r\n", result);
return result;
}
hi_i2c_data i2cData1 = {0};
i2cData1.receive_buf = data;
i2cData1.receive_len = 1;
result = hi_i2c_read(HI_I2C_IDX_0, max30102_RE_address, &i2cData1);
if (result != HI_ERR_SUCCESS) {
printf("I2C AP3216C status = 0x%x!!!\r\n", result);
return result;
}
data1=data[0];
return data1;
}
向从机写数据我在文档里面没找见,但是看官方例程是这样子的顺序,首先把向从机写数据的地址传送到I2C,然后是要写的寄存器的地址,接着是要写的数据。
u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data)
{
uint8_t buffer[] = {Register_Address, Word_Data};
hi_i2c_data i2cData = {0};
i2cData.send_buf = buffer;
i2cData.send_len = sizeof(buffer);
return hi_i2c_write(HI_I2C_IDX_0, max30102_WR_address, &i2cData);
}
最后实现的结果如下: