реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F100 - не могу записать данные в SPI_DR
RAmsi
сообщение Jul 28 2016, 15:58
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



SPI1 в режиме slave. Настроено прерывание по получению байта от SPI master от другого контроллера. В прерывании пытаюсь записать в SPI_DR байт из буфера (или просто число 0b00110011), который будет передаваться при следующем сеансе по инициативе masterа. Master принимает сплошные нули, а SPI1_DR в slave после SPI1->DR = 0b00110011 или SPI_I2C_SendData(...) не меняет свое значение. Как затолкнуть данные в приемный буфер SPI slave? Фантазия по поиску криворукого бага иссякла, тем более, что подобная конструкция раньше прекрасно работала. Код, настройки SPI и состояние регистров в скринах дебага.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение


Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
uriy
сообщение Jul 29 2016, 04:38
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Покажите настройки GPIO
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 29 2016, 06:44
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (RAmsi @ Jul 28 2016, 18:58) *
Master принимает сплошные нули
С этим надо разбираться. Для начала отключите slave или его CS и замкните MOSI-MISO на мастере. После этого мастер должен принимать то, что сам же и передает. Когда это заработает - можно будет приниматься за slave.
QUOTE (RAmsi @ Jul 28 2016, 18:58) *
а SPI1_DR в slave после SPI1->DR = 0b00110011 или SPI_I2C_SendData(...) не меняет свое значение.
А вот это нормально. На самом деле там два регистра - в один данные принимаются (именно его содержимое вы видете, когда читаете DR), а из второго передаются (в него они попадают, когда вы пишете в DR). То есть независимо от того, что вы записали - читаться все равно будет последний принятый байт.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
RAmsi
сообщение Jul 29 2016, 09:19
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 46
Регистрация: 5-04-09
Пользователь №: 47 200



Цитата
Покажите настройки GPIO

GPIO в скрине. Извините, но только в таком виде. Используется SPI1 - NSS отключен, PA5 - клокер, PA6 - MISO, PA7 - MOSI
Цитата
На самом деле там два регистра - в один данные принимаются (именно его содержимое вы видете, когда читаете DR), а из второго передаются (в него они попадают, когда вы пишете в DR).

Я надеялся, что байт на отправку он в старшие 8 бит запишет rolleyes.gif rolleyes.gif Ну да ладно... не хочет на отправку байты показывать - фиг с ним.
Но я ту при инициализации SPI данные на отправку записал 0b01010101 - получилось! А в подпрограмме записывать не хочет. Данные анализатора тоже в скрине.


Еще интересней. Поставил BreakPoint чуть ниже. Он данные из подпрограммы записал. Такое ощущение, что он не успевает байт в буфер на отправку закидывать, а Master с него уже новую отправку тактирует.

Сообщение отредактировал RAmsi - Jul 29 2016, 09:18
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение
Прикрепленное изображение


Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 08:58
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016