Skocz do zawartości

Problem z komunikacją I2c między STM32 (nukleo l031k6) a MCP9808


Zuzia

Pomocna odpowiedź

Hej, usiłuję m. in. zczytywać z czujnika temperatury wskaznia i wykorzystywać je później w dalszym działaniu (przekroczenie progu skutkuje reakcją diody i buzzera)

Niestety mam problem z jakąkolwiek interakcją na i2c.

Korzystam z STM32CubeIDE

Mój aktualny kod (wstawka):

int main(void)
{
  /* USER CODE BEGIN 1 */
	uint8_t buff[2] = {0,0};
	HAL_StatusTypeDef ret;
	float temperature =0;


  /* 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_I2C1_Init();
  MX_TIM22_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  //HAL_TIM_Base_Start_IT(&htim22);  // func(&hnazwa)

  uint8_t enkoder = 0;
  static const uint8_t devAddr = 0x18; //0x18;
  static const uint8_t regaddr = 0x05;

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

	  printf("Hello\n");

/*
	  //send_string("lelele");
	  buff[0]=tempReg;
	  ret = HAL_I2C_Master_Transmit(&hi2c1, tempAddr, buff, 1, HAL_MAX_DELAY);
	  if(ret!=HAL_OK)
	  {
		  //HAL_GPIO_TogglePin(BUZ_GPIO_Port, BUZ_Pin);
	  }
	  else
	  {*/
		  //read 2 bytes from the temperature register



	  ret = HAL_I2C_Master_Transmit(&hi2c1, devAddr, (uint8_t*)&regaddr, 1, HAL_MAX_DELAY);

	  uint16_t temp = 0;

	  ret = HAL_I2C_Master_Receive(&hi2c1, devAddr, (uint8_t*)&buff, 2, HAL_MAX_DELAY);

i tak w sumie jeden jak i drugi ret mają wartość HAL_ERROR.

Głębsza analiza pozwoliła mi jedynie odkryć, że problem leży tutaj:

 while (hi2c->XferCount > 0U)
    {
      /* Wait until TXIS flag is set */
      if (I2C_WaitOnTXISFlagUntilTimeout(hi2c, Timeout, tickstart) != HAL_OK)
      {
        return HAL_ERROR;
      }

Jest to linijka 1157 w pliku stm32l0xx_hal_i2c.c .

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.