標(biāo)題: 使用模擬iic_MAX30102_for_stm32源程序 [打印本頁]

作者: 清楓葉    時(shí)間: 2018-12-22 16:55
標(biāo)題: 使用模擬iic_MAX30102_for_stm32源程序
  1. #define max30102_WR_address 0xAE

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

  4.         /* 采用串行EEPROM隨即讀取指令序列,連續(xù)讀取若干字節(jié) */

  5.         /* 第1步:發(fā)起I2C總線啟動(dòng)信號(hào) */
  6.         i2c_Start();

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

  9.         /* 第3步:發(fā)送ACK */
  10.         if (i2c_WaitAck() != 0)
  11.         {
  12.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  13.         }

  14.         /* 第4步:發(fā)送字節(jié)地址 */
  15.         i2c_SendByte(Register_Address);
  16.         if (i2c_WaitAck() != 0)
  17.         {
  18.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  19.         }
  20.         
  21.         /* 第5步:開始寫入數(shù)據(jù) */
  22.         i2c_SendByte(Word_Data);

  23.         /* 第6步:發(fā)送ACK */
  24.         if (i2c_WaitAck() != 0)
  25.         {
  26.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  27.         }

  28.         /* 發(fā)送I2C總線停止信號(hào) */
  29.         i2c_Stop();
  30.         return 1;        /* 執(zhí)行成功 */

  31. cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號(hào),避免影響I2C總線上其他設(shè)備 */
  32.         /* 發(fā)送I2C總線停止信號(hào) */
  33.         i2c_Stop();
  34.         return 0;
  35. }



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


  39.         /* 第1步:發(fā)起I2C總線啟動(dòng)信號(hào) */
  40.         i2c_Start();

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

  43.         /* 第3步:發(fā)送ACK */
  44.         if (i2c_WaitAck() != 0)
  45.         {
  46.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  47.         }

  48.         /* 第4步:發(fā)送字節(jié)地址, */
  49.         i2c_SendByte((uint8_t)Register_Address);
  50.         if (i2c_WaitAck() != 0)
  51.         {
  52.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  53.         }
  54.         

  55.         /* 第6步:重新啟動(dòng)I2C總線。下面開始讀取數(shù)據(jù) */
  56.         i2c_Start();

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

  59.         /* 第8步:發(fā)送ACK */
  60.         if (i2c_WaitAck() != 0)
  61.         {
  62.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  63.         }

  64.         /* 第9步:讀取數(shù)據(jù) */
  65.         {
  66.                 data = i2c_ReadByte();        /* 讀1個(gè)字節(jié) */

  67.                 i2c_NAck();        /* 最后1個(gè)字節(jié)讀完后,CPU產(chǎn)生NACK信號(hào)(驅(qū)動(dòng)SDA = 1) */
  68.         }
  69.         /* 發(fā)送I2C總線停止信號(hào) */
  70.         i2c_Stop();
  71.         return data;        /* 執(zhí)行成功 返回data值 */

  72. cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號(hào),避免影響I2C總線上其他設(shè)備 */
  73.         /* 發(fā)送I2C總線停止信號(hào) */
  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步:發(fā)起I2C總線啟動(dòng)信號(hào) */
  83.         i2c_Start();

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

  86.         /* 第3步:發(fā)送ACK */
  87.         if (i2c_WaitAck() != 0)
  88.         {
  89.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  90.         }

  91.         /* 第4步:發(fā)送字節(jié)地址, */
  92.         i2c_SendByte((uint8_t)Register_Address);
  93.         if (i2c_WaitAck() != 0)
  94.         {
  95.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  96.         }
  97.         

  98.         /* 第6步:重新啟動(dòng)I2C總線。下面開始讀取數(shù)據(jù) */
  99.         i2c_Start();

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

  102.         /* 第8步:發(fā)送ACK */
  103.         if (i2c_WaitAck() != 0)
  104.         {
  105.                 goto cmd_fail;        /* EEPROM器件無應(yīng)答 */
  106.         }

  107.         /* 第9步:讀取數(shù)據(jù) */
  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個(gè)字節(jié)讀完后,CPU產(chǎn)生NACK信號(hào)(驅(qū)動(dòng)SDA = 1) */
  121.                 else
  122.                         i2c_Ack();
  123.                 Word_Data[i][1] = (((u16)data1 << 8) | data2);

  124.                 no--;        
  125.                 i++;
  126.         }
  127.         /* 發(fā)送I2C總線停止信號(hào) */
  128.         i2c_Stop();

  129. cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號(hào),避免影響I2C總線上其他設(shè)備 */
  130.         /* 發(fā)送I2C總線停止信號(hào) */
  131.         i2c_Stop();
  132. }

  133. #define INTERRUPT_REG                                          0X00
復(fù)制代碼
全部資料51hei下載地址:
使用模擬iic_MAX30102_for_stm32.7z (371.91 KB, 下載次數(shù): 39)


作者: 598969    時(shí)間: 2020-2-11 16:34
樓主在嗎?這個(gè)程序里FIFO里的樣本數(shù)據(jù)只能讀前3位,后3位讀不了。你出現(xiàn)了這個(gè)情況嗎?




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1