簡體   English   中英

如何使用 STM32F4 從 MAX30100 讀取 FIFO 數據

[英]How to read FIFO Data from MAX30100 using STM32F4

我正在使用 MCU STM32F4 通過 MAX30100( https://img.filipeflop.com/files/download/Datasheet_MAX30100.pdf )監測心率。 我正在嘗試從 FIFO 中讀取 IR 和 RED 數據,但所有返回都是ZERO MAX30100_Get_Num_Samples()方法返回8 我使用 MAX30100 數據表中的偽代碼對代碼進行了建模。 我為我的問題嘗試了幾種解決方案,但都不起作用。 我不知道我是否遵循了從 FIFO 獲取數據的正確方法。 我的代碼:

I2C_HandleTypeDef hi2c3; //i2c used
uint16_t RED[50] = {0}, IR[50] = {0}; //buffers for RED and IR
uint8_t buffOximeter[5];
char buffer[32];

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C3_Init();
  MX_USB_DEVICE_Init();

  MAX30100_Init();

  while (1)
  {
    uint8_t numSamples = MAX30100_Get_Num_Samples();
    MAX30100_Read_HeartBeat(numSamples);

    for(int i = 0; i < numSamples; i++)
    {
        sprintf(buffer, "Amostra %d: %d / %d\n\r", i , IR[i], RED[i]);
        CDC_Transmit_FS((char*)buffer, 50);
    }
  }
}

static void MX_I2C3_Init(void)
{
  hi2c3.Instance = I2C3;
  hi2c3.Init.ClockSpeed = 400000;
  hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c3.Init.OwnAddress1 = 0;
  hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c3.Init.OwnAddress2 = 0;
  hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c3) != HAL_OK)
  {
    Error_Handler();
  }
}

void MAX30100_Init(void)
{
    HAL_I2C_Mem_Write(&hi2c3,0xAE,0x06,1,0x02,1,1000); //set heart rate mode
    HAL_I2C_Mem_Write(&hi2c3,0xAE,0x09,1,0xFF,1,1000); //i50 ledCurrent
    uint8_t sr = 0x01, pw = 0x3;
    HAL_I2C_Mem_Write(&hi2c3,0xAE,0x07,1,(sr<<2)|pw,1,1000); //sr100, pw1600
    HAL_Delay(50);
}

void MAX30100_Read_HeartBeat(uint8_t num)
{
    for(int i=0;i<num;i++)
    {
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0xAE,1,1000); //adress + write mode
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0x02,1,1000); //send fifo_wr_ptr
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0xAF,1,1000); //adress + read mode
        uint8_t data;
        HAL_I2C_Master_Receive(&hi2c3,0x57,&data,1,1000); //read fifo_wr_ptr
        HAL_Delay(100);                                   //STOP
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0xAE,1,1000); //adress + write mode
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0x05,1,1000); //send adress fifo data
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0xAF,1,1000); //adress + read mode
        HAL_I2C_Mem_Read(&hi2c3,0x57,0x05,1,&buffOximeter,4,1000); //read fifo data
        IR[i] = (buffOximeter[0] << 8) | buffOximeter[1];
        RED[i] = (buffOximeter[2] << 8) | buffOximeter[3];
        HAL_Delay(100);                                   //STOP
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0xAE,1,1000); //adress + write mode
        HAL_I2C_Master_Transmit(&hi2c3,0x57,0x04,1,1000); //send adress fifo_rd_ptr
        HAL_Delay(100);
    }
}

int MAX30100_Get_Num_Samples(void)
{
    uint8_t wrPtr, rdPtr;
    HAL_I2C_Mem_Read(&hi2c3,0x57,0x02,1,&wrPtr,1,1000);
    HAL_Delay(50);
    HAL_I2C_Mem_Read(&hi2c3,0x57,0x04,1,&rdPtr,1,1000);
    HAL_Delay(50);
    return (abs( 16 + wrPtr - rdPtr ) % 16);
}

將中斷 output 引腳(引腳 13 低電平有效)連接到 CPU 上的中斷控制引腳。

當設備指示某些事件准備好時,將您的 cpu 設置為中斷

然后,仍然在您的中斷處理程序 function 中,讀取寄存器 0 並確定哪些數據已准備好。

參考的數據表,大約第 14 頁列出了所需的通信事件的順序。 請注意,發布的代碼未遵循指定的通信事件順序

第 16 頁,寄存器 7,指示如何將 SPO2 初始化為所需的操作模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM