2017-03-17 28 views
0

i2cで加速度計データを読み取ろうとしています。加速度計のi2cアドレスは、読み取りの場合は0x19、書き込みの場合は0x18です。加速度計との正確な通信を確認するには、レジスタ0x00を読み込み、結果として0x12を返す必要があります。しかし、私は加速度計からの認識を得ることができません。私はHALライブラリとCubeMXを使用して生成されたコードを使用しています。コードは次のとおりです。stm32 Nucleo-L011K4 i2c応答が失敗しました

#include "main.h" 
#include "stm32l0xx_hal.h" 

I2C_HandleTypeDef hi2c1; 

void SystemClock_Config(void); 
void Error_Handler(void); 
static void MX_GPIO_Init(void); 
static void MX_I2C1_Init(void); 


uint8_t data[2]; 
uint8_t result; 


int main(void) 
{ 
    HAL_Init(); 

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

    /* Initialize all configured peripherals */ 
    MX_GPIO_Init(); 
    MX_I2C1_Init(); 

    while (1) 
    { 

      // HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size) 
       HAL_I2C_Mem_Read_DMA(&hi2c1, 0x19, 0x00, 1, &result, 1); 
       HAL_Delay(100); 
    } 
} 

void SystemClock_Config(void) 
{ 

    RCC_OscInitTypeDef RCC_OscInitStruct; 
    RCC_ClkInitTypeDef RCC_ClkInitStruct; 
    RCC_PeriphCLKInitTypeDef PeriphClkInit; 

    /**Configure the main internal regulator output voltage */ 
    __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); 

    /**Initializes the CPU, AHB and APB busses clocks */ 
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI; 
    RCC_OscInitStruct.MSIState = RCC_MSI_ON; 
    RCC_OscInitStruct.MSICalibrationValue = 0; 
    RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; 
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; 
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    /**Initializes the CPU, AHB and APB busses clocks */ 

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK 
          |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; 
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_MSI; 
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; 
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; 
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; 

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1; 
    PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; 
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    /**Configure the Systick interrupt time */ 
    HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); 

    /**Configure the Systick */ 
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); 

    /* SysTick_IRQn interrupt configuration */ 
    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); 
} 

/* I2C1 init function */ 
static void MX_I2C1_Init(void) 
{ 

    hi2c1.Instance = I2C1; 
    hi2c1.Init.Timing = 0x00000708; 
    hi2c1.Init.OwnAddress1 = 0x18; 
    hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; 
    hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; 
    hi2c1.Init.OwnAddress2 = 0; 
    hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; 
    hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; 
    hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; 
    if (HAL_I2C_Init(&hi2c1) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

    /**Configure Analogue filter */ 
    if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) 
    { 
    Error_Handler(); 
    } 

} 

static void MX_GPIO_Init(void) 
{ 

    /* GPIO Ports Clock Enable */ 
    __HAL_RCC_GPIOC_CLK_ENABLE(); 
    __HAL_RCC_GPIOA_CLK_ENABLE(); 

} 

2つの外部プルアップ抵抗4,7kΩが使用されています。

MCピン:それぞれSDAとSCLに https://developer.mbed.org/platforms/ST-Nucleo-L011K4/

ピンD4とD5。 GNDと3.3Vは加速度計の各電源接続に接続されています。

+0

アドレスフィールドの最後に手動でR/Wビットを設定する必要はありません.HALが手動でアドレスフィールドを処理します。したがって、アドレスは '0x18 'で左にシフトし、上位7ビットはアドレスであるため、最初のビット(ビット0)はHAL読み出し機能によって1に設定されます。 'HAL_I2C_Mem_Read_DMA(&hi2c1、((0x18)<< 1)、0x00、1、&result、1); –

+0

ご回答ありがとうございます。デバイスのアドレスを(0x18)<< 1に変更しようとしました。私はまだ確認エラーのエラーコードを取得します。 – nayak

+0

'MX_I2C1_Init'に次の行が間違っています:' hi2c1.Init.OwnAddress1 = 0x18; '。 '0x18'はスレーブアドレスであり、加速度計のアドレスはMCU自身のアドレスをそれに設定しません。代わりに '0'に設定することができます。おそらくこれは根本的な原因ではないでしょう。 –

答えて

0

ボードのSDAピンはPB7、SCLピンはPB6です。ただし、これらのピンのクロックは初期化しません。 MX_GPIO_Init機能でポートBクロックをイネーブルにする必要があります。

static void MX_GPIO_Init(void) 
{ 

    /* GPIO Ports Clock Enable */ 
    __HAL_RCC_GPIOC_CLK_ENABLE(); 
    __HAL_RCC_GPIOA_CLK_ENABLE(); 
    __HAL_RCC_GPIOB_CLK_ENABLE(); 

} 

MX_I2C1_Init機能でOwnAddress1を0に設定する必要があります。

hi2c1.Init.OwnAddress1 = 0; 

はまたアドレスがHAL_I2C_Mem_Read_DMAで0x18のかHAL_I2C_Mem_Read関数であるべきお読みください。タイミングが正しいとは分かりません。ほとんどのI2Cデバイスのクロック速度は100-400Khzです。 I2Cデバイスのクロック速度は?あなたは100または400Khzで試すことができます。

hi2c1.Init.Timing = 400000; 
+0

stマイクロエレクトロニクスが提供するI2Cサンプルプロジェクトを修正しようとしましたが、現在i2c通信が機能しています。 – nayak

+0

I2C_ADDRESS(0x18 << 1)でHAL_I2C_Master_Receive_IT()関数を使用しました。私は100Khzの速度に達するために0x0020098EにI2C TIMINGを設定しました。また、クリーナー波形を得るために抵抗値を2.2kに減らしました。 – nayak

関連する問題