1 簡 介
最近,想學角度融合算法在網上買一個JY61的模塊。他們家的模塊用起來還不錯。模塊分為串口通訊和IIC通訊的。串口讀取數據他們家有例程,我就不說了。想分享給大家這個模塊的IIC是怎么去讀取MPU6050芯片數據的。
想要讀取MPU6050芯片,其實就是通過IIC去操作讀取寄存器。大致過程就是STM32和MPU6050先建立好IIC通訊。再去初始化MPU6050芯片。然后單片機再去讀取寄存器,就能把數據讀取出來了。
1.png (92.36 KB)
下載附件
2020-6-7 00:11 上傳
2 配置32單片機的IIC引腳
根據你32單片機的原理圖,找到你的IIC引腳。
a 時鐘RCC的配置,以我自己寫的為例子。
b GPIO口的配置
注意:SCL和SDA都得接上兩個4.7K的電阻。不然你是讀取不到MPU6050的數據。
c 32的IIC的配置
3 初始化 MPU6050
void MPU6050_Initialize()
{
MPU6050_I2C_ByteWrite(0xd0,0x00,MPU6050_RA_PWR_MGMT_1);
MPU6050_I2C_ByteWrite(0xd0,0x07,MPU6050_RA_SMPLRT_DIV);
MPU6050_I2C_ByteWrite(0xd0,0x06,MPU6050_RA_CONFIG);
MPU6050_I2C_ByteWrite(0xd0,0x01,MPU6050_RA_ACCEL_CONFIG);
MPU6050_I2C_ByteWrite(0xd0,0x18,MPU6050_RA_GYRO_CONFIG);
}
注意:0xD0 表示 MPU6050 的地址。MPU6050有 8 位的地址,前 7 位由 WHO AM I 確定,第 8 位由 AD0 的電平決定。WHO AM I 默認值是 0x68H(1101000B),AD0 接低電平,所以 MPU6050 的 I2C 地址是 0xD0H(11010000B)。
4 核心讀取程序
總結: 發送開始信號 -> 起始成功? -> 發送 MPU6050 地址、狀態(寫)-> 寫地址成功? -> 發送 MPU6050內部某個待寫寄存器地址 -> 發送成功? -> 發送要寫入的內容 -> 發送成功? -> 發送結束信號
void MPU6050_I2C_BufferRead(u8 slaveAddr, u8* pBuffer, u8 readAddr, u16 NumByteToRead)
{
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
I2C_GenerateSTART(I2C1, ENABLE);//發送開始條件
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//在EV5上測試并清除
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Transmitter); //發送MOU6050地址進行寫操作
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//在EV6上測試并清除
I2C_Cmd(I2C1, ENABLE);//通過再次設置PE位來清除EV6
I2C_SendData(I2C1, readAddr);//發送MPU6050的內部地址來寫入
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));//在EV8上測試并清除
I2C_GenerateSTART(I2C1, ENABLE);//第二次發送STRAT條件
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));//在EV5上測試并清除
I2C_Send7bitAddress(I2C1, slaveAddr, I2C_Direction_Receiver);//發送MPU6050地址進行寫操作
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));//在EV6上測試并清除
while(NumByteToRead)//當有數據被讀取到的時候
{
if(NumByteToRead == 1)
{
I2C_AcknowledgeConfig(I2C1, DISABLE);//Acknowledge不使能
I2C_GenerateSTOP(I2C1, ENABLE);//發送停止條件
}
if(I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED))//在EV7上測試并清除
{
*pBuffer = I2C_ReceiveData(I2C1);//從MPU6050讀取一個字節
pBuffer++;//指向將保存讀取的字節的下一個位置
NumByteToRead--;//讀取字節計數器減一
}
}
I2C_AcknowledgeConfig(I2C1, ENABLE);//啟用確認以準備再次接收
}
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|