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

У меня хорошо работает такая инициализация:

void __inline init_SPI2(void)
{
SPI2->CR1 =
		(0 << SPI_CR1_SPE)
	| (0 << SPI_CR1_DFF)
	| (1 << SPI_CR1_SSM)
	| (1 << SPI_CR1_SSI)
	| (1 << SPI_CR1_MSTR)
	| (0 << SPI_CR1_BR);

SPI2->CR2 =
	  (0 << SPI_CR2_RXNEIE)
	| (0 << SPI_CR2_TXDMAEN)
	| (1 << SPI_CR2_SSOE);

SPI2->CR1 =
		(1 << SPI_CR1_SPE)
	| (0 << SPI_CR1_DFF)
	| (1 << SPI_CR1_SSM)
	| (1 << SPI_CR1_SSI)
	| (1 << SPI_CR1_MSTR)
	| (0 << SPI_CR1_BR);
}

 

И такая отправка/прием

BYTE sd_send_byte(const BYTE data)
{
    BYTE spib;
    while((SPI2->SR & (1 << SPI_SR_TXE)) == 0);
    SPI2->DR = data;
    while((SPI2->SR & (1 << SPI_SR_RXNE)) == 0);
    spib = SPI2->DR;
    return spib;
}

 

Правда, битики я объявляю номером, а не маской...

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я свои SPI в STM32F207 инициализировал так. Тактирование, естественно, задавал раньше, вместе с остальными устройствами. И больше не трогал.

/* SPI1 -- связь с SFM M25PE40
  8-bit, MSB first, SPEn, Fpclk2 / 4 (15 MHz), Master, CPOL=0, CPHA=0 */
 SPI1->CR1 = 
SPI_CR1_CPHA * 0 |		// Clock Phase
SPI_CR1_CPOL * 0 |		// Clock Polarity
SPI_CR1_MSTR * 1 |		// Master Selection
SPI_CR1_BR_0 * 1 |		// Baud Rate Control - fpclk2 / 4 = 15 MHz
SPI_CR1_BR_1 * 0 |		// 
SPI_CR1_BR_2 * 0 |		// 
SPI_CR1_SPE * 1 |		// SPI Enable
SPI_CR1_LSBFIRST * 0 |		// Frame Format
SPI_CR1_SSI * 1 |		// Internal slave select
SPI_CR1_SSM * 1 |		// Software slave management
SPI_CR1_RXONLY * 0 |		// Receive only
SPI_CR1_DFF * 0 |		// Data Frame Format
SPI_CR1_CRCNEXT * 0 |		// Transmit CRC next
SPI_CR1_CRCEN * 0 |		// Hardware CRC calculation enable
SPI_CR1_BIDIOE * 0 |		// Output enable in bidirectional mode
SPI_CR1_BIDIMODE * 0;		// Bidirectional data mode enable
 SPI1->CR2 = 
SPI_CR2_RXDMAEN * 0 |		// Rx Buffer DMA Enable
SPI_CR2_TXDMAEN * 0 |		// Tx Buffer DMA Enable
SPI_CR2_SSOE * 0 |		// SS Output Enable
SPI_CR2_FRF * 0 |	// Protocol format - 0: SPI Motorola mode, 1: SPI TI mode
SPI_CR2_ERRIE * 0 |		// Error Interrupt Enable
SPI_CR2_RXNEIE * 0 |		// RX buffer Not Empty Interrupt Enable
SPI_CR2_TXEIE * 0;		// Tx buffer Empty Interrupt Enable
 // SPI1->CR1 |= SPI_CR1_MSTR | SPI_CR1_SPE;	// Разрешить, Мастер

/* SPI2 -- конфигурирование EP3C5
  CONF_N (NSS) переключается программно */
 SPI2->CR1 = 
