Exemplo n.º 1
0
uint8_t MPU6050_Setup(void)
{
	I2C_Setup();

	uint8_t data[2] = {0,0};

	data[0] = MPU6050_CLOCK_PLL_ZGYRO;
	if(I2C_WriteData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_PWR_MGMT_1, data, 1))//电源管理,典型值:0x00(正常启用)
		return 1;
	delay_ms(2);
	data[0] = 0x07;
	if(I2C_WriteData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_SMPLRT_DIV, data, 1))//陀螺仪采样率,典型值:0x04,五分频
		return 2;
	delay_ms(2);
	data[0] = MPU6050_CONFIG_DLPF_CFG_95HZ;
	if(I2C_WriteData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_CONFIG, data, 1))//低通滤波频率,典型值:0x02(截止频率100Hz)
		return 3;
	delay_ms(2);
	data[0] = MPU6050_GYRO_CONFIG_FS_SEL_1000;
	data[1] = MPU6050_ACCEL_CONFIG_HPF_5HZ|MPU6050_ACCEL_CONFIG_FS_SEL_8G;
	I2C_WriteData(MPU6050_DEFAULT_ADDRESS, MPU6050_RA_GYRO_CONFIG, data, 2);//加速计自检、测量范围及高通滤波频率,典型值:0x10(不自检,8G,5Hz)
	delay_ms(10);
	__loop_cnt_acc__ = 0;
	__loop_cnt_gyro__ = 0;
	return 0;
}
Exemplo n.º 2
0
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------
int main(int argc, char **argv)
{ 
	uint32	Counter;
	int16 Temperature;
	uint8 Humidity;
	uint8 HwRev;
	char Mode;	
	
	Counter = 0;
	Mode = 0;
	
	HwRev = GetRaspberryHwRevision();
	
	if((argc > 1) &&  ((argv[1][0]=='S') || (argv[1][0]=='L') || (argv[1][0]=='C'))) Mode = argv[1][0];
		
	if(!Mode) 
	{
		printf("Raspi-SHT21 V3.0.0 by Martin Steppuhn (www.emsystech.de) [" __DATE__ " " __TIME__"]\n");
		printf("Options:\n");
		printf("   S : [20.0 99]\n");	
		printf("   L : [temperature=20.0][humidity=99]\n");	
		printf("   C : [Temperature,20,0][Humidity,99]\n");
		printf("RaspberryHwRevision=%i\r\n",HwRev);
	}	
	
	if(HwRev < 2) 	I2C_Open("/dev/i2c-0");	 // Hardware Revision 1.0
		else		I2C_Open("/dev/i2c-1");  // Hardware Revision 2.0
	I2C_Setup(I2C_SLAVE, 0x40);
	
	if(I2cError)
	{	
		I2C_PrintError();
		exit(1);
	}
			
	SHT21_Read(&Temperature,&Humidity);
	if(Sht21Error == 0)
	{
		if(     Mode == 'S') printf("%.1f\t%u\n",((float)Temperature)/10,Humidity);
		else if(Mode == 'L') printf("temperature=%.1f\nhumidity=%u\n",((float)Temperature)/10,Humidity);
		else if(Mode == 'C') printf("Temperature,%.1f\nHumidity,%u\n",((float)Temperature)/10,Humidity);
		else
		{
			while(1)
			{
				SHT21_Read(&Temperature,&Humidity);
				if(Sht21Error == 0) printf("%lu\t%.1f\t%u\n",Counter++,((float)Temperature)/10,Humidity);
					else		{	PrintSht21Error();	I2cError = 0;	}
				DelayMs(1000);
			}
		}
	}
	else
	{
		PrintSht21Error();
	}
	I2C_Close();
	return(0);
}
Exemplo n.º 3
0
uint8_t US_Setup(uint8_t port) 
{  
  if(I2C_Setup(port, US_ADDR, US_I2C_WAIT)){    
    return 0;
  }
  A_Config(port, MASK_9V);             // enable 9v on this port
  return 1;
}
Exemplo n.º 4
0
/*
 * ----------------------------------------------------------------------------
 * Function Name: I2C_Init
 * Purpose:
 * Params:
 * Returns:
 * Note:
 * ----------------------------------------------------------------------------
 */
