STM32传感器外设集--心率模块(MAX30102)(2)

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

如果你需要这些资料,可以戳这里获取

/* 第1步:发起I2C总线启动信号 */
IIC_Start();

/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
IIC_Send_Byte(max30102_WR_address | I2C_WR);	/* 此处是写指令 */

/* 第3步:发送ACK */
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}

/* 第4步:发送字节地址, */
IIC_Send_Byte((uint8_t)Register_Address);
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}


/* 第6步:重新启动I2C总线。下面开始读取数据 */
IIC_Start();

/* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
IIC_Send_Byte(max30102_WR_address | I2C_RD);	/* 此处是读指令 */

/* 第8步:发送ACK */
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}

/* 第9步:读取数据 */
{
	data = IIC_Read_Byte(0);	/* 读1个字节 */

	IIC_NAck();	/* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */
}
/* 发送I2C总线停止信号 */
IIC_Stop();
return data;	/* 执行成功 返回data值 */

cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 /
/
发送I2C总线停止信号 */
IIC_Stop();
return 0;
}

void max30102_FIFO_ReadWords(u8 Register_Address,u16 Word_Data[][2],u8 count)
{
u8 i=0;
u8 no = count;
u8 data1, data2;
/* 第1步:发起I2C总线启动信号 */
IIC_Start();

/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
IIC_Send_Byte(max30102_WR_address | I2C_WR);	/* 此处是写指令 */

/* 第3步:发送ACK */
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}

/* 第4步:发送字节地址, */
IIC_Send_Byte((uint8_t)Register_Address);
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}


/* 第6步:重新启动I2C总线。下面开始读取数据 */
IIC_Start();

/* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
IIC_Send_Byte(max30102_WR_address | I2C_RD);	/* 此处是读指令 */

/* 第8步:发送ACK */
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}

/* 第9步:读取数据 */
while (no)
{
	data1 = IIC_Read_Byte(0);	
	IIC_Ack();
	data2 = IIC_Read_Byte(0);
	IIC_Ack();
	Word_Data[i][0] = (((u16)data1 << 8) | data2);  //

	
	data1 = IIC_Read_Byte(0);	
	IIC_Ack();
	data2 = IIC_Read_Byte(0);
	if(1==no)
		IIC_NAck();	/* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */
	else
		IIC_Ack();
	Word_Data[i][1] = (((u16)data1 << 8) | data2); 

	no--;	
	i++;
}
/* 发送I2C总线停止信号 */
IIC_Stop();

cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 /
/
发送I2C总线停止信号 */
IIC_Stop();
}

void max30102_FIFO_ReadBytes(u8 Register_Address,u8* Data)
{
max30102_Bus_Read(REG_INTR_STATUS_1);
max30102_Bus_Read(REG_INTR_STATUS_2);

/* 第1步:发起I2C总线启动信号 */
IIC_Start();

/* 第2步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
IIC_Send_Byte(max30102_WR_address | I2C_WR);	/* 此处是写指令 */

/* 第3步:发送ACK */
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}

/* 第4步:发送字节地址, */
IIC_Send_Byte((uint8_t)Register_Address);
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}


/* 第6步:重新启动I2C总线。下面开始读取数据 */
IIC_Start();

/* 第7步:发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读 */
IIC_Send_Byte(max30102_WR_address | I2C_RD);	/* 此处是读指令 */

/* 第8步:发送ACK */
if (IIC_Wait_Ack() != 0)
{
	goto cmd_fail;	/* EEPROM器件无应答 */
}

/* 第9步:读取数据 */
Data[0] = IIC_Read_Byte(1);	
Data[1] = IIC_Read_Byte(1);	
Data[2] = IIC_Read_Byte(1);	
Data[3] = IIC_Read_Byte(1);
Data[4] = IIC_Read_Byte(1);	
Data[5] = IIC_Read_Byte(0);
/* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */
/* 发送I2C总线停止信号 */
IIC_Stop();

cmd_fail: /* 命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 /
/
发送I2C总线停止信号 */
IIC_Stop();

// u8 i;
// u8 fifo_wr_ptr;
// u8 firo_rd_ptr;
// u8 number_tp_read;
// //Get the FIFO_WR_PTR
// fifo_wr_ptr = max30102_Bus_Read(REG_FIFO_WR_PTR);
// //Get the FIFO_RD_PTR
// firo_rd_ptr = max30102_Bus_Read(REG_FIFO_RD_PTR);
//
// number_tp_read = fifo_wr_ptr - firo_rd_ptr;
//
// //for(i=0;i<number_tp_read;i++){
// if(number_tp_read>0){
// IIC_ReadBytes(max30102_WR_address,REG_FIFO_DATA,Data,6);
// }

//max30102_Bus_Write(REG_FIFO_RD_PTR,fifo_wr_ptr);

}

void max30102_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);	
GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOB, &GPIO_InitStructure);

IIC_Init();

max30102_reset();

// max30102_Bus_Write(REG_MODE_CONFIG, 0x0b); //mode configuration : temp_en[3] MODE[2:0]=010 HR only enabled 011 SP02 enabled
// max30102_Bus_Write(REG_INTR_STATUS_2, 0xF0); //open all of interrupt
// max30102_Bus_Write(REG_INTR_STATUS_1, 0x00); //all interrupt clear
// max30102_Bus_Write(REG_INTR_ENABLE_2, 0x02); //DIE_TEMP_RDY_EN
// max30102_Bus_Write(REG_TEMP_CONFIG, 0x01); //SET TEMP_EN

// max30102_Bus_Write(REG_SPO2_CONFIG, 0x47); //SPO2_SR[4:2]=001 100 per second

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值