SPI_CR1_CPHA * 0 |		// Clock Phase
SPI_CR1_CPOL * 0 |		// Clock Polarity
SPI_CR1_MSTR * 1 |		// Master Selection
SPI_CR1_BR_0 * 0 |		// Baud Rate Control - fpclk1 / 2 = 15 MHz
SPI_CR1_BR_1 * 0 |		// 
SPI_CR1_BR_2 * 0 |		// 
SPI_CR1_SPE * 1 |		// SPI Enable (раньше включалось позже!)
SPI_CR1_LSBFIRST * 1 |		// Frame Format
SPI_CR1_SSI * 1 |		// Internal slave select (раньше задавалось!)
SPI_CR1_SSM * 1 |		// Software slave management
SPI_CR1_RXONLY * 0 |		// Receive only
SPI_CR1_DFF * 0 |		// Data Frame Format - 8 bit
SPI_CR1_CRCNEXT * 0 |		// Transmit CRC next
SPI_CR1_CRCEN * 0 |		// Hardware CRC calculation enable
SPI_CR1_BIDIOE * 0 |		// Output enable in bidirectional mode
SPI_CR1_BIDIMODE * 0;		// Bidirectional data mode enable
 SPI2->CR2 = 
SPI_CR2_RXDMAEN * 0 |		// Rx Buffer DMA Enable
SPI_CR2_TXDMAEN * 0 |		// Tx Buffer DMA Enable
SPI_CR2_SSOE * 0 |		// SS Output Enable (все равно используется GPIO?)
SPI_CR2_FRF * 0 |	// Protocol format - 0: SPI Motorola mode, 1: SPI TI mode
SPI_CR2_ERRIE * 0 |		// Error Interrupt Enable
SPI_CR2_RXNEIE * 0 |		// RX buffer Not Empty Interrupt Enable
SPI_CR2_TXEIE * 0;		// Tx buffer Empty Interrupt Enable
 // SPI2->CR1 |= SPI_CR1_SPE;

/* SPI3 -- регистр управления аналоговыми узлами
  8-bit, MSB first, SPEn, Fpclk1 / 2 (15MHz), Master, CPOL=0, CPHA=0
  74HC595 SCK - Pos, AD5314 SCK - Neg (изменить CPOL) */
 SPI3->CR1 = 
SPI_CR1_CPHA * 0 |		// Clock Phase
SPI_CR1_CPOL * 0 |		// Clock Polarity HC595
SPI_CR1_MSTR * 1 |		// Master Selection
SPI_CR1_BR_0 * 0 |		// Baud Rate Control - fpclk1 / 2 = 15 MHz
SPI_CR1_BR_1 * 0 |		// 
SPI_CR1_BR_2 * 0 |		// 
SPI_CR1_SPE * 1 |		// SPI Enable
SPI_CR1_LSBFIRST * 0 |		// Frame Format
SPI_CR1_SSI * 1 |		// Internal slave select
SPI_CR1_SSM * 1 |		// Software slave management
SPI_CR1_RXONLY * 0 |		// Receive only
SPI_CR1_DFF * 0 |		// Data Frame Format (8 bit)
SPI_CR1_CRCNEXT * 0 |		// Transmit CRC next
SPI_CR1_CRCEN * 0 |		// Hardware CRC calculation enable
SPI_CR1_BIDIOE * 0 |		// Output enable in bidirectional mode
SPI_CR1_BIDIMODE * 0;		// Bidirectional data mode enable
 SPI3->CR2 = 
SPI_CR2_RXDMAEN * 0 |		// Rx Buffer DMA Enable
SPI_CR2_TXDMAEN * 0 |		// Tx Buffer DMA Enable
SPI_CR2_SSOE * 0 |		// SS Output Enable
SPI_CR2_FRF * 0 |	// Protocol format - 0: SPI Motorola mode, 1: SPI TI mode
SPI_CR2_ERRIE * 0 |		// Error Interrupt Enable
SPI_CR2_RXNEIE * 0 |		// RX buffer Not Empty Interrupt Enable
SPI_CR2_TXEIE * 0;		// Tx buffer Empty Interrupt Enable

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наконец-то увидел инициализацию.

Зачем SSI и SSM одновременно ставить? В моём (работающем) варианте только SSM стоит (на что я и обращал внимание).

А как следствие - отказ SPI работать, когда кто-то другой держит сигнал SS.

нашел вот тут такое руководство http://chipspace.ru/stm32-spi/

 

в нем утверждается что если поставить SSM, чтобы устройство было мастером необходимо поставить и SSI, это будет двигать уровень NSS, тоже говорит и реф мануал...

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в нем утверждается что если поставить SSM, чтобы устройство было мастером необходимо поставить и SSI, это будет двигать уровень NSS, тоже говорит и реф мануал...

