Перейти к содержанию

tw1911

Members
  • Постов

    38
  • Зарегистрирован

  • Посещение

Весь контент tw1911

  1. tw1911

    CubeHAL SPI и LIS3DH

    Нашел я в чем дело. В общем не смотря на то, что рекомендуют для данного акселерометра заводить CPOL=1 и CPHASE = 1, почему то через HAL оно отлично работает и CPOL=0 и CPHASE = 0. Соответственно никакие таймауты, задержки не нужны. Минимальный код: uint8_t SPI_Out[2] = {0x8F,0x00}; uint8_t SPI_In[2]; HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, SPI_Out, SPI_In, 2, 5); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); UPDATE: проверил на SPL, так же работает независимо от CPLO-CPHA. Очень странное для старожила поведение. Увижу еще раз такое - будет жалоба администрации. Я Вас не оскорблял. Переход на личности - это как раз отличный показатель мозгов.
  2. tw1911

    CubeHAL SPI и LIS3DH

    Да было бы чем посмотреть - давно бы посмотрел. У меня есть есть с1-55, но вряд ли на нем такое увидишь.
  3. tw1911

    CubeHAL SPI и LIS3DH

    Так, вижу у Вас другой акселерометр. Я посмотрел, даже на форумах СТ есть несколько вопросов по данным аселям, и одни вопросы, ответов нет. Не порядок.
  4. tw1911

    CubeHAL SPI и LIS3DH

    Хосспади, да уймись ты. Далал я так, не работает. А Вы не могли бы выложить целый проект или хотя бы файл куба что я мог настройки SPI проверить, может тут собака порылась?
  5. Про помидорки тут выше писали, в моей семье почти такая же шутка есть, только про яблочки. Раньше, когда сад давал много яблок, их складывали на зиму в подвал и ели только те, которые начинали портиться. В результате жрали только испорченные яблоки...
  6. tw1911

    CubeHAL SPI и LIS3DH

    А задержки в 400мс ему типа не хватает?
  7. tw1911

    CubeHAL SPI и LIS3DH

    У меня stm32f407i-disco. Могу файлик куба выложить. Но тактирование у меня от внешнего 8Мгц кварца. Мне правда кажется, что вы не совсем понимаете мою проблему. У меня как бы не совсем передача не работает. У меня она работает просто только после того, как я хоть что нибудь передам на аксель и дерну CS. uint8_t SPI_Out[2] = {0x8F,0x00}; uint8_t SPI_In[2]; uint8_t dummyAdr = 0xFF; HAL_Delay(400); if(HAL_SPI_GetState(&hspi1)==HAL_SPI_STATE_READY){ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_Transmit(&hspi1, &dummyAdr, 2, 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, SPI_Out, SPI_In, 2, 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); } К примеру вот такой код отлично работает при любых настройках. Но мне нужна правда. Или место в доках, где написано что оно должно работать именно так, ну что то такое, что объясняет происходящее. А то мне как то боязно двигаться дальше без четкого понимания происходящего. SPI_HAL.ioc UPD Проверил и с дефолтной настройой тактирования от встроенного RC - та же песня. UPD2 Проверил то же самое с DMA. Все так же.
  8. tw1911

    CubeHAL SPI и LIS3DH

    Слушайте, как Вы написали один хрен не работает.
  9. tw1911

    CubeHAL SPI и LIS3DH

    Я не совсем понимаю о какой предделителе идет речь в ссылке. Если об BaudRatePrescaler, то нет, это не мой случай. В общем пока получается так. Первый раз отправляем хоть что то. Потом отправляем нормальный адрес и считываем.
  10. tw1911

    CubeHAL SPI и LIS3DH

    Вот так в приемном буфере будет FF,FF. А вот если написать HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, SPI_Out, SPI_In, 2, 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); //в этом местее FF,FF HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, SPI_Out, SPI_In, 2, 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);//а вот тут FF,3F Что то совсем непонятное(
  11. tw1911

    CubeHAL SPI и LIS3DH

    Так то оно так, но в данном конкретном случае как раз первый байт содержит команду, и мне абсолютно без разницы что там содержится в ответе, а вот второй передают что угодно, но принимать в это время должен данные из регистра WHO_AM_I. Но почему то оно не работает так первый раз. А второй раз работает. Причем паузу в разных местах я пробовал вставлять вплоть до секунды, и это не дает никакого результата.
  12. tw1911

    CubeHAL SPI и LIS3DH

    В даташите нет ничего про паузу. Рисунок же есть. К том же через SPL все и без паузы работает.
  13. tw1911

    CubeHAL SPI и LIS3DH

    Ну это, я передаю сначала адрес, там 8F(0F|1000000) соответственно в ответе будет FF, а когда я толкаю второй байт(00), в ответе должна быть по идее содержимое регистра. Разве не так? Вроде бы рисунок 7 на странице 23 к мануалу акселерометра. Это для того, что бы не менять размер все время и не ошибаться все время.
  14. tw1911

    CubeHAL SPI и LIS3DH

    Да так то же не работает. На самом деле, если написать HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, SPI_Out, SPI_In, sizeof(SPI_In), 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, SPI_Out, SPI_In, sizeof(SPI_In), 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); И поставить бряк в 3 и 6 строки, то в первом бряке будет значение FF,FF, а во втором FF,3F, то есть по идее то что надо. Но какого оно так работает вообще не понятно. UPDATE В общем опытным путем установил, что оно работает, если в отдельном CS ON-OFF просто передать на чип хоть что нибудь. Но все равно, может кто нибудь объяснить что это ???
  15. tw1911

    CubeHAL SPI и LIS3DH

    Да так то он работает. и делал я так же. Просто хочу перевести это все на HAL, а тут грабли. Самое забавное, что с DMA оно вроде бы работает. Но как то странно, почему то CS наоборот работает. Короче надо сначала с базовым SPI разобраться. Может кто то подскажет какие особенности работы или скинет рабочий пример?
  16. tw1911

    CubeHAL SPI и LIS3DH

    Добрые день! Простите если вопрос нубский. Пытаюсь подружиться с CubeMX и акселерометром. В общем начну с простого, по обычному SPI, без DMA и прерываний пытаюсь получить байт идентификатора по адресу 0x0F, он по идее должен быть 3F, но почему то код возвращает FF, хотя, если тот же кусок кода написать второй раз следом, получается нормально. Смотрю результат через отладчик. Что то я видимо не понимаю... #include "main.h" #include "stm32f4xx_hal.h" /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private variables ---------------------------------------------------------*/ SPI_HandleTypeDef hspi1; /* USER CODE BEGIN PV */ /* Private variables ---------------------------------------------------------*/ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); void Error_Handler(void); static void MX_GPIO_Init(void); static void MX_SPI1_Init(void); /* USER CODE BEGIN PFP */ /* Private function prototypes -----------------------------------------------*/ /* USER CODE END PFP */ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ int main(void) { /* USER CODE BEGIN 1 */ uint8_t SPI_Out[2] = {0x8F,0x00}; uint8_t SPI_In[8]; /* 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_SPI1_Init(); /* USER CODE BEGIN 2 */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET); HAL_SPI_TransmitReceive(&hspi1, SPI_Out, SPI_In, sizeof(SPI_In), 100); HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } /** System Clock Configuration */ void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct; RCC_ClkInitTypeDef RCC_ClkInitStruct; /**Configure the main internal regulator output voltage */ __HAL_RCC_PWR_CLK_ENABLE(); __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); /**Initializes the CPU, AHB and APB busses clocks */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 8; RCC_OscInitStruct.PLL.PLLN = 336; RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; RCC_OscInitStruct.PLL.PLLQ = 4; 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_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV4; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != 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); } /* SPI1 init function */ static void MX_SPI1_Init(void) { hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; hspi1.Init.CRCPolynomial = 10; if (HAL_SPI_Init(&hspi1) != HAL_OK) { Error_Handler(); } } /** Configure pins as * Analog * Input * Output * EVENT_OUT * EXTI */ static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin Output Level */ HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET); /*Configure GPIO pin : PE3 */ GPIO_InitStruct.Pin = GPIO_PIN_3; 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); } /* 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(void) { /* USER CODE BEGIN Error_Handler */ /* User can add his own implementation to report the HAL error return state */ while(1) { } /* USER CODE END Error_Handler */ } #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 /** * @} */ /** * @} */ И еще, я не особо уверен в смысле аргумента timout. Я так понимаю, это время которое он ждет в случае занятости интерфейса?
  17. Я конечно это проверю. Но вообще это очень странно. Может DS что поменяли?
  18. По умолчанию. Должно быть 12 бит. Выше приведенные примеры абсолютно одинаковые. Я только датчик переткнул.
  19. В общем взял из примеров Arduino пример кода на ds18b20, считал ROM = 28 FF 99 42 62 15 2 AE, а вот показания ROM = 28 FF 99 42 62 15 2 AE Chip = DS18B20 Data = 1 E8 1 80 80 1F FF 80 80 96 CRC=96 Temperature = 30.50 Celsius, 86.90 Fahrenheit No more addresses. ROM = 28 FF 99 42 62 15 2 AE Chip = DS18B20 Data = 1 F0 1 80 80 1F FF 80 80 E8 CRC=E8 Temperature = 31.00 Celsius, 87.80 Fahrenheit No more addresses. В общем похоже точность четко 9 битная. Вот показания другого датчика ROM = 28 FF EE 17 64 14 3 80 Chip = DS18B20 Data = 1 DE 1 55 0 7F FF C 10 FE CRC=FE Temperature = 29.87 Celsius, 85.77 Fahrenheit No more addresses. ROM = 28 FF EE 17 64 14 3 80 Chip = DS18B20 Data = 1 E3 1 55 0 7F FF C 10 7E CRC=7E Temperature = 30.19 Celsius, 86.34 Fahrenheit No more addresses. ROM = 28 FF EE 17 64 14 3 80 Chip = DS18B20 Data = 1 E8 1 55 0 7F FF C 10 91 CRC=91 Temperature = 30.50 Celsius, 86.90 Fahrenheit No more addresses. Забавно, что первый я купил в магазине, и второй на али.
  20. У меня вроде бы все работает с elf. Протеус 8, Студия седьмая.
  21. О, хорошая идея. Как то совсем не подумал, там же серия устройства указывается. У меня, правда, в этом устройстве нет такой возможности, но достану свою старую ардуинку для такого дела. Если правда подделка, то буду искать правду у магазина.
  22. На датчике написано 18B20, процедура у меня самописная. Отправляем запрос на чтение памяти, и читаем блокнот. Дальше берем 4 бита после запятой и кейсом делаем из них десятые.
  23. Делаю простое устройство, хотел добиться точности до десятых. Проверил код в Proteus, все работает нормально. Дальше прошил на макетке, а тут началось странное. Почему то температура прирастает только по 0.5 градуса. При этом точность по умолчанию, 12 бит. Потом плюнул, взял заказанные из китая датчики в корпусе с кабелем, подключил - все как часы заработало. Получается, что датчик который у меня подделка из какого то менее точного датчика?
  24. Пожалуй да! Было бы любопытно. Посмотрел я правда на полевик. который используется, очень не кисло получается, в плане цены.
  25. Ваша правда. Я просто не силен в схемотехнике и не смог бы правильно рассчитать такую схему, к том у же у меня на тот момент были трудности с компонентами. У меня это все уместилось на кружочке около 30мм, но правда там дроссель довольно крупный, явно больше чем надо и мк в корпусе SIOC широком, плюс кнопка. Плюс сам диод там же и компоненты я располагал так, что бы они не давали тень. Это вроде как светильник, не фонарик сфокусированный. Просто корпус у меня уже был, и я делал плату взамен неисправной.
×
×
  • Создать...