找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1969|回复: 1
收起左侧

使用模拟iic_MAX30102_for_stm32源程序

[复制链接]
ID:307931 发表于 2018-12-22 16:55 | 显示全部楼层 |阅读模式
  1. #define max30102_WR_address 0xAE

  2. u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data)
  3. {

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

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

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

  9.         /* 第3步:发送ACK */
  10.         if (i2c_WaitAck() != 0)
  11.         {
  12.                 goto cmd_fail;        /* EEPROM器件无应答 */
  13.         }

  14.         /* 第4步:发送字节地址 */
  15.         i2c_SendByte(Register_Address);
  16.         if (i2c_WaitAck() != 0)
  17.         {
  18.                 goto cmd_fail;        /* EEPROM器件无应答 */
  19.         }
  20.         
  21.         /* 第5步:开始写入数据 */
  22.         i2c_SendByte(Word_Data);

  23.         /* 第6步:发送ACK */
  24.         if (i2c_WaitAck() != 0)
  25.         {
  26.                 goto cmd_fail;        /* EEPROM器件无应答 */
  27.         }

  28.         /* 发送I2C总线停止信号 */
  29.         i2c_Stop();
  30.         return 1;        /* 执行成功 */

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



  36. u8 max30102_Bus_Read(u8 Register_Address)
  37. {
  38.         u8  data;


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

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

  43.         /* 第3步:发送ACK */
  44.         if (i2c_WaitAck() != 0)
  45.         {
  46.                 goto cmd_fail;        /* EEPROM器件无应答 */
  47.         }

  48.         /* 第4步:发送字节地址, */
  49.         i2c_SendByte((uint8_t)Register_Address);
  50.         if (i2c_WaitAck() != 0)
  51.         {
  52.                 goto cmd_fail;        /* EEPROM器件无应答 */
  53.         }
  54.         

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

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

  59.         /* 第8步:发送ACK */
  60.         if (i2c_WaitAck() != 0)
  61.         {
  62.                 goto cmd_fail;        /* EEPROM器件无应答 */
  63.         }

  64.         /* 第9步:读取数据 */
  65.         {
  66.                 data = i2c_ReadByte();        /* 读1个字节 */

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

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


  77. void max30102_FIFO_Read(u8 Register_Address,u16  Word_Data[][2],u8 count)
  78. {
  79.         u8 i=0;
  80.         u8 no = count;
  81.         u8 data1, data2;
  82.         /* 第1步:发起I2C总线启动信号 */
  83.         i2c_Start();

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

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

  91.         /* 第4步:发送字节地址, */
  92.         i2c_SendByte((uint8_t)Register_Address);
  93.         if (i2c_WaitAck() != 0)
  94.         {
  95.                 goto cmd_fail;        /* EEPROM器件无应答 */
  96.         }
  97.         

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

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

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

  107.         /* 第9步:读取数据 */
  108.         while (no)
  109.         {
  110.                 data1 = i2c_ReadByte();        
  111.                 i2c_Ack();
  112.                 data2 = i2c_ReadByte();
  113.                 i2c_Ack();
  114.                 Word_Data[i][0] = (((u16)data1 << 8) | data2);  //

  115.                
  116.                 data1 = i2c_ReadByte();        
  117.                 i2c_Ack();
  118.                 data2 = i2c_ReadByte();
  119.                 if(1==no)
  120.                         i2c_NAck();        /* 最后1个字节读完后,CPU产生NACK信号(驱动SDA = 1) */
  121.                 else
  122.                         i2c_Ack();
  123.                 Word_Data[i][1] = (((u16)data1 << 8) | data2);

  124.                 no--;        
  125.                 i++;
  126.         }
  127.         /* 发送I2C总线停止信号 */
  128.         i2c_Stop();

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

  133. #define INTERRUPT_REG                                          0X00
复制代码
全部资料51hei下载地址:
使用模拟iic_MAX30102_for_stm32.7z (371.91 KB, 下载次数: 38)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:430342 发表于 2020-2-11 16:34 | 显示全部楼层
楼主在吗?这个程序里FIFO里的样本数据只能读前3位,后3位读不了。你出现了这个情况吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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