В комментах к руководству есть подтверждения проблем. Кроме всего прочего, в статье указывается о диагностике, с которой SPI MASTER переходит в режим SLAVE из-за проблем с NSS. Нашему коллеге с проблемами в SPI может помочь.

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

не понятно почему пауза перед записью в регистр помогала решить проблему... может все таки что-то схемное...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в нем утверждается что если поставить SSM, чтобы устройство было мастером необходимо поставить и SSI, это будет двигать уровень NSS, тоже говорит и реф мануал...

так это и я говорил вот в этом посте, ссылаясь на даташит:

http://electronix.ru/forum/index.php?showt...t&p=1156434

 

 

 

не понятно почему пауза перед записью в регистр помогала решить проблему... может все таки что-то схемное...

да нет там ничего сложного в схеме, цепляю выводи к осциллографу и все.

А плата стандартная дискавери.

 

Golikov A. за линк спасибо, пройдусь по нему тоже.

 

Genadi Zawidowski: использование только SSM без SSI проблему тоже не решало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так и не увидел ответа, что SPI не работал из-за того, что тактовая частота на модуль SPI подавалась непосредственно перед его использованием.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так и не увидел ответа, что SPI не работал из-за того, что тактовая частота на модуль SPI подавалась непосредственно перед его использованием.

 

потому что это не так.

 

перед отправкой байта пробовали втыкать посылку по уарт явно больше 2 тактов шины

после отправки ставили while(1) на случай если бит TXE ставиться с задержкой.

пробовали ждать ТХЕ до отправки он в 1 и ситуация таже.

 

нужна достаточно долгая пауза перед стартом, непонятно почему. Я ставлю на то что либо какие то клоки стабилизируются (не понятно почему тогда УАРТ работает), или что-то заряжается... вообщем ситуация странная о чем мы все и говорим...

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если вход NSS перед началом передачи где-то около "0", то и не передаст. Если успел зарядиться - то прокатывает. Я "ставлю" на это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

нужна достаточно долгая пауза перед стартом, непонятно почему. Я ставлю на то что либо какие то клоки стабилизируются (не понятно почему тогда УАРТ работает),

в этом посте:

http://electronix.ru/forum/index.php?showt...t&p=1156458

 

я как раз таки хотел сказать в пункте 1), что отправка байта с УАРТ тоже не сработала! пришлось поставить непрерывный цикл, и ждать команды от того же уарта (приема от него байта команды) который прерывает цикл, а дальше код исполняет ту процедуру с отправкой байта в СПИ.

 

 

Если вход NSS перед началом передачи где-то около "0", то и не передаст. Если успел зарядиться - то прокатывает. Я "ставлю" на это.

Я не думаю что это так, потомучто я сделал такой тест:

 

Подключил к осциллографу не только SCK/MOSI, но еще и NSS. И включил передачю байта разумеется в режиме в котором у меня работает нормально, т.е. байт я вижу на осциллографе.. а вот НСС всегда нулевой! Даже не дернулся во время передачи! (хотя байт сам передался как надо я ето вижу на дисплее осциллографа)

хотя это странно у меня же и SSM и SSI поставлены как 1...

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет желания подтянуть к "1" вывод NSS? ИЛи поиграться отключением его от вывода процессора?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Детский сад... гадание пальцем на манной каше... :biggrin:

Да не так это всё делается... по хорошему...

Выкладывается проект со всеми настройками, по самому минимуму и без всяких излишеств... типа УАРТ и прочей хрени... когда ещё глюк "имеет место быть"...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выкладывается проект со всеми настройками, по самому минимуму и без всяких излишеств...

+1.

Имею Дискавери F4, Кейл. Могу проверить. И осциллограф - Agilent. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Имею Дискавери F4, Кейл. Могу проверить. И осциллограф - Agilent. :)

Вобщем, щас загрузил кусочек ТС к себе на плату (скопировал и вставил с первого поста) с STM405, все работает

Не выложена инициализация портов.

Так что, гдето в другом месте лажа.

Прошу прощения не первый, а с настройкой SPI

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не выложена инициализация портов.

Ага... и в итоге окажется, что ноги настроены open-drain и Low Speed... :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...