论坛» 活动中心» 板卡试用

MAX30100 的IIC通讯

菜鸟
2018-12-02 13:07 1楼

心跳检测模块在网上有很多,但是资料比较丰富的是MAX30100和MAX30102两种,我购买的是MAX30100。

12312312.png以上是该模块的寄存器表,如有兴趣的兄弟可以下载该模块的详细规格书。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;


到此 初始化该变量完成。


具体代码争取下周末能够有时间写出来。


高工
2018-12-06 14:46 2楼

多来点图哦~

院士
2018-12-11 12:41 3楼

其实吧

帖子是可以插入源代码的,楼主现在的代码格式,真让人心疼啊。

共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]