心跳检测模块在网上有很多,但是资料比较丰富的是MAX30100和MAX30102两种,我购买的是MAX30100。
以上是该模块的寄存器表,如有兴趣的兄弟可以下载该模块的详细规格书。MAX30100.pdf
首先看看这个模块的通讯方式:该模块采用IIC通讯,最低供电电压为1.7V最高为2.0V,但其模块有LED需要3.1~5V的供电。通讯低电平最高为0.4V,高电平最低为1.4V,频率最高为400kHz。其可以检测血氧浓度并通过温度传感器来矫正。其精度为16位。AD转换速率为1K。该模块默认的ID为0x07。读取ID的方式为:先向模块发送 0XAE 0X06 0X0B 0XAE 0XFF.然后所接收到的数值为ID。记得如果使用模拟IIC需要发送两次开始命令,一次回应命令,一次停止命令,否则可能会导致数据出错。
HAL_StatusTypeDef I2C_MasterTransmit_TXE(I2C_HandleTypeDef *hi2c);
使用以上函数可以发送即能够实现其功能。该函数仅有一个结构体变量分别为:
typedef struct
{
I2C_TypeDef *Instance; /*!< I2C registers base address 寄存器地址 */
I2C_InitTypeDef Init; /*!< I2C communication parameters 通讯参数(见I2C_InitTypeDef结构体说明) */
uint8_t *pBuffPtr; /*!< Pointer to I2C transfer buffer 缓冲区指针(传送内容指针) */
uint16_t XferSize; /*!< I2C transfer size 传输内容大小 */
__IO uint16_t XferCount; /*!< I2C transfer counter */
__IO uint32_t XferOptions; /*!< I2C transfer options */
__IO uint32_t PreviousState; /*!< I2C communication Previous state and mode
context for internal usage 之前的通讯状态 */
DMA_HandleTypeDef *hdmatx; /*!< I2C Tx DMA handle parameters 发送DMA的句柄(具体内容可以自己参考DMA_HandleTypeDef结构体的定义,暂不叙述) */
DMA_HandleTypeDef *hdmarx; /*!< I2C Rx DMA handle parameters 接收DMA的句柄 (具体内容可以自己参考DMA_HandleTypeDef结构体的定义,暂不叙述) */
HAL_LockTypeDef Lock; /*!< I2C locking object IIC锁定对象(一般不锁定为HAL_UNLOCKED) */
__IO HAL_I2C_StateTypeDef State; /*!< I2C communication state IIC通讯状态(见后续HAL_I2C_StateTypeDef枚举变量说明) */
__IO HAL_I2C_ModeTypeDef Mode; /*!< I2C communication mode IIC通讯模式(见后续HAL_I2C_ModeTypeDef你枚举变量说明) */
__IO uint32_t ErrorCode; /*!< I2C Error code 错误代码(一般不初始化) */
__IO uint32_t Devaddress; /*!< I2C Target device address 目标地址(也就是我们模块的ID) */
__IO uint32_t Memaddress; /*!< I2C Target memory address 寄存器地址(就是我们要读取的目标的寄存器地址) */
__IO uint32_t MemaddSize; /*!< I2C Target memory address size 寄存器地址大小() */
__IO uint32_t EventCount; /*!< I2C Event counter */
}I2C_HandleTypeDef;
typedef struct
{
uint32_t ClockSpeed; /*!< Specifies the clock frequency. 速度 我设置为400K,
This parameter must be set to a value lower than 400kHz */
uint32_t DutyCycle; /*!< Specifies the I2C fast mode duty cycle. 这个我一般没有设置
This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */
uint32_t OwnAddress1; /*!< Specifies the first device own address. 设置自己的ID地址
This parameter can be a 7-bit or 10-bit address. */
uint32_t AddressingMode; /*!< Specifies if 7-bit or 10-bit addressing mode is selected. 一般没设置
This parameter can be a value of @ref I2C_addressing_mode */
uint32_t DualAddressMode; /*!< Specifies if dual addressing mode is selected. 一般没有设置
This parameter can be a value of @ref I2C_dual_addressing_mode */
uint32_t OwnAddress2; /*!< Specifies the second device own address if dual addressing mode is selected
This parameter can be a 7-bit address. */
uint32_t GeneralCallMode; /*!< Specifies if general call mode is selected.一般没有设置
This parameter can be a value of @ref I2C_general_call_addressing_mode */
uint32_t NoStretchMode; /*!< Specifies if nostretch mode is selected.一般没有设置
This parameter can be a value of @ref I2C_nostretch_mode */
}I2C_InitTypeDef;
typedef enum
{
HAL_I2C_STATE_RESET = 0x00U, /*!< Peripheral is not yet Initialized */
HAL_I2C_STATE_READY = 0x20U, /*!< Peripheral Initialized and ready for use */
HAL_I2C_STATE_BUSY = 0x24U, /*!< An internal process is ongoing */
HAL_I2C_STATE_BUSY_TX = 0x21U, /*!< Data Transmission process is ongoing */
HAL_I2C_STATE_BUSY_RX = 0x22U, /*!< Data Reception process is ongoing */
HAL_I2C_STATE_LISTEN = 0x28U, /*!< Address Listen Mode is ongoing */
HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*!< Address Listen Mode and Data Transmission
process is ongoing */
HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*!< Address Listen Mode and Data Reception
process is ongoing */
HAL_I2C_STATE_ABORT = 0x60U, /*!< Abort user request ongoing */
HAL_I2C_STATE_TIMEOUT = 0xA0U, /*!< Timeout state */
HAL_I2C_STATE_ERROR = 0xE0U /*!< Error */
}HAL_I2C_StateTypeDef;
typedef enum
{
HAL_I2C_MODE_NONE = 0x00U, /*!< No I2C communication on going */
HAL_I2C_MODE_MASTER = 0x10U, /*!< I2C communication is in Master Mode */
HAL_I2C_MODE_SLAVE = 0x20U, /*!< I2C communication is in Slave Mode */
HAL_I2C_MODE_MEM = 0x40U /*!< I2C communication is in Memory Mode */
}HAL_I2C_ModeTypeDef;
到此 初始化该变量完成。
具体代码争取下周末能够有时间写出来。