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; }
//-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------------------- 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); }
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; }
/* * ---------------------------------------------------------------------------- * 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; } }
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(); } }
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"); }
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; }