標(biāo)題:
使用模擬iic_MAX30102_for_stm32源程序
[打印本頁]
作者:
清楓葉
時(shí)間:
2018-12-22 16:55
標(biāo)題:
使用模擬iic_MAX30102_for_stm32源程序
#define max30102_WR_address 0xAE
u8 max30102_Bus_Write(u8 Register_Address, u8 Word_Data)
{
/* 采用串行EEPROM隨即讀取指令序列,連續(xù)讀取若干字節(jié) */
/* 第1步:發(fā)起I2C總線啟動(dòng)信號(hào) */
i2c_Start();
/* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_WR); /* 此處是寫指令 */
/* 第3步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第4步:發(fā)送字節(jié)地址 */
i2c_SendByte(Register_Address);
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第5步:開始寫入數(shù)據(jù) */
i2c_SendByte(Word_Data);
/* 第6步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 發(fā)送I2C總線停止信號(hào) */
i2c_Stop();
return 1; /* 執(zhí)行成功 */
cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號(hào),避免影響I2C總線上其他設(shè)備 */
/* 發(fā)送I2C總線停止信號(hào) */
i2c_Stop();
return 0;
}
u8 max30102_Bus_Read(u8 Register_Address)
{
u8 data;
/* 第1步:發(fā)起I2C總線啟動(dòng)信號(hào) */
i2c_Start();
/* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_WR); /* 此處是寫指令 */
/* 第3步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第4步:發(fā)送字節(jié)地址, */
i2c_SendByte((uint8_t)Register_Address);
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第6步:重新啟動(dòng)I2C總線。下面開始讀取數(shù)據(jù) */
i2c_Start();
/* 第7步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_RD); /* 此處是讀指令 */
/* 第8步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第9步:讀取數(shù)據(jù) */
{
data = i2c_ReadByte(); /* 讀1個(gè)字節(jié) */
i2c_NAck(); /* 最后1個(gè)字節(jié)讀完后,CPU產(chǎn)生NACK信號(hào)(驅(qū)動(dòng)SDA = 1) */
}
/* 發(fā)送I2C總線停止信號(hào) */
i2c_Stop();
return data; /* 執(zhí)行成功 返回data值 */
cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號(hào),避免影響I2C總線上其他設(shè)備 */
/* 發(fā)送I2C總線停止信號(hào) */
i2c_Stop();
return 0;
}
void max30102_FIFO_Read(u8 Register_Address,u16 Word_Data[][2],u8 count)
{
u8 i=0;
u8 no = count;
u8 data1, data2;
/* 第1步:發(fā)起I2C總線啟動(dòng)信號(hào) */
i2c_Start();
/* 第2步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_WR); /* 此處是寫指令 */
/* 第3步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第4步:發(fā)送字節(jié)地址, */
i2c_SendByte((uint8_t)Register_Address);
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第6步:重新啟動(dòng)I2C總線。下面開始讀取數(shù)據(jù) */
i2c_Start();
/* 第7步:發(fā)起控制字節(jié),高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */
i2c_SendByte(max30102_WR_address | I2C_RD); /* 此處是讀指令 */
/* 第8步:發(fā)送ACK */
if (i2c_WaitAck() != 0)
{
goto cmd_fail; /* EEPROM器件無應(yīng)答 */
}
/* 第9步:讀取數(shù)據(jù) */
while (no)
{
data1 = i2c_ReadByte();
i2c_Ack();
data2 = i2c_ReadByte();
i2c_Ack();
Word_Data[i][0] = (((u16)data1 << 8) | data2); //
data1 = i2c_ReadByte();
i2c_Ack();
data2 = i2c_ReadByte();
if(1==no)
i2c_NAck(); /* 最后1個(gè)字節(jié)讀完后,CPU產(chǎn)生NACK信號(hào)(驅(qū)動(dòng)SDA = 1) */
else
i2c_Ack();
Word_Data[i][1] = (((u16)data1 << 8) | data2);
no--;
i++;
}
/* 發(fā)送I2C總線停止信號(hào) */
i2c_Stop();
cmd_fail: /* 命令執(zhí)行失敗后,切記發(fā)送停止信號(hào),避免影響I2C總線上其他設(shè)備 */
/* 發(fā)送I2C總線停止信號(hào) */
i2c_Stop();
}
#define INTERRUPT_REG 0X00
復(fù)制代碼
全部資料51hei下載地址:
使用模擬iic_MAX30102_for_stm32.7z
(371.91 KB, 下載次數(shù): 39)
2018-12-22 20:34 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
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