久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10082|回復: 10
打印 上一主題 下一主題
收起左側

使用模擬iic_MAX30102_for_stm32源碼

  [復制鏈接]
跳轉到指定樓層
樓主
ID:402056 發表于 2018-9-25 10:59 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
max30102程序 stm32

單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include "usart.h"
  3. #include "ultrasonic.h"
  4. #include "stm32f10x_gpio.h"
  5. #include "stm32f10x_i2c.h"
  6. #include "delay.h"//延時函數

  7. #include <stdio.h>
  8. #include <math.h>
  9. #include "bsp_i2c_gpio.h"

  10. //#define SAMPLE_50   //如果定義此宏就是50采樣率   否則是100

  11. #define PYTHON_USED
  12. /*************************************************
  13. 函數: fputc(int ch, FILE *f)
  14. 功能: 重定向c庫函數printf到USART1
  15. 參數: 無
  16. 返回: 無
  17. **************************************************/
  18. int fputc(int ch, FILE *f)
  19. {
  20.         USART_SendData(USART1, (unsigned char) ch);
  21.         while (!(USART1->SR & USART_FLAG_TXE));
  22.         return (ch);
  23. }


  24. /*************************************************
  25. 函數: void main_init(void)
  26. 功能: main初始化
  27. 參數: 無
  28. 返回: 無
  29. **************************************************/
  30. void main_init(void)
  31. {
  32.         Usart_Init();
  33.         //I2C1_GPIO_Config();
  34.         //I2C1_Mode_config();
  35.         //I2C1_Configuration();
  36.         bsp_InitI2C();
  37.         delay_init(72);            //延時初始化
  38. }

  39. extern void test_max30102_fun(void);
  40. extern u8 max30102_Bus_Read(u8 Register_Address);
  41. extern void max30102_init(void);

  42. /*************************************************
  43. 函數: int main(void)
  44. 功能: main主函數
  45. 參數: 無
  46. 返回: 無
  47. **************************************************/
  48. int main(void)
  49. {
  50.         u8 temp_num=0;
  51.         main_init();
  52.         
  53.         max30102_init();
  54.         
  55.         printf("\r\n MAX30102  init  \r\n");

  56.         
  57. #if 0        
  58.         while(1)
  59.         {
  60.                 delay_ms(1000);            
  61.                 max30102_init();
  62.                 temp_num = max30102_Bus_Read(0x1f);
  63.                 printf("當前溫度 = %d\r\n",temp_num);
  64.         }
  65. #endif

  66.         while(1)
  67.         {        
  68.                 test_max30102_fun();
  69.         }
  70. }




  71. #define max30102_WR_address 0xAE

  72. u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data)
  73. {

  74.         /* 采用串行EEPROM隨即讀取指令序列,連續讀取若干字節 */

  75.         /* 第1步:發起I2C總線啟動信號 */
  76.         i2c_Start();

  77.         /* 第2步:發起控制字節,高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  78.         i2c_SendByte(max30102_WR_address | I2C_WR);        /* 此處是寫指令 */

  79.         /* 第3步:發送ACK */
  80.         if (i2c_WaitAck() != 0)
  81.         {
  82.                 goto cmd_fail;        /* EEPROM器件無應答 */
  83.         }

  84.         /* 第4步:發送字節地址 */
  85.         i2c_SendByte(Register_Address);
  86.         if (i2c_WaitAck() != 0)
  87.         {
  88.                 goto cmd_fail;        /* EEPROM器件無應答 */
  89.         }
  90.         
  91.         /* 第5步:開始寫入數據 */
  92.         i2c_SendByte(Word_Data);

  93.         /* 第6步:發送ACK */
  94.         if (i2c_WaitAck() != 0)
  95.         {
  96.                 goto cmd_fail;        /* EEPROM器件無應答 */
  97.         }

  98.         /* 發送I2C總線停止信號 */
  99.         i2c_Stop();
  100.         return 1;        /* 執行成功 */

  101. cmd_fail: /* 命令執行失敗后,切記發送停止信號,避免影響I2C總線上其他設備 */
  102.         /* 發送I2C總線停止信號 */
  103.         i2c_Stop();
  104.         return 0;
  105. }



  106. u8 max30102_Bus_Read(u8 Register_Address)
  107. {
  108.         u8  data;


  109.         /* 第1步:發起I2C總線啟動信號 */
  110.         i2c_Start();

  111.         /* 第2步:發起控制字節,高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  112.         i2c_SendByte(max30102_WR_address | I2C_WR);        /* 此處是寫指令 */

  113.         /* 第3步:發送ACK */
  114.         if (i2c_WaitAck() != 0)
  115.         {
  116.                 goto cmd_fail;        /* EEPROM器件無應答 */
  117.         }

  118.         /* 第4步:發送字節地址, */
  119.         i2c_SendByte((uint8_t)Register_Address);
  120.         if (i2c_WaitAck() != 0)
  121.         {
  122.                 goto cmd_fail;        /* EEPROM器件無應答 */
  123.         }
  124.         

  125.         /* 第6步:重新啟動I2C總線。下面開始讀取數據 */
  126.         i2c_Start();

  127.         /* 第7步:發起控制字節,高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  128.         i2c_SendByte(max30102_WR_address | I2C_RD);        /* 此處是讀指令 */

  129.         /* 第8步:發送ACK */
  130.         if (i2c_WaitAck() != 0)
  131.         {
  132.                 goto cmd_fail;        /* EEPROM器件無應答 */
  133.         }

  134.         /* 第9步:讀取數據 */
  135.         {
  136.                 data = i2c_ReadByte();        /* 讀1個字節 */

  137.                 i2c_NAck();        /* 最后1個字節讀完后,CPU產生NACK信號(驅動SDA = 1) */
  138.         }
  139.         /* 發送I2C總線停止信號 */
  140.         i2c_Stop();
  141.         return data;        /* 執行成功 返回data值 */

  142. cmd_fail: /* 命令執行失敗后,切記發送停止信號,避免影響I2C總線上其他設備 */
  143.         /* 發送I2C總線停止信號 */
  144.         i2c_Stop();
  145.         return 0;
  146. }


  147. void max30102_FIFO_Read(u8 Register_Address,u32  Word_Data[][2],u8 count)
  148. {
  149.         u8 i=0;
  150.         u8 no = count;
  151.         u8 data1, data2,data3;
  152.         /* 第1步:發起I2C總線啟動信號 */
  153.         i2c_Start();

  154.         /* 第2步:發起控制字節,高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  155.         i2c_SendByte(max30102_WR_address | I2C_WR);        /* 此處是寫指令 */

  156.         /* 第3步:發送ACK */
  157.         if (i2c_WaitAck() != 0)
  158.         {
  159.                 goto cmd_fail;        /* EEPROM器件無應答 */
  160.         }

  161.         /* 第4步:發送字節地址, */
  162.         i2c_SendByte((uint8_t)Register_Address);
  163.         if (i2c_WaitAck() != 0)
  164.         {
  165.                 goto cmd_fail;        /* EEPROM器件無應答 */
  166.         }
  167.         

  168.         /* 第6步:重新啟動I2C總線。下面開始讀取數據 */
  169.         i2c_Start();

  170.         /* 第7步:發起控制字節,高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
  171.         i2c_SendByte(max30102_WR_address | I2C_RD);        /* 此處是讀指令 */

  172.         /* 第8步:發送ACK */
  173.         if (i2c_WaitAck() != 0)
  174.         {
  175.                 goto cmd_fail;        /* EEPROM器件無應答 */
  176.         }

  177.         /* 第9步:讀取數據 */
  178.         while (no)
  179.         {
  180.                 data1 = i2c_ReadByte();        
  181.                 i2c_Ack();
  182.                 data2 = i2c_ReadByte();
  183.                 i2c_Ack();
  184.                 data3 = i2c_ReadByte();
  185.                 i2c_Ack();
  186.                 Word_Data[i][0] = ( (((u32)data1 << 16)&0X30000) | (((u16)data2 << 8)&0XFF00) | data3);  //

  187.                
  188.                 data1 = i2c_ReadByte();        
  189.                 i2c_Ack();
  190.                 data2 = i2c_ReadByte();
  191.                 i2c_Ack();
  192.                 data3 = i2c_ReadByte();
  193.                 if(1==no)
  194.                         i2c_NAck();        /* 最后1個字節讀完后,CPU產生NACK信號(驅動SDA = 1) */
  195.                 else
  196.                         i2c_Ack();
  197.                 Word_Data[i][1] = ( (((u32)data1 << 16)&0X30000) | (((u16)data2 << 8)&0XFF00) | data3);  //

  198.                 no--;        
  199.                 i++;
  200.         }
  201.         /* 發送I2C總線停止信號 */
  202.         i2c_Stop();

  203. cmd_fail: /* 命令執行失敗后,切記發送停止信號,避免影響I2C總線上其他設備 */
  204.         /* 發送I2C總線停止信號 */
  205.         i2c_Stop();
  206. }



  207. #define INTERRUPT_REG                                                          0X00
  208. #define INTERRUPT_REG_A_FULL                                  (0X01<<7)
  209. #define INTERRUPT_REG_PPG_RDY                                  (0X01<<6)
  210. #define INTERRUPT_REG_ALC_OVF                                  (0X01<<5)  
  211. #define INTERRUPT_REG_PROX_INT                                 (0X01<<4)
  212. #define INTERRUPT_REG_PWR_RDY                                  (0X01<<0)

  213. #define INTERRUPT_ENABLE_REG                                          0X02
  214. #define INTERRUPT_ENABLE_REG_A_FULL_EN                 (0X01<<7)
  215. #define INTERRUPT_ENABLE_REG_PPG_RDY_EN                (0X01<<6)
  216. #define INTERRUPT_ENABLE_REG_ALC_OVF_EN          (0X01<<5)  
  217. #define INTERRUPT_ENABLE_REG_PROX_INT_EN         (0X01<<4)

  218. #define INTERRUPT_DIE_TEMP_REG                                          0X03
  219. #define INTERRUPT_DIE_TEMP_REG_DIE_TEMP_EN                 (0X01<<1)

  220. #define INTERRUPT_FIFO_WR_PTR_REG                                          0X04
  221. #define INTERRUPT_OVF_COUNTER_REG                                          0X05
  222. #define INTERRUPT_RD_PTR_REG                                                  0X06
  223. #define INTERRUPT_FIF0_DATA_REG                                                  0X07

  224. #define INTERRUPT_FIFO_CONFIG_REG                                          0X08
  225. #define INTERRUPT_FIFO_CONFIG_REG_SMP_AVE                          (0X00<<5)  //SPM_AVE[2:0] = 000 不要 樣本平均
  226. #define INTERRUPT_FIFO_CONFIG_REG_FIFO_ROLLOVER_EN (0X01<<4)  //  自動翻轉fifo
  227. #define INTERRUPT_FIFO_CONFIG_REG_FIFO_ALL_FULL                (0X0F<<0)  // READ 17 data  for one  interrupt


  228. #define INTERRUPT_MODE_CONFIG_REG                                          0X09
  229. #define INTERRUPT_MODE_CONFIG_REG_SHDN                                 (0X00<<7)  // shutdown control
  230. #define INTERRUPT_MODE_CONFIG_REG_RESET                                (0X00<<6)  // reset  control
  231. #define INTERRUPT_MODE_CONFIG_REG_MODE                                (0X03<<0)  // Spo2  mode


  232. #define INTERRUPT_SPO2_CONFIG_REG                                          0X0a
  233. #define INTERRUPT_SPO2_CONFIG_REG_ADC_RGE                         (0X03<<5)  // SP02_ADC_RGE[1:0]=11

  234. #ifdef SAMPLE_50
  235. #define INTERRUPT_SPO2_CONFIG_REG_SR                                 (0X00<<2)  // SP02_SR[2:0]=000     Sample Rate = 50
  236. #else
  237. #define INTERRUPT_SPO2_CONFIG_REG_SR                                 (0X01<<2)  // SP02_SR[2:0]=001     Sample Rate = 100
  238. #endif

  239. #define INTERRUPT_SPO2_CONFIG_REG_LED_PW                        (0X03<<0)  // SP02_LED_PW[1:0]=11

  240. #define INTERRUPT_LED1_PA_REG                                          0X0C
  241. #define INTERRUPT_LED2_PA_REG                                          0X0D


  242. #define ONES_READ_DATA_BY_FIFO                (32-INTERRUPT_FIFO_CONFIG_REG_FIFO_ALL_FULL)  // READ NUM  data  for one  interrupt


  243. void max30102_init()
  244. {
  245.         max30102_Bus_Write(INTERRUPT_ENABLE_REG, INTERRUPT_ENABLE_REG_A_FULL_EN       |
  246.                                                                                                 INTERRUPT_ENABLE_REG_PPG_RDY_EN  |
  247.                                                                                                 INTERRUPT_ENABLE_REG_ALC_OVF_EN  |
  248.                                                                                                 INTERRUPT_ENABLE_REG_PROX_INT_EN); //all interrupt enable

  249.         max30102_Bus_Write(INTERRUPT_DIE_TEMP_REG, INTERRUPT_DIE_TEMP_REG_DIE_TEMP_EN); //DIE_TEMP_RDY_EN

  250.         max30102_Bus_Write(INTERRUPT_FIFO_WR_PTR_REG, 0x00);   //set FIFO write Pointer reg = 0x00 for clear it
  251.         max30102_Bus_Write(INTERRUPT_OVF_COUNTER_REG, 0x00);        //set Over Flow Counter  reg = 0x00 for clear it
  252.         max30102_Bus_Write(INTERRUPT_RD_PTR_REG, 0x00);        //set FIFO Read Pointer  reg = 0x00 for clear it

  253.         max30102_Bus_Write(INTERRUPT_FIFO_CONFIG_REG,  INTERRUPT_FIFO_CONFIG_REG_SMP_AVE|
  254.                                                                                                         INTERRUPT_FIFO_CONFIG_REG_FIFO_ROLLOVER_EN  |
  255.                                                                                                         INTERRUPT_FIFO_CONFIG_REG_FIFO_ALL_FULL);                                                                                         

  256.         max30102_Bus_Write(INTERRUPT_MODE_CONFIG_REG,  INTERRUPT_MODE_CONFIG_REG_SHDN |
  257.                                                                                                         INTERRUPT_MODE_CONFIG_REG_RESET  |
  258.                                                                                                         INTERRUPT_MODE_CONFIG_REG_MODE);         

  259.         max30102_Bus_Write(INTERRUPT_SPO2_CONFIG_REG,  INTERRUPT_SPO2_CONFIG_REG_ADC_RGE |
  260.                                                                                                         INTERRUPT_SPO2_CONFIG_REG_SR  |
  261.                                                                                                         INTERRUPT_SPO2_CONFIG_REG_LED_PW);         

  262.         
  263.         max30102_Bus_Write(INTERRUPT_LED1_PA_REG, 0xe0);        
  264.         max30102_Bus_Write(INTERRUPT_LED2_PA_REG, 0xe0);        

  265.         
  266. }

  267. #if  1

  268. void test_max30102_fun(void)
  269. {
  270.         u16 temp_num=0;
  271.         u32 fifo_word_buff[ONES_READ_DATA_BY_FIFO][2];
  272.         
  273.         while(1)
  274.         {
  275.                 temp_num = max30102_Bus_Read(INTERRUPT_REG);
  276. #ifdef        PYTHON_USED
  277.                 if( INTERRUPT_REG_PPG_RDY&temp_num )
  278.                 {
  279.                         max30102_FIFO_Read(INTERRUPT_FIF0_DATA_REG,fifo_word_buff, 1); //read the hr and spo2 data form fifo
  280.                         
  281.                         Usart1_PutChar(0xA0);
  282.                         Usart1_PutChar(0xE0);
  283.                         printf("%ld",fifo_word_buff[0][0]);
  284.                         Usart1_PutChar(0xDE);
  285.                         Usart1_PutChar(0xAF);
  286.                         
  287.                 }               
  288. #endif
  289.         }
  290. }
  291. #endif