void I2C_Init(void)
{
	switch (CSREPR & (BIT6|BIT7))
	{
		case SYS_CLK_100M :
			/* I2C master mode, interrupt enable, fast mode in slave, 7-bits address, 400KHz at 100M */
			I2C_Setup(I2C_ENB|I2C_FAST|I2C_MST_IE|I2C_7BIT|I2C_MASTER_MODE, 0x0031, 0x005A);
			break;
		case SYS_CLK_50M :
			/* I2C master mode, interrupt enable, fast mode in slave, 7-bits address, 400KHz at 50M */
			I2C_Setup(I2C_ENB|I2C_FAST|I2C_MST_IE|I2C_7BIT|I2C_MASTER_MODE, 0x0018, 0x005A);
			break;
		case SYS_CLK_25M :
			/* I2C master mode, interrupt enable, fast mode in slave, 7-bits address, 400KHz at 25M */
			I2C_Setup(I2C_ENB|I2C_FAST|I2C_MST_IE|I2C_7BIT|I2C_MASTER_MODE, 0x000c, 0x005A);
			break;
	}
}
Exemplo n.º 5
0
BMP180::BMP180(unsigned int o, int rpi_version)
{
	if ((o < BMP180_ULTRALOWPOWER) or (o > BMP180_ULTRAHIGHRES))
		throw std::runtime_error("Invalid mode!");
	else
		oss = o;
	
	if ((fd = I2C_Setup(BMP180_ADR, rpi_version)) < 0)
        throw std::runtime_error("Failed to open I2C bus!");
    else
    {   
        this->LoadCalibration();
		this->setBasePressure();
	}
}
Exemplo n.º 6
0
void Setup_MPU6050()
{
	I2C_Setup();

	//Sets sample rate to 1000/1+1 = 500Hz
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_SMPLRT_DIV, 0x01);

	//Disable FSync, 48Hz DLPF
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_CONFIG, 0x03);
	//Disable gyro self tests, scale of 500 degrees/s
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_GYRO_CONFIG, 0x04);
	//Disable accel self tests, scale of +-4g, no DHPF
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_ACCEL_CONFIG, 0x04);
	//Freefall threshold of <|0mg|
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_FF_THR, 0x00);
	//Freefall duration limit of 0
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_FF_DUR, 0x00);
	//Motion threshold of >0mg
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_MOT_THR, 0x00);
	//Motion duration of >0s
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_MOT_DUR, 0x00);
	//Zero motion threshold
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_ZRMOT_THR, 0x00);
	//Zero motion duration threshold
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_ZRMOT_DUR, 0x00);
	//Disable sensor output to FIFO buffer
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_FIFO_EN, 0x00);
	
	//AUX I2C setup
	//Sets AUX I2C to single master control, plus other config
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_MST_CTRL, 0x00);
	//Setup AUX I2C slaves	
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_ADDR, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_REG, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_CTRL, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_ADDR, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_REG, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_CTRL, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_ADDR, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_REG, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_CTRL, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_ADDR, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_REG, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_CTRL, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_ADDR, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_REG, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_DO, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_CTRL, 0x00);
 	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV4_DI, 0x00);
 
 
 	//MPU6050_RA_I2C_MST_STATUS //Read-only
 	//Setup INT pin and AUX I2C pass through
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_INT_PIN_CFG, 0x00);
	//Enable data ready interrupt
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_INT_ENABLE, 0x00);
	
	//MPU6050_RA_DMP_INT_STATUS		//Read-only
	//MPU6050_RA_INT_STATUS 3A		//Read-only
    //MPU6050_RA_ACCEL_XOUT_H 		//Read-only
    //MPU6050_RA_ACCEL_XOUT_L 		//Read-only
    //MPU6050_RA_ACCEL_YOUT_H 		//Read-only
    //MPU6050_RA_ACCEL_YOUT_L 		//Read-only
    //MPU6050_RA_ACCEL_ZOUT_H 		//Read-only
    //MPU6050_RA_ACCEL_ZOUT_L 		//Read-only
    //MPU6050_RA_TEMP_OUT_H 		//Read-only
    //MPU6050_RA_TEMP_OUT_L 		//Read-only
    //MPU6050_RA_GYRO_XOUT_H 		//Read-only
    //MPU6050_RA_GYRO_XOUT_L 		//Read-only
    //MPU6050_RA_GYRO_YOUT_H 		//Read-only
    //MPU6050_RA_GYRO_YOUT_L 		//Read-only
    //MPU6050_RA_GYRO_ZOUT_H 		//Read-only
    //MPU6050_RA_GYRO_ZOUT_L 		//Read-only
    //MPU6050_RA_EXT_SENS_DATA_00 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_01 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_02 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_03 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_04 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_05 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_06 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_07 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_08 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_09 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_10 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_11 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_12 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_13 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_14 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_15 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_16 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_17 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_18 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_19 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_20 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_21 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_22 	//Read-only
    //MPU6050_RA_EXT_SENS_DATA_23 	//Read-only
    //MPU6050_RA_MOT_DETECT_STATUS 	//Read-only
	
	//Slave out, dont care
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV0_DO, 0x00);
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV1_DO, 0x00);
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV2_DO, 0x00);
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_SLV3_DO, 0x00);
	//More slave config
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_I2C_MST_DELAY_CTRL, 0x00);
	//Reset sensor signal paths
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_SIGNAL_PATH_RESET, 0x00);
	//Motion detection control
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_MOT_DETECT_CTRL, 0x00);
	//Disables FIFO, AUX I2C, FIFO and I2C reset bits to 0
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_USER_CTRL, 0x00);
	//Sets clock source to gyro reference w/ PLL
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_1, 0b00000010);
	//Controls frequency of wakeups in accel low power mode plus the sensor standby modes
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_PWR_MGMT_2, 0x00);
    //MPU6050_RA_BANK_SEL			//Not in datasheet
    //MPU6050_RA_MEM_START_ADDR		//Not in datasheet
    //MPU6050_RA_MEM_R_W			//Not in datasheet
    //MPU6050_RA_DMP_CFG_1			//Not in datasheet
    //MPU6050_RA_DMP_CFG_2			//Not in datasheet
    //MPU6050_RA_FIFO_COUNTH		//Read-only
    //MPU6050_RA_FIFO_COUNTL		//Read-only
	//Data transfer to and from the FIFO buffer
	I2C_RegisterSet(I2C0, MPU6050_ADDRESS, MPU6050_RA_FIFO_R_W, 0x00);
    //MPU6050_RA_WHO_AM_I 			//Read-only, I2C address
	
	//printf("\f");
	printf("\nMPU6050 Setup Complete");	
}
Exemplo n.º 7
0
int main(int argc, char **argv)
{
    I16 card, err;
    U16 card_num;
    U32 I2C_ReadCmdAddr;
    U32 I2C_ReadData;
    U32 I2C_WriteCmdAddr;
    U32 I2C_WriteData;
    U16 I2C_SlaveAddr;
    U32 vi = 0;
    U16 PatType;

    printf("This sample tests I2C Read/Write Operations.\n");
    printf("It will write a byte-data to and then read from 0 ~ %d Cmd/Addr.\n", I2C_WRTCNT-1);
    printf("Card Number? ");
    scanf(" %hd", &card_num);

    printf("I2C Slave Address? ");
    scanf(" %hd", &I2C_SlaveAddr);

    printf("Increasing or Decreasing Pattern? [0]Increasing [1]Decreasing ");
    scanf(" %hd", &PatType);
    PatType &= 0x1;

    /*Open and initialize device*/
    card = Register_Card(
        PCI_7350, /*Card type*/
        card_num  /*Card number*/
    );
    if(card<0){
        printf("Register_Card Error: %d\n", card);
        exit(1);
    }

    /*
     * Set AFI voltage level
     * AFI0/AFI1 will be set to I2C mode automatically if I2C is enabled.
     */
    err = DIO_VoltLevelConfig(
        card,          /*Card handle*/
        P7350_PortAFI, /*AFI voltage level to be set*/
        VoltLevel_3R3  /*Voltage level to be set*/
    );
    if(err<0){
        printf("DIO_7350_SetVoltLevel Error: %d\n", err);
        Release_Card(card);
        exit(1);
    }

    /*Setup I2C*/
    err = I2C_Setup(
        card,
        I2C_Port_A, /*I2C port to be set*/
        0,          /*Not used in 7350*/
        0xff,       /*The parameter is used to set Pre-clock in 7350*/
        0           /*Not used in 7350*/
    );
    if(err<0){
        printf("I2C_Setup Error: %d\n", err);
        Release_Card(card);
        exit(1);
    }

    /*
     * Enable I2C
     * AFI0/AFI1 will be set to I2C mode automatically.
     */
    err = I2C_Control(
        card,
        I2C_Port_A,
        I2C_ENABLE, /*Operation item*/
        1           /*Enable opertion item*/
    );
    if(err<0){
        printf("I2C_Control Error: %d\n", err);
        Release_Card(card);
        exit(1);
    }

    do{
        /*Write*/
        I2C_WriteCmdAddr = vi&0xff;
        I2C_WriteData = (!PatType)? I2C_WriteCmdAddr:255-I2C_WriteCmdAddr;
        err = I2C_Write(
            card,
            I2C_Port_A,
            I2C_SlaveAddr,    /*Slave device address*/
            1,                /*Address byte count to be written*/
            1,                /*Data byte count to be written*/
            I2C_WriteCmdAddr, /*Cmd/Addr to be written*/
            I2C_WriteData     /*Data to be written*/
        );
        if(err<0){
            printf("I2C_Write Error: %d\n", err);
            I2C_Control(card, I2C_Port_A, I2C_ENABLE, 0);
            Release_Card(card);
            exit(1);
        }

        usleep(10000); //Wait for writing I2C EEPROM latency

        /*Read*/
        I2C_ReadCmdAddr = I2C_WriteCmdAddr;
        err = I2C_Read(
            card,
            I2C_Port_A,
            I2C_SlaveAddr,   /*Slave device address*/
            1,               /*Address byte count to be read*/
            1,               /*Data byte count to be read*/
            I2C_ReadCmdAddr, /*Cmd/Addr to be read*/
            &I2C_ReadData    /*read Data*/
        );
        if(err<0){
            printf("I2C_Read Error: %d\n", err);
            I2C_Control(card, I2C_Port_A, I2C_ENABLE, 0);
            Release_Card(card);
            exit(1);
        }
        printf("Read Addr(%ld): %ld\n", I2C_ReadCmdAddr, I2C_ReadData);
        vi++;
    }while((vi<256)&&(!kbhit()));

    /*Disable I2C*/
    err = I2C_Control(
        card,
        I2C_Port_A,
        I2C_ENABLE, /*Opertion item*/
        0           /*Disble opertion item*/
    );
    if(err<0){
        printf("I2C_Control Error: %d\n", err);
        Release_Card(card);
        exit(1);
    }
    else
        printf("I2C disabled\n");

    printf("Press any key to exit...\n");
    getch();
    Release_Card(card);
    return 0;
}