uint8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout); uint8_t I2Cdev_readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout); uint16_t I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t* data); uint16_t I2Cdev_writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data);
#include "stm32f4xx_hal.h" I2C_HandleTypeDef * I2Cdev_hi2c;
/** Read multiple bytes from an 8-bit device register. * @param devAddr I2C slave device address * @param regAddr First register regAddr to read from * @param length Number of bytes to read * @param data Buffer to store read data in * @param timeout Optional read timeout in milliseconds (0 to disable, leave off to use default class value in I2Cdev::readTimeout) * @return Number of bytes read (-1 indicates failure) */ int8_t I2Cdev::readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout) { int8_t count = 0; uint32_t t1 = millis(); // Arduino v1.0.1+, Wire library // Adds official support for repeated start condition, yay! // I2C/TWI subsystem uses internal buffer that breaks with large data requests // so if user requests more than BUFFER_LENGTH bytes, we have to do it in // smaller chunks instead of all at once for (uint8_t k = 0; k < length; k += min(length, BUFFER_LENGTH)) { Wire.beginTransmission(devAddr); Wire.write(regAddr); Wire.endTransmission(); Wire.beginTransmission(devAddr); Wire.requestFrom(devAddr, (uint8_t)min(length - k, BUFFER_LENGTH)); for (; Wire.available() && (timeout == 0 || millis() - t1 < timeout); count++) { data[count] = Wire.read(); } } // check for timeout if (timeout > 0 && millis() - t1 >= timeout && count < length) count = -1; // timeout return count; }
Wire.beginTransmission(devAddr); Wire.write(regAddr); Wire.endTransmission(); Wire.beginTransmission(devAddr);
uint8_t I2Cdev_readBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout) { uint16_t tout = timeout > 0 ? timeout : I2CDEV_DEFAULT_READ_TIMEOUT; HAL_I2C_Master_Transmit(I2Cdev_hi2c, devAddr << 1, ®Addr, 1, tout); if (HAL_I2C_Master_Receive(I2Cdev_hi2c, devAddr << 1, data, length, tout) == HAL_OK) return length; else return -1; }
uint8_t i = 0; for(i = 0; i<255; i++) { if(HAL_I2C_IsDeviceReady(&hi2c3, i, 10, 100) == HAL_OK) printf("Ready: 0x%02x", i); }
uint8_t i = 0; for(i = 15; i<127; i++) { if(HAL_I2C_IsDeviceReady(&hi2c3, i << 1, 10, 100) == HAL_OK) printf("Ready: 0x%02x", i); }
uint8_t I2Cdev_readWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t *data, uint16_t timeout) { uint16_t tout = timeout > 0 ? timeout : I2CDEV_DEFAULT_READ_TIMEOUT; HAL_I2C_Master_Transmit(I2Cdev_hi2c, devAddr << 1, ®Addr, 1, tout); if (HAL_I2C_Master_Receive(I2Cdev_hi2c, devAddr << 1, (uint8_t *)data, length*2, tout) == HAL_OK) return length; else return -1; }
for (uint8_t k = 0; k < length * 2; k += min(length * 2, BUFFER_LENGTH)) { Wire.beginTransmission(devAddr); Wire.write(regAddr); Wire.endTransmission(); Wire.beginTransmission(devAddr); Wire.requestFrom(devAddr, (uint8_t)(length * 2)); // length=words, this wants bytes bool msb = true; // starts with MSB, then LSB for (; Wire.available() && count < length && (timeout == 0 || millis() - t1 < timeout);) { if (msb) { // first byte is bits 15-8 (MSb=15) data[count] = Wire.read() << 8; } else { // second byte is bits 7-0 (LSb=0) data[count] |= Wire.read(); #ifdef I2CDEV_SERIAL_DEBUG Serial.print(data[count], HEX); if (count + 1 < length) Serial.print(" "); #endif count++; } msb = !msb; } Wire.endTransmission(); }
/** Write multiple bytes to an 8-bit device register. * @param devAddr I2C slave device address * @param regAddr First register address to write to * @param length Number of bytes to write * @param data Buffer to copy new data from * @return Status of operation (true = success) */ uint16_t I2Cdev_writeBytes(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data) { // Creating dynamic array to store regAddr + data in one buffer uint8_t * dynBuffer; dynBuffer = (uint8_t *) malloc(sizeof(uint8_t) * (length+1)); dynBuffer[0] = regAddr; // copy array memcpy(dynBuffer+1, data, sizeof(uint8_t) * length); HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(I2Cdev_hi2c, devAddr << 1, dynBuffer, length+1, 1000); free(dynBuffer); return status == HAL_OK; }
/** Write multiple words to a 16-bit device register. * @param devAddr I2C slave device address * @param regAddr First register address to write to * @param length Number of words to write * @param data Buffer to copy new data from * @return Status of operation (true = success) */ uint16_t I2Cdev_writeWords(uint8_t devAddr, uint8_t regAddr, uint8_t length, uint16_t* data) { // Creating dynamic array to store regAddr + data in one buffer uint8_t * dynBuffer; dynBuffer = (uint8_t *) malloc(sizeof(uint8_t) + sizeof(uint16_t) * length); dynBuffer[0] = regAddr; // copy array memcpy(dynBuffer+1, data, sizeof(uint16_t) * length); HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(I2Cdev_hi2c, devAddr << 1, dynBuffer, sizeof(uint8_t) + sizeof(uint16_t) * length, 1000); free(dynBuffer); return status == HAL_OK; }
#include "stm32f4xx.h" #include "stm32f4xx_hal.h" #include <stdint.h> #include <stdio.h> #include <string.h> #include "I2Cdev.h" #include "BMP085.h" I2C_HandleTypeDef hi2c3; int main(void) { SystemInit(); HAL_Init(); GPIO_InitTypeDef GPIO_InitStruct; /**I2C3 GPIO Configuration PC9 ------> I2C3_SDA PA8 ------> I2C3_SCL */ __GPIOA_CLK_ENABLE(); __GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); __I2C3_CLK_ENABLE(); hi2c3.Instance = I2C3; hi2c3.Init.ClockSpeed = 400000; hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c3.Init.OwnAddress1 = 0x10; hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED; hi2c3.Init.OwnAddress2 = 0x11; hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED; HAL_I2C_Init(&hi2c3); I2Cdev_hi2c = &hi2c3; // init of i2cdevlib. // You can select other i2c device anytime and // call the same driver functions on other sensors while(!BMP085_testConnection()) ; BMP085_initialize(); while (1) { BMP085_setControl(BMP085_MODE_TEMPERATURE); HAL_Delay(BMP085_getMeasureDelayMilliseconds(BMP085_MODE_TEMPERATURE)); float t = BMP085_getTemperatureC(); BMP085_setControl(BMP085_MODE_PRESSURE_3); HAL_Delay(BMP085_getMeasureDelayMilliseconds(BMP085_MODE_PRESSURE_3)); float p = BMP085_getPressure(); float a = BMP085_getAltitude(p, 101325); printf("T: %3.1f P: %3.0f A: %3.2f", t, p ,a); HAL_Delay(1000); } } void SysTick_Handler() { HAL_IncTick(); HAL_SYSTICK_IRQHandler(); }
#include "stm32f4xx.h" #include "stm32f4xx_hal.h" #include <stdint.h> #include <stdio.h> #include <string.h> #include "I2Cdev.h" #include "BMP085.h" #include "MPU6050.h" I2C_HandleTypeDef hi2c3; int main(void) { SystemInit(); HAL_Init(); GPIO_InitTypeDef GPIO_InitStruct; /**I2C3 GPIO Configuration PC9 ------> I2C3_SDA PA8 ------> I2C3_SCL */ __GPIOA_CLK_ENABLE(); __GPIOC_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_9; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FAST; GPIO_InitStruct.Alternate = GPIO_AF4_I2C3; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); __I2C3_CLK_ENABLE(); hi2c3.Instance = I2C3; hi2c3.Init.ClockSpeed = 400000; hi2c3.Init.DutyCycle = I2C_DUTYCYCLE_2; hi2c3.Init.OwnAddress1 = 0x10; hi2c3.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; hi2c3.Init.DualAddressMode = I2C_DUALADDRESS_DISABLED; hi2c3.Init.OwnAddress2 = 0x11; hi2c3.Init.GeneralCallMode = I2C_GENERALCALL_DISABLED; hi2c3.Init.NoStretchMode = I2C_NOSTRETCH_DISABLED; HAL_I2C_Init(&hi2c3); I2Cdev_hi2c = &hi2c3; // init of i2cdevlib. // You can select other i2c device anytime and // call the same driver functions on other sensors while(!BMP085_testConnection()) ; int16_t ax, ay, az; int16_t gx, gy, gz; int16_t c_ax, c_ay, c_az; int16_t c_gx, c_gy, c_gz; MPU6050_initialize(); BMP085_initialize(); MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_250); MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2); MPU6050_getMotion6(&c_ax, &c_ay, &c_az, &c_gx, &c_gy, &c_gz); while (1) { BMP085_setControl(BMP085_MODE_TEMPERATURE); HAL_Delay(BMP085_getMeasureDelayMilliseconds(BMP085_MODE_TEMPERATURE)); float t = BMP085_getTemperatureC(); BMP085_setControl(BMP085_MODE_PRESSURE_3); HAL_Delay(BMP085_getMeasureDelayMilliseconds(BMP085_MODE_PRESSURE_3)); float p = BMP085_getPressure(); float a = BMP085_getAltitude(p, 101325); printf(buf, "T: %3.1f P: %3.0f A: %3.2f", t, p ,a); MPU6050_getMotion6(&ax, &ay, &az, &gx, &gy, &gz); printf("Accel: %d %d %d", ax - c_ax, ay - c_ay, az - c_az); printf("Gyro: %d %d %d", gx - c_gx, gy - c_gy, gz - c_gz); HAL_Delay(1000); } } void SysTick_Handler() { HAL_IncTick(); HAL_SYSTICK_IRQHandler(); }
Source: https://habr.com/ru/post/259709/
All Articles