復制代碼

Keil代碼下載:
使用模擬iic_MAX30102_for_stm32.rar (567.97 KB, 下載次數: 260)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:414226 發表于 2018-10-23 19:44 | 只看該作者
能用不
回復

使用道具 舉報

板凳
ID:93224 發表于 2019-1-5 21:18 | 只看該作者
fifo_word_buff[0][0] 這里的數據是血糖、心率中的哪一個?
回復

使用道具 舉報

地板
ID:165276 發表于 2019-1-6 09:24 | 只看該作者
你好,stm32的模擬IIC發送數據不用延時嗎?之前用的51單片機做的時候需要延時,能說一下嗎?剛接觸stm32
回復

使用道具 舉報

5#
ID:538165 發表于 2019-6-1 18:11 | 只看該作者
你好,MAX30102 對里面的延時要求嚴格嗎?
回復

使用道具 舉報

6#
ID:299263 發表于 2019-7-22 17:31 | 只看該作者
終于找到比較全的版本了
回復

使用道具 舉報

7#
ID:593548 發表于 2019-8-3 16:02 | 只看該作者
這代碼有啥用。網上找的全是一個模板的拿來忽悠積分的吧
回復

使用道具 舉報

8#
ID:350895 發表于 2019-12-4 15:17 | 只看該作者
下載學習下   
回復

