I2C с stm32f4 с использованием HMC5883l - PullRequest
0 голосов
/ 11 сентября 2018

Я пытался подключить плату HMC5883l к stm32f4, но что-то не работает должным образом. Я запустил i2c, отправил биты конфигурации в REGA, REGB и REGMR (регистр режима) и отправил его обратно через USB-соединение с HAL_I2C_MEM_READ.

Результаты:

  • xaxis и zaxis имеют одинаковое значение
  • основной цикл работает только один раз, и для получения других значений мне нужно подключить STM

enter image description here

  • Я пытался проверить, есть ли изменения в значении (ось x) с осциллографом, но он не показал никаких изменений (вращение доски)

enter image description here

Что мне здесь не хватает? Возможно ли, что плата повреждена?

 int main(void)
{
    /* USER CODE BEGIN 1 */
    /* USER CODE END 1 */

    /* MCU Configuration----------------------------------------------------------*/

    /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    HAL_Init();

    /* USER CODE BEGIN Init */
    /* USER CODE END Init */

    /* Configure the system clock */
    SystemClock_Config();

    /* USER CODE BEGIN SysInit */

    /* USER CODE END SysInit */

    /* Initialize all configured peripherals */
    MX_GPIO_Init();
    MX_USB_DEVICE_Init();
    MX_I2C3_Init();
    /* USER CODE BEGIN 2 */
//  HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

    HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0b00000000 , 1, HMC5883l_Enable_A   , 1, 100);
    HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0b00000001 , 1, HMC5883l_Enable_B   , 1, 100);
    HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0b00000010 , 1, HMC5883l_MR         , 1, 100);

    /* USER CODE END 2 */

    /* Infinite loop */
    /* USER CODE BEGIN WHILE */
    while (1)
    {
        HAL_I2C_Mem_Read(&hi2c3, HMC5883l_ADDRESS, HMC5883l_ADD_DATAX_MSB_LSB, 1, DataX, 2, 100);
        Xaxis = ((DataX[1] << 8) | DataX[0]);
        magn_x_gs = ((float)Zaxis*MAX_RESOLUTION)/(float)INT16_MAX; // conversion

        HAL_I2C_Mem_Read(&hi2c3, HMC5883l_ADDRESS, HMC5883l_ADD_DATAY_MSB_LSB , 1, DataY, 2, 100);
        Yaxis = ((DataY[1] << 8) | DataY[0]);
        magn_y_gs = ((float)Yaxis*MAX_RESOLUTION)/(float)INT16_MAX;

        HAL_I2C_Mem_Read(&hi2c3, HMC5883l_ADDRESS, HMC5883l_ADD_DATAZ_MSB_LSB , 1, DataZ, 2, 100);
        Zaxis = ((DataZ[1] << 8) | DataZ[0]);
        magn_z_gs = ((float)Zaxis*MAX_RESOLUTION)/(float)INT16_MAX;
    }

1 Ответ

0 голосов
/ 24 сентября 2018

Хорошо, я создал правильную версию соединения :)

// variables for receiving DATA
uint8_t DataX[2];
uint16_t Xaxis = 0;
uint8_t DataY[2];
uint16_t Yaxis = 0;
uint8_t DataZ[2];
uint16_t Zaxis = 0;

// adresses     
// HMC5883l - ADDRESS
#define HMC5883l_ADDRESS (0x1E << 1)
// CONTROL REG A
#define HMC5883l_Enable_A (0x78)
// CONTROL REG B
#define HMC5883l_Enable_B (0xA0)
// MODE REGISTER
#define HMC5883l_MR (0x00)
// HMC5883l - MSB / LSB ADDRESSES
#define HMC5883l_ADD_DATAX_MSB (0x03)
#define HMC5883l_ADD_DATAX_LSB (0x04)
#define HMC5883l_ADD_DATAZ_MSB (0x05)
#define HMC5883l_ADD_DATAZ_LSB (0x06)
#define HMC5883l_ADD_DATAY_MSB (0x07)
#define HMC5883l_ADD_DATAY_LSB (0x08)
// SUM (MSB + LSB) DEFINE
#define HMC5883l_ADD_DATAX_MSB_MULTI (HMC5883l_ADD_DATAX_MSB | 0x80)
#define HMC5883l_ADD_DATAY_MSB_MULTI (HMC5883l_ADD_DATAY_MSB | 0x80)
#define HMC5883l_ADD_DATAZ_MSB_MULTI (HMC5883l_ADD_DATAZ_MSB | 0x80) 

Внутри main () я должен создать переменные, чтобы фактически использовать RegSetting и т. Д.

uint8_t RegSettingA = HMC5883l_Enable_A;
uint8_t RegSettingB = HMC5883l_Enable_B;
uint8_t RegSettingMR = HMC5883l_MR;

И очистить переменные:

Xaxis = 0;
Yaxis = 0;
Zaxis = 0;

Инициализировать соединение:

HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x00 , 1, &RegSettingA , 1, 100);
HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x01 , 1, &RegSettingB , 1, 100);
HAL_I2C_Mem_Write(&hi2c3, HMC5883l_ADDRESS, 0x02 , 1, &RegSettingMR , 1, 100);

И внутри цикла while (1):

// RECEIVE X_axis
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_ADDRESS,HMC5883l_ADD_DATAX_MSB_MULTI,1,DataX,2,100);
Xaxis = ((DataX[1]<<8) | DataX[0])/660.f;
// RECEIVE Y_axis
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_ADDRESS,HMC5883l_ADD_DATAY_MSB_MULTI,1,DataY,2,100);
Yaxis = ((DataY[1]<<8) | DataY[0])/660.f;
// RECEIVE Z_axis
HAL_I2C_Mem_Read(&hi2c3,HMC5883l_ADDRESS,HMC5883l_ADD_DATAZ_MSB_MULTI,1,DataZ,2,100);
Zaxis = ((DataZ[1]<<8) | DataZ[0])/660.f;

Поскольку выходные данные являются соединением MSB и LSB, мы получили (и LSB равен 0x00), мы должны переместить Data [1] на 8 бит вперед.

Вот результаты STM Studio: ссылка

С наилучшими пожеланиями:)

...