Например TDA7294

Форум РадиоКот • Просмотр темы - Дальномер TF-Luna и HAL_I2C_Master_Receive_DMA
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Чт янв 22, 2026 18:44:14

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Дальномер TF-Luna и HAL_I2C_Master_Receive_DMA
СообщениеДобавлено: Чт июн 06, 2024 15:54:51 
Родился

Зарегистрирован: Чт апр 07, 2016 09:44:42
Сообщений: 6
Рейтинг сообщения: 0
Всем Мяу :) (в смысле, доброго времени суток).

Пытаюсь подключить дальномер TF-Luna к плате STM32F303 Discovery kit, по I2C. Настройки из STM32CubeMX.
Когда пытаюсь читать дальность, с помощью HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size),
то получаю сплошные FF...

Под спойлером программка (много букв)
Спойлер
Код:
//Здесь идут строки созданные CubeMT
/**
  ******************************************************************************
  * File Name          : main.c
  * Description        : Main program body
  ******************************************************************************
  ** This notice applies to any and all portions of this file
  * that are not between comment pairs USER CODE BEGIN and
  * USER CODE END. Other portions of this file, whether
  * inserted by the user or by software development tools
  * are owned by their respective copyright owners.
  *
  * COPYRIGHT(c) 2024 STMicroelectronics
  ******************************************************************************
  */

/*
  *В этом проекте изучаем работу с I2C, для обмена данными с дальномером TF-Luna.
  *В качестве микроконтроллера используется макетная плата STM32F303_Discovery kit с микроконтроллером STM32F303VCT6
  *В этом варианте, в качестве интерфейса будет использован канал I2C1 с выводами PB6 I2C1_SCL pin92  и PB7 I2C1_SDA pin93
  *На макетной плате дискавери они будут подключены на P2 pin21 и P2 pin22, соответственно.
  *Питание дальномера +5 В от дискавери.
  *Дополнительно установить подтягивающие резисторы 4,7 кОм одключённые к P1 pin1 (+3,3 В) с одной стороны и к P2 pin22 и pin23 с другой стороны (каждый резистор к своему выводу).
  *Можно поэкспериментировать с подтягиванием на +5 В. Вместо P1 pin1 подключить  к P2 pin1 или pin2, но резисторы заменить на 10 кОм. Землю брать с P2 pin49 или pin50.
  *На луне они будут подключены к pin3 (I2C1_SCL) и pin2 (I2C1_SDA). Питание на pin1  земля на pin4. Можно попробывать питание +5 В, а сигналы +3,3 В (или всё 5 В).
 */

/* Includes ----------*/
#include "main.h"
#include "stm32f3xx_hal.h"


/* Define to prevent recursive inclusion ----------*/

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private variables ----------*/
I2C_HandleTypeDef hi2c1;
DMA_HandleTypeDef hdma_i2c1_tx;
DMA_HandleTypeDef hdma_i2c1_rx;

/* Константы для работы с дальномером по I2C---------------------------------*/
#define I2C_ADDRESS  0x10      //Определяем адрес переферии (слэйва) с которой будем работать по I2C (см. даташит на дальномер TF-Luna)

#define  NumEltBufLunaData   2          //Задал размер буфера (в МК) в который будут помещаться данные (2 байта), полученные от ведомого устройства.
uint8_t bufLunaData[NumEltBufLunaData] = {0x00,}; //Буфер (в МК) (массив - адрес 0-го эл-та, т.е. указатель) в котором будут храниться данные (2 байта), полученные от ведомого устройства.

#define sizeRegDist 2                   //Задал размер буфера (в луне), откуда берутся данные замера расстояния
uint16_t RegDist[sizeRegDist] = {0x00, 0x01};    //Буфер с адресами регистров луны (см. даташит), в которых хранятся данные замера расстояния (соответственно Lo и Hi)

//uint8_t regDistLo = 0x00;       //Адрес регистра (в луне), где хранятся данные расстояния (младший разряд). Присваиваем в ф-ях, по мере надобности.
//uint8_t regDistHi = 0x01;       //Адрес регистра (в луне), где хранятся данные расстояния (старший разряд). Присваиваем в ф-ях, по мере надобности.