使用道具 舉報

9#
ID:257542 發表于 2020-12-12 22:14 | 只看該作者
大神,麻煩您給解釋一下,那個數組里的數據怎么轉換成心率跟血氧濃度唄,謝謝啦
回復

使用道具 舉報

10#
ID:118735 發表于 2021-12-19 15:03 | 只看該作者
都是資料沒有項目文件
回復

使用道具 舉報

11#
ID:262 發表于 2021-12-19 21:17 | 只看該作者
王企鵝 發表于 2021-12-19 15:03
都是資料沒有項目文件

項目文件在 MDK-ARM 目錄

51hei.png (40.71 KB, 下載次數: 33)

51hei.png
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 超碰人人91 | 久久五月婷 | 国产成人精品高清久久 | 国产精品18久久久久久白浆动漫 | 午夜精品一区二区三区在线视频 | 日本久久精 | av在线成人 | 久久综合九色综合欧美狠狠 | 国产97久久 | 每日在线更新av | 久久久久久久久99 | 亚洲网站免费看 | 亚洲午夜av久久乱码 | 久久国产精品99久久久久 | 日韩一区二区在线观看 | 欧美日韩综合视频 | 人人干人人干人人 | 亚洲欧美中文日韩在线v日本 | 亚洲精品中文字幕 | 波多野结衣一区二区 | 久久久tv | 国产精品美女久久久久aⅴ国产馆 | 91福利网 | 久久美女网 | 在线观看电影av | 精品久久久久久亚洲国产800 | 久久久青草婷婷精品综合日韩 | 国产乱精品一区二区三区 | 亚洲精品一区二区三区在线 | www.久久| 久久九九99| 91婷婷韩国欧美一区二区 | www亚洲精品 | 免费污视频 | 国产一区二区三区色淫影院 | 国产99久久久国产精品下药 | 国产精品久久国产精品 | 8x国产精品视频一区二区 | 精品国产乱码久久久久久图片 | 精品视频一区二区三区在线观看 | 国产乱码精品一区二区三区忘忧草 |