Здравствуйте. Я немного вот хочу разобраться в вопросе использования модуля на Si4432 посредством библиотек HAL_SPI, т.к. опыта еще в этом не имею... Суть проблемы такова: Исходя из данных, полученных по этой статье http://wiredlogic.io/ru/diy-radio-si443 ... source-ru/ решил получить в ответ от модуля (по JTAG STlink V2) 06h, сконфигурировав проект в CubeMX потом отредактирвав через Keil, собственно и подключив всё подобающим способом, но в ответ по RadioData только 0xFF. Осциллоскопом рассмотреть побайтно пока возможности нет, но короткие пачки по всем трём линиям увидеть можно.
Далее нашёл статью на mcu.bu и решил собрать по аналогии, но результат тот-же, иногда в ответ приходит 0х01.
Буду рад любой информации, особенно по этой теме.
Вот main.c (по последнему варианту): Спойлер
Код:
/* Includes ----------*/ #include "main.h" #include "stm32f1xx_hal.h"
/* 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 */ HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); /* USER CODE END SysInit */
/** * @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
/** * @} */
/** * @} */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Для информации - пин ON - PC13 (LED) - чисто мигает; пин NSEL - PA4 (СS) реализован программно.
Немножко поразбиравшись в вопросе, осциллоскопом обнаружил, что данные по MOSI в соответствии с SCLK посылаются правильно, а линия CS или NSEL отрабатывает гораздо быстрее, чем цикл передачи данных по SPI Почитав даташит, процесс инициализации модуля сделал "по святцам", но упёрся в одну особенность после отправки данных нужно обязательно подтвердить её завершение, а уж потом переводить ногу NSEL в высокое состояние. В связи с этим и посыпались вопросы о реализации. Наткнулся на статью, где описано использование DMA, но т.к. статья имеет довольно мало подробностей, то сделать что-то работающее из этого у меня не вышло, как я делал: В main.c:
Код:
дополнительно добавил гл.перем.: int TXcomplete = 0; int RXcomplete = 0; --далее пропускаем всякую лабуду--- TXcomplete =0; HAL_SPI_Transmit_DMA(&hspi1; &addreess; 1) while (TXcomplete ==1); ну и т.д.
В файле stm32f1xx_it.c соответственно по примеру
Код:
extern int TXcomplete; extern int RXcomplete; ---------- void DMA2_Stream3_IRQHandler(void) { /* USER CODE BEGIN DMA2_Stream3_IRQn 0 */ TXcomplete = 1; /* USER CODE END DMA2_Stream3_IRQn 0 */
HAL_DMA_IRQHandler(&hdma_spi1_tx);
Естественно TXcomplete не становится равной 1. Потому что, я всё делаю не так, а как надо - не знаю.
Пробовал другой вариант, нашёл в электронной литературе по HAL для STM32F1xx функцию HAL_SPI_TX_Cplt() (написал по памяти), которую вроде бы как нужно вызвать для подтверждения передачи, но вызывая её попадаю на код UNUSED в теле void HAL_SPI_TX_Cplt () в файле драйвера hal spi.
Продолжаем монолог, вот, собственно поступил вот так: Код main.c: Спойлер
Код:
/** ****************************************************************************** * 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) 2017 STMicroelectronics * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * 1. Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ----------*/ #include "main.h" #include "stm32f1xx_hal.h"
/** * @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
/** * @} */
/** * @} */
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
HAL_SPI_Transmit_IT(&hspi1, &address, 1); while (TXcomplete == 0);
то фокус проходит, прерывание по завершению передачи проходит, но, естетсвенно, нет чтения Если после transmit сделать так:
Код:
HAL_SPI_Receive_IT(&hspi1, &address, 1); while (RXcomplete == 0);
, то фокус уже не проходит. Радиомодуль уже запаял другой, ошибок в линиях связи нет, как собственно и чтения регистров. И да, если по линии MOSI и SCLK можно наблюдать нормальные соответствующие адресу прямоугольники, то на MISO творится какая-то непонятная хренотень не очень напоминающая сигнал SPI.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Возможно порой были тыканья и бездумными, но старался привести всё в рабочее состояние, порой экспериментировал, но зачастую делал так, как оно должно быть (я так думаю). Есть один нюанс - замечательная функция в HAL, а именно HAL_SPI_TransmitReceive, блокирующая функция, в принципе этого и достаточно для чисто проверки работоспособности модуля, её в основном в пример и ставят, как это делалось по ссылке из первого поста, достаточно поставить перед функцией NSEL в ноль, а после в 1. И NSEL действительно отрабатывает как положено.
Код:
всё это в while HAL_GPIO_WritePin(ON_GPIO_Port, ON_Pin, GPIO_PIN_RESET); // SDN опускаем в ноль; HAL_Delay (15); //ждём 15мс - по документации; HAL_GPIO_WritePin(NSEL_GPIO_Port, NSEL_Pin, GPIO_PIN_RESET); // NSEL в ноль; address = 0x01; HAL_SPI_TransmitReceive (&hspi1, &address, &data2, 1, 1000); //передаём адрес; address = 0x00; HAL_SPI_TransmitReceive (&hspi1, &address, &data2, 1, 1000); //передаём данные (нули) и здесь должны получить в ответ в data2; HAL_GPIO_WritePin(NSEL_GPIO_Port, NSEL_Pin, GPIO_PIN_SET); //поднимаем NSEL; HAL_Delay (1); HAL_GPIO_WritePin(ON_GPIO_Port, ON_Pin, GPIO_PIN_SET); //переводим в SHUTDOWN; HAL_Delay (1);
Как выглядит дело визуально (логического анализатора пока нет, пока...) один из каналов осциллографа немного не настроен, но сути не меняет.
Сигнал MOSI относительно синхронизации по SCK:
Сигнал MISO относительно синхронизации по SCK (как видно - даже не колышется):
Сигнал NSEL:
А вот, собственно, инфо из даташита:
Возможно сказывается временной промежуток между пачками тактирующего сигнала, в таком случае можно передавать сразу 16 бит данных, но как в эти 16 бит увязать для передачи двух переменных адреса и данных еще не знаю... Модуль уже третий из 4-х, да и плату с STM32 уже другую взял. Подключение:
На плате МК ------- На модуле PA7 (MOSI) -------- SDI PA6 (MISO) -------- SDO PA5 (SCK) -------- SCLK PA4 (SS) -------- NSEL PB0 (ON_Pin)-------- SDN 3V3 -------- VDD ну и GND само собой.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Вроде бы и внимательно читал, всё соответствует рабочей конфигурации, как Ваш пример, так и мои примеры... Хоть и медленно, но ехать то как-то должно... Мисо молчит и никаких признаков жизни, единственное - если SDN физически отключить, на MISO появляются какие-то помехи, не очень похожие на полноценные единицы в момент работы SCK. И как-то вот хоронить весь КА HAL из-за такой ситуации не очень нравится, хочется уж точно разобраться в проблеме... Да и в чём, собственно вина HALа -то?, осциллограммы показывают, что посылается равным счетом то, что и хотелось. Если уж здесь есть какие проблемы со стороны драйвера хала, то без проблем, возьмём другой вектор направления.. А пока что внутренний голос намекает на мои косяки или на нерабочие модули... И да, как у опытного специалиста хочу спросить: вот эти промежутки между пакетами SCK могут как-то влиять на происходящее?
Ну да, вход, подключенный к выходу слейва SDO. На этом этапе, наверное стоит посмотреть в сторону других проверенных spi устройств, ничего правда под руку не попадается, кроме spi flash...
Если вы все же перейдете на нормальный кодинг, я смогу вам предоставить и помощь и ответы на интересующие вас вопросы. Поймите ни с калокубом ни с SPL у вас ничего не выйдет это раз. И помогать вам никто не сможет. Все приверженцы г.либ слепы как кроты. А у меня нет никакого желания толкать вас на путь аурдуньи...
Наверное Вы правы. Это вот очень похоже на мою проблему. Последний коммент автора окончательно хоронит мои радужные представления о CubeMX, для автора всё превосходно, для меня же - мрак.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения