找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1150|回復(fù): 0
收起左側(cè)

用stm32讀取6050(4)

[復(fù)制鏈接]
ID:335302 發(fā)表于 2018-11-22 17:35 | 顯示全部樓層 |閱讀模式
不會發(fā)附件   有些被禁止 有些發(fā)不了  算了 還是Ctrlc  ctrlv 吧#include "i2c.h"


void I2C_GPIO_Init(void){ //I2C接口初始化
        GPIO_InitTypeDef  GPIO_InitStructure;        
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC,ENABLE);      
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); //啟動I2C功能
    GPIO_InitStructure.GPIO_Pin = I2C_SCL | I2C_SDA; //選擇端口號                     
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; //選擇IO接口工作方式      
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //設(shè)置IO接口速度(2/10/50MHz)   
        GPIO_Init(I2CPORT, &GPIO_InitStructure);
}

void I2C_Configuration(void){ //I2C初始化
        I2C_InitTypeDef  I2C_InitStructure;
        I2C_GPIO_Init(); //先設(shè)置GPIO接口的狀態(tài)
        I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;//設(shè)置為I2C模式
        I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
        I2C_InitStructure.I2C_OwnAddress1 = HostAddress; //主機地址(從機不得用此地址)
        I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;//允許應(yīng)答
        I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式
        I2C_InitStructure.I2C_ClockSpeed = BusSpeed; //總線速度設(shè)置        
        I2C_Init(I2C1,&I2C_InitStructure);
        I2C_Cmd(I2C1,ENABLE);//開啟I2C                                       
}

void I2C_SAND_BUFFER(u8 SlaveAddr,u8 WriteAddr,u8* pBuffer,u16 NumByteToWrite){ //I2C發(fā)送數(shù)據(jù)串(器件地址,內(nèi)部地址,寄存器,數(shù)量)
        I2C_GenerateSTART(I2C1,ENABLE);//產(chǎn)生起始位
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //清除EV5
        I2C_Send7bitAddress(I2C1,SlaveAddr,I2C_Direction_Transmitter);//發(fā)送器件地址
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//清除EV6
        I2C_SendData(I2C1,WriteAddr); //內(nèi)部功能地址
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//移位寄存器非空,數(shù)據(jù)寄存器已空,產(chǎn)生EV8,發(fā)送數(shù)據(jù)到DR既清除該事件
        while(NumByteToWrite--){ //循環(huán)發(fā)送數(shù)據(jù)       
                I2C_SendData(I2C1,*pBuffer); //發(fā)送數(shù)據(jù)
                pBuffer++; //數(shù)據(jù)指針移位
                while (!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));//清除EV8
        }
        I2C_GenerateSTOP(I2C1,ENABLE);//產(chǎn)生停止信號
}
void I2C_SAND_BYTE(u8 SlaveAddr,u8 writeAddr,u8 pBuffer){ //I2C發(fā)送一個字節(jié)(從地址,內(nèi)部地址,內(nèi)容)
        I2C_GenerateSTART(I2C1,ENABLE); //發(fā)送開始信號
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //等待完成       
        I2C_Send7bitAddress(I2C1,SlaveAddr, I2C_Direction_Transmitter); //發(fā)送從器件地址及狀態(tài)(寫入)
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); //等待完成       
        I2C_SendData(I2C1,writeAddr); //發(fā)送從器件內(nèi)部寄存器地址
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
        I2C_SendData(I2C1,pBuffer); //發(fā)送要寫入的內(nèi)容
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //等待完成       
        I2C_GenerateSTOP(I2C1,ENABLE); //發(fā)送結(jié)束信號
}
void I2C_READ_BUFFER(u8 SlaveAddr,u8 readAddr,u8* pBuffer,u16 NumByteToRead){ //I2C讀取數(shù)據(jù)串(器件地址,寄存器,內(nèi)部地址,數(shù)量)
        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); //寫入器件地址
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//清除 EV6
        I2C_Cmd(I2C1,ENABLE);
        I2C_SendData(I2C1,readAddr); //發(fā)送讀的地址
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED)); //清除 EV8
        I2C_GenerateSTART(I2C1,ENABLE); //開啟信號
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT)); //清除 EV5
        I2C_Send7bitAddress(I2C1,SlaveAddr,I2C_Direction_Receiver); //將器件地址傳出,主機為讀
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); //清除EV6
        while(NumByteToRead){
                if(NumByteToRead == 1){ //只剩下最后一個數(shù)據(jù)時進(jìn)入 if 語句
                        I2C_AcknowledgeConfig(I2C1,DISABLE); //最后有一個數(shù)據(jù)時關(guān)閉應(yīng)答位
                        I2C_GenerateSTOP(I2C1,ENABLE);        //最后一個數(shù)據(jù)時使能停止位
                }
                if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)){ //讀取數(shù)據(jù)
                        *pBuffer = I2C_ReceiveData(I2C1);//調(diào)用庫函數(shù)將數(shù)據(jù)取出到 pBuffer
                        pBuffer++; //指針移位
                        NumByteToRead--; //字節(jié)數(shù)減 1
                }
        }
        I2C_AcknowledgeConfig(I2C1,ENABLE);
}
u8 I2C_READ_BYTE(u8 SlaveAddr,u8 readAddr){ //I2C讀取一個字節(jié)
        u8 a;
        while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1,SlaveAddr, I2C_Direction_Transmitter);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_Cmd(I2C1,ENABLE);
        I2C_SendData(I2C1,readAddr);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_GenerateSTART(I2C1,ENABLE);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1,SlaveAddr, I2C_Direction_Receiver);
        while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
        I2C_AcknowledgeConfig(I2C1,DISABLE); //最后有一個數(shù)據(jù)時關(guān)閉應(yīng)答位
        I2C_GenerateSTOP(I2C1,ENABLE);        //最后一個數(shù)據(jù)時使能停止位
        a = I2C_ReceiveData(I2C1);
        return a;
}

/*
選擇IO接口工作方式:
GPIO_Mode_AIN 模擬輸入
GPIO_Mode_IN_FLOATING 浮空輸入
GPIO_Mode_IPD 下拉輸入
GPIO_Mode_IPU 上拉輸入
GPIO_Mode_Out_PP 推挽輸出
GPIO_Mode_Out_OD 開漏輸出
GPIO_Mode_AF_PP 復(fù)用推挽輸出
GPIO_Mode_AF_OD 復(fù)用開漏輸出
*/



回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表