/* USER CODE BEGIN PV */
/* Private variables ----------*/
/* USER CODE END PV */

/* Private function prototypes ----------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_DMA_Init(void);
static void MX_I2C1_Init(void);
static void MX_NVIC_Init(void);
HAL_StatusTypeDef HAL_Init(void);


/* USER CODE BEGIN PFP */
/* Private function prototypes ----------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */


/*Объявление функции чтения данных с дальномера в массив МК-------------------*/

//Обращение к дальномеру, как к памяти (по регистрам)
void bufLunaMemRead(uint16_t, uint16_t*, uint16_t, uint8_t*, uint8_t);
//Аргументы:
//адрес дальномера, как слэйва в I2C
//адрес массива с адресами регистров дальномера, откуда берутся данные замера расстояния
//размер массива луны, откуда берутся данные замера расстояния
//массив (адрес 0-го эл-та, т.е. указатель) МК в который передаётся результат замера
//размер массива МК

//Обращение к дадьномеру, как к слэйву
void bufLunaSlaveRead(uint16_t, uint16_t*, uint16_t, uint8_t*, uint8_t);
//Аргументы:
//адрес дальномера, как слэйва в I2C
//адрес массива с адресами регистров дальномера, откуда берутся данные замера расстояния
//размер массива луны, откуда берутся данные замера расстояния
//массив (адрес 0-го эл-та, т.е. указатель) МК в который передаётся результат замера
//размер массива МК


/*Функции для отладки---------------------------------------------------------*/

/*Сделал (объявил) свою ф-ю, чтобы вставлять в код для определения "дошёл ли сюда?"-----*/
void TestLed (uint8_t); //Аргумент: кол-во вспышек.

/*Сделал (объявил) ф-ю, чтобы печатать массив-------------------------------------------*/
void PrintArray(uint8_t*, uint8_t);      //Аргументы: указатель на массив (его адрес) и размер массива (байт).


/* USER CODE END 0 */


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();
 
  /* Configure the system clock */
  SystemClock_Config();
   
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_I2C1_Init();
 
 /* Initialize interrupts */
  MX_NVIC_Init();
 
 
  /* USER CODE BEGIN Init */

  /* USER CODE END Init */
 

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */ 
 
 
  /* USER CODE BEGIN 2 */
 
  /* USER CODE END 2 */
   
/*Запускаем ф-ю получения данных через I2C и DMA------------------------------*/

    if (HAL_I2C_IsDeviceReady(&hi2c1, (I2C_ADDRESS << 1), 1, HAL_MAX_DELAY) == HAL_OK)     //Проверяем есть ли подключение к дальномеру.
    {
      //Если дальномер подключён, то вызываем ф-ю чтения данных с дальномера в массив МК.
     
      //Вызываем ф-ю обращающуюся к дальномеру, как к памяти     
      bufLunaMemRead(I2C_ADDRESS, RegDist, sizeRegDist, bufLunaData, NumEltBufLunaData);
      //Аргументы:
      //I2C_ADDRESS - адрес дальномера, как слэйва в I2C
      //RegDist - адрес массива с адресами регистров дальномера, откуда берутся данные замера расстояния
      //sizeRegDist - размер массива луны, откуда берутся данные замера расстояния
      //bufLunaData - массив (адрес 0-го эл-та, т.е. указатель) МК в который передаётся результат замера
      //NumEltBufLunaData - размер массива МК
     
      //Вызываем ф-ю обращающуюся к дальномеру, как к слэйву
      bufLunaSlaveRead(I2C_ADDRESS, RegDist, sizeRegDist, bufLunaData, NumEltBufLunaData);
      //Аргументы:
      //I2C_ADDRESS - адрес дальномера, как слэйва в I2C
      //RegDist - адрес массива с адресами регистров дальномера, откуда берутся данные замера расстояния
      //sizeRegDist - размер массива луны, откуда берутся данные замера расстояния
      //bufLunaData - массив (адрес 0-го эл-та, т.е. указатель) МК в который передаётся результат замера
      //NumEltBufLunaData - размер массива МК
     
//     PrintArray (bufLunaData, sizeRegDist);     //Распечатываю одномерный массив. Аргументы: указатель на массив (его адрес) и кол-во эл-тов массива.
     
      TestLed (1);        //Если светик моргнул 1 раз, значит я здесь (был).
      HAL_Delay(1000);    //Задержка, чтобы успеть отличить серии из 1-й вспышки.
     
    } else
    {
      TestLed (2);        //Если светик моргнул 2 раза, значит я здесь (был).
      HAL_Delay(1000);    //Задержка, чтобы успеть отличить серии из 2-х вспышек.
    }   //end HAL_I2C_IsDeviceReady
 
       
  /* Infinite loop */
 
   while (1)
  {
  /* USER CODE BEGIN WHILE */
 
    TestLed (4);         //Если светик моргнул 4 раза, значит я здесь (был).
    HAL_Delay(1000);    //Задержка, чтобы успеть отличить серии из 4-х вспышек.

  /* USER CODE END WHILE */
  }     //end while
 
   
  /* USER CODE BEGIN 3 */
 
  /* USER CODE END 3 */

}       //end main
 

