Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32F746 Конфигурация SPI

Непрочитано 14.10.2016, 06:10  
Jane9226
Прописка
 
Регистрация: 26.10.2011
Сообщений: 122
Сказал спасибо: 53
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
Jane9226 на пути к лучшему
По умолчанию STM32F746 Конфигурация SPI

Ребята я снова к вам за помощью. Всем здравствуйте.
Не могу добиться внятной работы SPI.
Плата STM32F746 DISCO Пытаюсь считывать данные с трех AD7687 использую выведенный на CN7 SPI2
ADC подключены как на стр 21 даташита
Если сконфигурировать SPI Recieve Only SPI SCK выдает не 16 ожидаемых тактов, а 24 (смотрю осцилографом). Вообщем уже всю голову сломала, а результата нет. Данные в регистре DR прыгают по всему диапазону (в основном возле крайних значений к примеру: то FFC0, то 00B2) Такое впечатление что AD7687 конфликтуют друг с другом, пытаясь одновременно передавать данные, выход данных SDO всех трех включен параллельно. Хотя CS выставляется по очереди иправно. Только вот остается в низком уровне все 24 такта. Но все же я склонна думать, что что то не так с инициализацией SPI (особенно учитывая что сгенерирована она кубом).
Код:
hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
  hspi2.Init.DataSize = SPI_DATASIZE_16BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 7;
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
Может у кого нибудь есть пример "прямой" инициализации SPI для данного контроллера, без использования HAL? (Вытянуть самой инициализацию из дремучих дебрей HAL не получилось) Буду очень благодарна.
Реклама:
Jane9226 вне форума  
Непрочитано 14.10.2016, 20:22  
NewWriter
Почётный гражданин KAZUS.RUN
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,481
Сказал спасибо: 396
Сказали Спасибо 2,222 раз(а) в 1,317 сообщении(ях)
NewWriter на пути к лучшему
По умолчанию Re: STM32F746 Конфигурация SPI

Во-первых, эти АЦП-шки можно подключить не параллельно, а последовательно в цепь, daisy-chain называется (схема со стр.23). И тогда можно одним потоком принять байты с обеих АЦП, 4 байта сразу, не заморачиваясь с переключением CS между ними.
А во-вторых, если SPI работает только на прием, то его остановить можно только принудительно, после приема желаемого количества байтов. То есть, в прерывании по приему SPI нужно считать принятые байты, и как только приняли все, останавливаем прием, выключив SPI. Ну а там, после этого, если все-же АЦП-шки подсоединены параллельно, переключаем CS на другую АЦП и запускаем SPI опять.
В вашем выложенном коде не хватает секции приема - как она у вас сделана, нам не известно.
Скорее всего, проблема именно в несвоевременном переключении CS. Оно ведь вручную (программно) идет.

Инициализация "напрямую" через CMSIS записывается очень легко :
PHP код:
/* .....................
 * Настройка SPI
 * Master, 1/32 APB1, 16 bit, RX, SSI
 */
    RCC-›APB1ENR |= RCC_APB1ENR_SPI2EN;                    // Тактирование SPI

    SPI2-›CR1 |= SPI_CR1_SSM | SPI_CR1_SSI |            // Soft select master mode
                 SPI_CR1_RXONLY |                        // Режим RX
                 SPI_CR1_DFF |                            // 16-бит
                 SPI_CR1_MSTR |                    // Master
                 SPI_CR1_BR_2 ;                // Скорость интерфейса, 1/32 AHB1

    SPI2-›CR2 |= SPI_CR2_RXNEIE;            // Разрешены прерывания 
                               //от заполнения буфера приема
    NVIC_EnableIRQ (SPI2_IRQn);                        // Разрешен вектор прерывания от SPI2

    SPI2-›CR1 |= SPI_CR1_SPE;                        // Разрешена работа SPI 

Последний раз редактировалось NewWriter; 14.10.2016 в 20:30.
NewWriter вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
FAQ (ЧаВО) по PROTEUS для начинающих и не только dosikus Proteus 221 07.03.2024 22:45
Кто-нибудь работал с RF модулями nRF2401A? Easyrider83 Автоматика и аппаратура связи 1481 04.09.2021 23:24
Atmega16 - много переферийных устройств SPI pavned AVR 21 23.01.2013 07:00
Работа с EEPROM по SPI dominik2 Микроконтроллеры, АЦП, память и т.д 15 05.05.2012 00:24
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 08:23.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.