我写了一段程序,想通过I2C与GY-521陀螺仪通信,结果受到的全是相同的值,这是为什么??
#include <stdint.h>
#include <stdbool.h>
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"
#include "driverlib/adc.h"
#include "driverlib/pwm.h"
#include "driverlib/i2c.h"
#define SLAVE_ADDR 0x68//从机地址为GY-521的地址0X68
#define uint32 unsigned int
//串口初始化
void UARTINIT()
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
//使能 UART0
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
//
UARTClockSourceSet(UART0_BASE, UART_CLOCK_PIOSC);
//
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
//设置传输的速率
UARTStdioConfig(0, 115200, 16000000);
}
int main(void)
{
uint32 a;
SysCtlClockSet(SYSCTL_SYSDIV_5 |SYSCTL_USE_PLL|SYSCTL_OSC_MAIN |SYSCTL_XTAL_16MHZ);
UARTINIT();
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
SysCtlPeripheralEnable(SYSCTL_PERIPH_I2C0);
//PB2,PB3
GPIOPinTypeI2C(GPIO_PORTB_BASE, GPIO_PIN_2 | GPIO_PIN_3);
I2CMasterInitExpClk(I2C0_BASE,SysCtlClockGet(),false);
I2CMasterSlaveAddrSet(I2C0_BASE,SLAVE_ADDR,true);
//I2CMasterBusBusy()
while(1)
{
while(I2CMasterErr(I2C0_BASE));
I2CMasterControl(I2C0_BASE,I2C_MASTER_CMD_SINGLE_RECEIVE);
a = I2CMasterDataGet(I2C0_BASE);
//
while(I2CMasterBusy(I2C0_BASE));
UARTprintf("%02x",a);
}
}
Michael Sun:
这个陀螺仪我也没调过,不过一般来说这类I2C设备不是直接就能读出结果的呀,
得先把寄存器地址啥的写进去,然后再读才行。看看陀螺仪的手册上要求I2C怎么操作的?
这样直接读的未必是数据寄存器的值。
X tank:
回复 Michael Sun:
地址为0x68,用I2CMasterSlaveAddrSet设置的,这样就行了????
Michael Sun:
回复 X tank:
这个0x68只是陀螺仪在I2C总线上的设备地址吧。
陀螺仪内部会有一系列的配置、状态、数据寄存器,他们都有自己的地址和寻址方式的。