/** System Clock Configuration
*/
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;
  RCC_PeriphCLKInitTypeDef PeriphClkInit;

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = 16;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**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_HSI;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_I2C1;
  PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_SYSCLK;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**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);
}       //end SystemClock_Config

/** NVIC Configuration
*/
static void MX_NVIC_Init(void)
{
  /* RCC_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(RCC_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(RCC_IRQn);
//  /* FPU_IRQn interrupt configuration */
//  HAL_NVIC_SetPriority(FPU_IRQn, 0, 0);         //Добавил 2 строчки из "Ногодрыг1"
//  HAL_NVIC_EnableIRQ(FPU_IRQn);
//  /* DMA1_Channel6_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
  /* DMA1_Channel7_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);
  /* I2C1_EV_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(I2C1_EV_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(I2C1_EV_IRQn);
  /* I2C1_ER_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(I2C1_ER_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(I2C1_ER_IRQn);
  /* FLASH_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(FLASH_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(FLASH_IRQn);
}       //end NVIC Configuration

/* I2C1 init function */
static void MX_I2C1_Init(void)
{
  hi2c1.Instance = I2C1;
  hi2c1.Init.Timing = 0x2000090E;
  hi2c1.Init.OwnAddress1 = 0;
  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(__FILE__, __LINE__);
  }

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

    /**Configure Digital filter
    */
  if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}       //end MX_I2C1_Init

/**
  * Enable DMA controller clock
  */
static void MX_DMA_Init(void)
{
  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

//  /* DMA interrupt init */    //Закоментил т.к. уже есть в MX_NVIC_Init
//  /* DMA1_Channel6_IRQn interrupt configuration */
//  HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
//  HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
//  /* DMA1_Channel7_IRQn interrupt configuration */
//  HAL_NVIC_SetPriority(DMA1_Channel7_IRQn, 0, 0);
//  HAL_NVIC_EnableIRQ(DMA1_Channel7_IRQn);

}       //end MX_DMA_Init

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
     PA5   ------> SPI1_SCK
     PA6   ------> SPI1_MISO
     PA7   ------> SPI1_MOSI
     PA11   ------> USB_DM
     PA12   ------> USB_DP
    PB6   -----> I2C1_SCL         //Куб не добавляет (здесь) ноги для I2C. Пришлось самому.
    PB7   -----> I2C1_SDA
