找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5975|回复: 3
打印 上一主题 下一主题
收起左侧

STM32驱动MAX30102源码

[复制链接]
跳转到指定楼层
楼主
ID:80903 发表于 2019-1-4 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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. /*************************************************
  11. 函数: fputc(int ch, FILE *f)
  12. 功能: 重定向c库函数printf到USART1
  13. 参数: 无
  14. 返回: 无
  15. **************************************************/
  16. int fputc(int ch, FILE *f)
  17. {
  18.         USART_SendData(USART1, (unsigned char) ch);
  19.         while (!(USART1->SR & USART_FLAG_TXE));
  20.         return (ch);
  21. }




  22. /*************************************************
  23. 函数: void main_init(void)
  24. 功能: main初始化
  25. 参数: 无
  26. 返回: 无
  27. **************************************************/
  28. void main_init(void)
  29. {
  30.         Usart_Init();
  31.         //I2C1_GPIO_Config();
  32.         //I2C1_Mode_config();
  33.         //I2C1_Configuration();
  34.         bsp_InitI2C();
  35.         delay_init(72);            //延时初始化
  36. }

  37. extern u8 max30102_Bus_Read(u8 Register_Address);
  38. extern void max30102_init(void);

  39. /*************************************************
  40. 函数: int main(void)
  41. 功能: main主函数
  42. 参数: 无
  43. 返回: 无
  44. **************************************************/
  45. int main(void)
  46. {
  47.         u8 temp_num=0;
  48.         main_init();
  49.         
  50.         max30102_init();
  51.         
  52.         printf("\r\n MAX30102  init  \r\n");

  53.         
  54.         while(1)
  55.         {
  56.                 delay_ms(1000);            
  57.                 max30102_init();
  58.                 temp_num = max30102_Bus_Read(0x1f);
  59.                 printf("当前温度 = %d\r\n",temp_num);
  60.         }

  61. }


  62. #define max30102_WR_address 0xAE

  63. u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data)
  64. {

  65.         /* 采用串行EEPROM随即读取指令序列,连续读取若干字节 */

  66.         /* 第1步:发起I2C总线启动信号 */
  67.         i2c_Start();

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

  70.         /* 第3步:发送ACK */
  71.         if (i2c_WaitAck() != 0)
  72.         {
  73.                 goto cmd_fail;        /* EEPROM器件无应答 */
  74.         }

  75.         /* 第4步:发送字节地址 */
  76.         i2c_SendByte(Register_Address);
  77.         if (i2c_WaitAck() != 0)
  78.         {
  79.                 goto cmd_fail;        /* EEPROM器件无应答 */
  80.         }
  81.         
  82.         /* 第5步:开始写入数据 */
  83.         i2c_SendByte(Word_Data);

  84.         /* 第6步:发送ACK */
  85.         if (i2c_WaitAck() != 0)
  86.         {
  87.                 goto cmd_fail;        /* EEPROM器件无应答 */
  88.         }

  89.         /* 发送I2C总线停止信号 */
  90.         i2c_Stop();
  91.         return 1;        /* 执行成功 */

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



  97. u8 max30102_Bus_Read(u8 Register_Address)
  98. {
  99.         u8  data;


  100.         /* 第1步:发起I2C总线启动信号 */
  101.         i2c_Start();

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

  104.         /* 第3步:发送ACK */
  105.         if (i2c_WaitAck() != 0)
  106.         {
  107.                 goto cmd_fail;        /* EEPROM器件无应答 */
  108.         }

  109.         /* 第4步:发送字节地址, */
  110.         i2c_SendByte((uint8_t)Register_Address);
  111.         if (i2c_WaitAck() != 0)
  112.         {
  113.                 goto cmd_fail;        /* EEPROM器件无应答 */
  114.         }
  115.         

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

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

  120.         /* 第8步:发送ACK */
  121.         if (i2c_WaitAck() != 0)
  122.         {
  123.                 goto cmd_fail;        /* EEPROM器件无应答 */
  124.         }

  125.         /* 第9步:读取数据 */
  126.         {
  127.                 data = i2c_ReadByte();        /* 读1个字节 */

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

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


  138. void max30102_FIFO_Read(u8 Register_Address,u16  Word_Data[][2],u8 count)
  139. {
  140.         u8 i=0;
  141.         u8 no = count;
  142.         u8 data1, data2;
  143.         /* 第1步:发起I2C总线启动信号 */
  144.         i2c_Start();

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

  147.         /* 第3步:发送ACK */
  148.         if (i2c_WaitAck() != 0)
  149.         {
  150.                 goto cmd_fail;        /* EEPROM器件无应答 */
  151.         }

  152.         /* 第4步:发送字节地址, */
  153.         i2c_SendByte((uint8_t)Register_Address);
  154.         if (i2c_WaitAck() != 0)
  155.         {
  156.                 goto cmd_fail;        /* EEPROM器件无应答 */
  157.         }
  158.         

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

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

  163.         /* 第8步:发送ACK */
  164.         if (i2c_WaitAck() != 0)
  165.         {
  166.                 goto cmd_fail;        /* EEPROM器件无应答 */
  167.         }

  168.         /* 第9步:读取数据 */
  169.         while (no)
  170.         {
  171.                 data1 = i2c_ReadByte();        
  172.                 i2c_Ack();
  173.                 data2 = i2c_ReadByte();
  174.                 i2c_Ack();
  175.                 Word_Data[i][0] = (((u16)data1 << 8) | data2);  //

  176.                
  177.                 data1 = i2c_ReadByte();        
  178.                 i2c_Ack();
  179.                 data2 = i2c_ReadByte();
  180.                 if(1==no)
  181.                         i2c_NAck();        /* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */
  182.                 else
  183.                         i2c_Ack();
  184.                 Word_Data[i][1] = (((u16)data1 << 8) | data2);

  185.                 no--;        
  186.                 i++;
  187.         }
  188.         /* 发送I2C总线停止信号 */
  189.         i2c_Stop();

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

  194. #define INTERRUPT_REG                                          0X00


  195. void max30102_init()
  196. {
  197.         
  198.         max30102_Bus_Write(0x09, 0x0b);  //mode configuration : temp_en[3]      MODE[2:0]=010 HR only enabled    011 SP02 enabled
  199.         max30102_Bus_Write(0x01, 0xF0); //open all of interrupt
  200.         max30102_Bus_Write(INTERRUPT_REG, 0x00); //all interrupt clear
  201.         max30102_Bus_Write(0x03, 0x02); //DIE_TEMP_RDY_EN
  202.         max30102_Bus_Write(0x21, 0x01); //SET   TEMP_EN

  203.         max30102_Bus_Write(0x0a, 0x47); //SPO2_SR[4:2]=001  100 per second    LED_PW[1:0]=11  16BITS

  204.         max30102_Bus_Write(0x0c, 0x47);
  205.         max30102_Bus_Write(0x0d, 0x47);
  206.                                                                                        
  207. }
复制代码

所有资料51hei提供下载:
使用模拟iic_MAX30102_for_stm32.7z (383.17 KB, 下载次数: 110)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-1-4 17:00 | 只看该作者
不要发本站已有的重复内容,建议先在搜索栏搜索一下
回复

使用道具 举报

板凳
ID:474381 发表于 2019-1-31 16:23 来自手机 | 只看该作者
楼主有没i2.c文件库的函数,跪求一下
回复

使用道具 举报

地板
ID:68641 发表于 2021-7-13 01:30 | 只看该作者
不能用 大家不用下载了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表