tw1911
Members-
Постов
38 -
Зарегистрирован
-
Посещение
Достижения tw1911
-
Нашел я в чем дело. В общем не смотря на то, что рекомендуют для данного акселерометра заводить 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. Очень странное для старожила поведение. Увижу еще раз такое - будет жалоба администрации. Я Вас не оскорблял. Переход на личности - это как раз отличный показатель мозгов.
-
Да было бы чем посмотреть - давно бы посмотрел. У меня есть есть с1-55, но вряд ли на нем такое увидишь.
-
Так, вижу у Вас другой акселерометр. Я посмотрел, даже на форумах СТ есть несколько вопросов по данным аселям, и одни вопросы, ответов нет. Не порядок.
-
Хосспади, да уймись ты. Далал я так, не работает. А Вы не могли бы выложить целый проект или хотя бы файл куба что я мог настройки SPI проверить, может тут собака порылась?
-
Сказка - ложь, да в ней намёк...
tw1911 прокомментировал Falconist запись блога в Falconist. Мемуары
Про помидорки тут выше писали, в моей семье почти такая же шутка есть, только про яблочки. Раньше, когда сад давал много яблок, их складывали на зиму в подвал и ели только те, которые начинали портиться. В результате жрали только испорченные яблоки...- 28 комментариев
-
2
-
- притчи
- высказывания
-
(и ещё 1 )
C тегом:
-
А задержки в 400мс ему типа не хватает?
-
У меня 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. Все так же.
-
Слушайте, как Вы написали один хрен не работает.
-
Я не совсем понимаю о какой предделителе идет речь в ссылке. Если об BaudRatePrescaler, то нет, это не мой случай. В общем пока получается так. Первый раз отправляем хоть что то. Потом отправляем нормальный адрес и считываем.
-
Вот так в приемном буфере будет 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 Что то совсем непонятное(
-
Так то оно так, но в данном конкретном случае как раз первый байт содержит команду, и мне абсолютно без разницы что там содержится в ответе, а вот второй передают что угодно, но принимать в это время должен данные из регистра WHO_AM_I. Но почему то оно не работает так первый раз. А второй раз работает. Причем паузу в разных местах я пробовал вставлять вплоть до секунды, и это не дает никакого результата.
-
В даташите нет ничего про паузу. Рисунок же есть. К том же через SPL все и без паузы работает.
-
Ну это, я передаю сначала адрес, там 8F(0F|1000000) соответственно в ответе будет FF, а когда я толкаю второй байт(00), в ответе должна быть по идее содержимое регистра. Разве не так? Вроде бы рисунок 7 на странице 23 к мануалу акселерометра. Это для того, что бы не менять размер все время и не ошибаться все время.
-
Да так то же не работает. На самом деле, если написать 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 просто передать на чип хоть что нибудь. Но все равно, может кто нибудь объяснить что это ???
-
Да так то он работает. и делал я так же. Просто хочу перевести это все на HAL, а тут грабли. Самое забавное, что с DMA оно вроде бы работает. Но как то странно, почему то CS наоборот работает. Короче надо сначала с базовым SPI разобраться. Может кто то подскажет какие особенности работы или скинет рабочий пример?