*/
static void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct;

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

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOE, CS_I2C_SPI_Pin|LD4_Pin|LD3_Pin|LD5_Pin
                          |LD7_Pin|LD9_Pin|LD10_Pin|LD8_Pin
                          |LD6_Pin, GPIO_PIN_RESET);
 
  HAL_GPIO_WritePin(GPIOB, I2C1_SCL_Pin|I2C1_SDA_Pin, GPIO_PIN_RESET); //Добавил GPIOB и I2C1_SCL_Pin|I2C1_SDA_Pin| для ног I2C

  /*Configure GPIO pins : DRDY_Pin MEMS_INT3_Pin MEMS_INT4_Pin MEMS_INT1_Pin
                           MEMS_INT2_Pin */
  GPIO_InitStruct.Pin = DRDY_Pin|MEMS_INT3_Pin|MEMS_INT4_Pin|MEMS_INT1_Pin
                          |MEMS_INT2_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_EVT_RISING;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pins : CS_I2C_SPI_Pin LD4_Pin LD3_Pin LD5_Pin
                           LD7_Pin LD9_Pin LD10_Pin LD8_Pin
                           LD6_Pin */
  GPIO_InitStruct.Pin = CS_I2C_SPI_Pin|LD4_Pin|LD3_Pin|LD5_Pin
                          |LD7_Pin|LD9_Pin|LD10_Pin|LD8_Pin
                          |LD6_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);

  /*Configure GPIO pin : B1_Pin */
  GPIO_InitStruct.Pin = B1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);

  /*Configure GPIO pins : SPI1_SCK_Pin SPI1_MISO_Pin SPI1_MISOA7_Pin */
  GPIO_InitStruct.Pin = SPI1_SCK_Pin|SPI1_MISO_Pin|SPI1_MISOA7_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : DM_Pin DP_Pin */
  GPIO_InitStruct.Pin = DM_Pin|DP_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF14_USB;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
  /*Configure GPIO pins : I2C1_SCL_Pin I2C1_SDA_Pin */
  //Думаю здесь надо настроить ноги для I2C. Куб этого (здесь) не сделал
  GPIO_InitStruct.Pin = I2C1_SCL_Pin|I2C1_SDA_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;       //Open Drain???
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;    //Вставил для I2C
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}       //end MX_GPIO_Init

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  None
  * @retval None
  */
void _Error_Handler(char * file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef USE_FULL_ASSERT

/**
   * @brief Reports the name of the source file and the source line number
   * where the assert_param error has occurred.
   * @param file: pointer to the source file name
   * @param line: assert_param error line source number
   * @retval None
   */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */

}

#endif

/*Функции работы с дальномером------------------------------------------------*/

/*Описание функции чтения данных с дальномера в массив МК. Обращаемся к луне, как к памяти----------*/
void bufLunaMemRead(uint16_t i2cAddress, uint16_t *pReg_Dist, uint16_t sizeReg_Dist, uint8_t *pBuf_Luna_Data, uint8_t numEltBufLunaData)
//Аргументы:
//i2cAddress - адрес дальномера, как слэйва в I2C
//*pReg_Dist - адрес (0-го элемента) массива с адресами регистров дальномера, откуда берутся данные замера расстояния
//sizeReg_Dist - размер массива луны, откуда берутся данные замера расстояния
//*pBuf_Luna_Data - массив (адрес 0-го эл-та, т.е. указатель) МК в который передаётся результат замера
//numEltBufLunaData - размер массива МК (кол-во элементов)
{
  uint16_t *regDistLo = &pReg_Dist[0];      //Сделал переменную с адресом 0-го элемента в регистре луны
  uint8_t *pregBufLunaData1 = &bufLunaData[0];  //Сделал указатель на 0-й элемент массива МК
  HAL_I2C_Mem_Read_DMA(&hi2c1, (i2cAddress<<1), *regDistLo, 1, pregBufLunaData1, 1);
  //Обращаюсь к 0-му элементу дальномера по адресу из указателя regDistLo и записываю в 0-й элемент буфера МК .
  uint16_t *regDistHi = &pReg_Dist[1];      //Сделал переменную с адресом 1-го элемента в регистре луны
  uint8_t *pregBufLunaData2 = &bufLunaData[1];  //Сделал указатель на 1-й элемент массива МК
  HAL_I2C_Mem_Read_DMA(&hi2c1, (i2cAddress<<1), *regDistHi, 1, pregBufLunaData2, 1);
  //Обращаюсь к 1-му элементу дальномера по адресу из указателя regDistHi и записываю в 1-й элемент буфера МК .
  PrintArray (pBuf_Luna_Data, numEltBufLunaData);     //ТЭСТ!!!! Распечатываю одномерный массив. Параметры - указатель на массив (его адрес) и кол-во эл-тов массива.
} //end bufLunaMemRead

/*Описание функции чтения данных с дальномера в массив МК. Обращаемся к луне, как к слэйву-------- */
  void bufLunaSlaveRead(uint16_t i2cAddress, uint16_t *pReg_Dist, uint16_t sizeReg_Dist, uint8_t *pBuf_Luna_Data, uint8_t numEltBufLunaData)
//Аргументы:
//i2cAddress - адрес дальномера, как слэйва в I2C
//*pReg_Dist - адрес (0-го элемента) массива с адресами регистров дальномера, откуда берутся данные замера расстояния
//sizeReg_Dist - размер массива луны, откуда берутся данные замера расстояния
//*pBuf_Luna_Data - массив (адрес 0-го эл-та, т.е. указатель) МК в который передаётся результат замера
//numEltBufLunaData - размер массива МК (кол-во элементов)
  {
     HAL_I2C_Master_Receive_DMA(&hi2c1, (i2cAddress << 1), pBuf_Luna_Data, numEltBufLunaData);  //Принимаем данные от слэйва
    //Аргументы:
    //hi2c1 - структура конфигурации, которая содержит настройки параметров I2C (определена в файле i2c.c)
    //i2cAddress - адрес дальномера, как слэйва в I2C
    //pBuf_Luna_Data - массив (адрес 0-го эл-та, т.е. указатель) МК в который передаётся результат замера
    //numEltBufLunaData - размер массива МК (кол-во элементов)
    PrintArray (pBuf_Luna_Data, numEltBufLunaData);     //ТЭСТ!!!! Распечатываю одномерный массив. Параметры - указатель на массив (его адрес) и кол-во эл-тов массива.
//    TestLed (5);        //ТЭСТ!!!! Если светик моргнул 5 раз, значит я здесь (был).
//    HAL_Delay(1000);    //ТЭСТ!!!! Задержка, чтобы успеть отличить серии из 5-и вспышек.
  } //end bufLunaSlaveRead



/*Отладочные функции----------------------------------------------------------*/
 
/*Сделал ф-ю, чтобы вставлять в код для определения "дошёл ли сюда?".---------*/
void TestLed (uint8_t repeat)   //Аргумент ф-ии: ко-во вспышек светика.
{
  HAL_GPIO_WritePin(LD7_GPIO_Port, LD7_Pin, GPIO_PIN_RESET);   //Погасили светик, если светился.
  uint8_t i = repeat*2-1;       //Вычисляем количество циклов включения/выключения (начиная с 0-го)
  while (i > 0)                 //Мигаем сколько нужно
  {
    i--;
    HAL_GPIO_TogglePin(LD7_GPIO_Port, LD7_Pin);         //ф-я перемены активности светодиода (зелёный LD7, порт PE11).
    HAL_Delay(200);                                     //Задержка, чтобы успеть заметить изменения.
  }
  HAL_GPIO_WritePin(LD7_GPIO_Port, LD7_Pin, GPIO_PIN_RESET);   //Погасили светик, если светился. 
} //endTestLed

/*Создал ф-ю печати одномерного массива. Аргументы: указатель на массив (адрес) и размер массива-------*/
  void PrintArray(uint8_t *Massive, uint8_t NumEltMassive)
  {
    uint8_t i=0;
    while(i<NumEltMassive)            //Проходим по элементам массива.
    {
      printf ("element[%u]= %u\n", i, Massive[i]);      //Распечатывает элементы массива pname построчно (в десятичном формате).
        i++;
    }
    printf ("\n");                    //Переводит строку.
  } //end PrintArray

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


Я так понял, что pData- это указатель (адрес) в микроконтроллере (МК) куда должны скачиваться данные из дальномера. Там я и читаю FF...
Только непонятно из какого места (в дальномере) это читается и могу ли я сам указать (настроить) это место (регистры в луне по даташиту).
Во всех описаниях функции, какие мне попались, в эту подробность не углубляются, типа и так понятно.

Пробовал читать из регистров дальномера через HAL_I2C_Mem_Read_DMA. Результат похожий на правду, но с HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA так и не разобрался. :dont_know:
Прошу пнуть в нужном направлении. Может на форуме или документе на ST что-то подобное обсуждалось.
Спасибо.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y