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

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

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

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

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

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


 
Опции темы
Непрочитано 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.RU
 
Аватар для NewWriter
 
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,516
Сказал спасибо: 401
Сказали Спасибо 2,220 раз(а) в 1,318 сообщении(ях)
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, время: 12:27.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot