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

 
 
> STM32F407V I2C в slave тема конечно избитая
Pat
сообщение May 12 2018, 11:21
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Здравствуйте, Уважаемые Друзья.

Есть I2C МАСТЕР который передает и принимает данные.

У меня реализован I2C подчиненный который принимает и отдает данные.

Мастер ведет себя не совсем корректно по отношению к протоколу I2C.

Он делает запрос чтения к моему устройству примерно так

СТАРТ->АДРЕСС ЗАПИСИ->ДАННЫЕ, а потом при низком SCL переводит SDA в высокий уровень.
Затем снова выдет
СТАРТ->
АДРЕСС ЧТЕНИЕ-> читает данные после чего выдает СТОП.

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

Вот тут затыка.

В режиме
I2C слайв не работает прерывание SB (было сгенерированно условие СТАРТ).

Есть еще флаг BERR (Bus error) но он не реагирует на что либо после передачи байта.

Может кто сталкивался с подобным.



Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Arlleex
сообщение May 12 2018, 13:33
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата
СТАРТ->АДРЕСС ЗАПИСИ->ДАННЫЕ, а потом при низком SCL переводит SDA в высокий уровень.

В режиме передачи Master не управляет битом подтверждения ACK, а вот Вы, как Slave, его выдаете. Почему Вы NACK выдаете - это Вам надо разобраться. Master тут не при чем, он делает все правильно. Более того, Master в конце чтения последнего байта должен выставить Вам NACK перед выставлением STOP-сигнала.
Цитата
Вот тут затыка.

Зачем Вам SB, если у Вас есть замечательное прерывание ADDR? Оно придет после того, как Вы Slave-ом примете свой (или альтернативный, в STM32 их несколько) физический адрес устройства.
Go to the top of the page
 
+Quote Post
Pat
сообщение May 12 2018, 14:56
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Цитата(Arlleex @ May 12 2018, 15:33) *
В режиме передачи Master не управляет битом подтверждения ACK, а вот Вы, как Slave, его выдаете. Почему Вы NACK выдаете - это Вам надо разобраться. Master тут не при чем, он делает все правильно. Более того, Master в конце чтения последнего байта должен выставить Вам NACK перед выставлением STOP-сигнала.

Зачем Вам SB, если у Вас есть замечательное прерывание ADDR? Оно придет после того, как Вы Slave-ом примете свой (или альтернативный, в STM32 их несколько) физический адрес устройства.


С подтверждением там все в порядке.
Мастер передал последний байт.
Слейв ему сказал ACK.
Затем мастер делает следующее

SCL = 0
SDA = 1
SCL = 1
SDA = 0 - это новый старт без стопа.

С чтением как раз все ОК есть и NAK и СТОП.

Прерывание ADDR использую, но оно приходит после передачи адреса (запроса чтения).
В программе есть обработка данных их нужно успеть приготовить для мастера.
Поэтому ищу как понять что мастер окончил передавать.
Но получается что аппаратно никак.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 12 2018, 15:49
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Arlleex @ May 12 2018, 16:33) *
. . .
Master в конце чтения последнего байта должен выставить Вам NACK перед выставлением STOP-сигнала.


Цитата(Pat @ May 12 2018, 17:56) *
. . .Мастер передал последний байт.
Слейв ему сказал ACK . . . .
Мастер, выставляя на последнем байте NACK, информирует слейва, что это - последний байт.
Возможно, что и формирование STOP или ReSTART мастером завязано на установку передачи этого бита в узле I2C.
Наличие установленного мастером NACK на позиции ACK видится слейвом и должно установить флаг прерывания.
Go to the top of the page
 
+Quote Post
Pat
сообщение May 12 2018, 16:56
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 421
Регистрация: 27-05-05
Из: Энергодар
Пользователь №: 5 480



Цитата(k155la3 @ May 12 2018, 17:49) *
Наличие установленного мастером NACK на позиции ACK видится слейвом и должно установить флаг прерывания.


Это так и происходит, но это мастер читает из слейва.
Там все ок и NACK есть и СТОП тоже генерируется.
Это чтение из слейва, проблемы при записи в слейв.

Как оно работает.
Мастеру нужно получить какое то количество байт из слейва.
Для этого он пишет в слейв команду (типа отдай данные из регистра в количестве хх байт).
По протоколу после этого мастер должен выдать СТОП и потом начать чтение.
Но мастер СТОП не генерит, а тихонько поднимает SDA SCL в 1 и выдает повторный СТАРТ.

Дальше при чтение все как и положено в последнем байте NACK и СТОП.

NACK я отлавливаю в прерывании тут все нормально работает.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 13 2018, 11:32
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Pat @ May 12 2018, 19:56) *
. . . По протоколу после этого мастер должен выдать СТОП и потом начать чтение. . . .
По-логике, для "два-в-одном" пакетов-комнад, которые предусматривают двойную функцию запись+чтение
используется ReSTART вместо стоп+старт. К тому что "прописал" Arlleex добавить нечего.
Посмотрите описание фреймов запрос-ответ для EEPROM повышенной емкости, где адрес задается 2 байтами.
(в первой часте фрейма идет запись адреса в слейв, во второй - чтение из слейва).

Цитата(Pat @ May 13 2018, 11:41) *
. . . Вот интересно почему в контроллере не реализовали прерывание на СТАРТ в slave.
Состояние "старт" отслеживается автоматом переферийного узла (аппаратно), и генерировать по нему прерывание, IMHO, смысла нет.
(байт еще не пришел, придет ли вообще - неизвестно, а если придет - то об этом будет выставлен другой флаг - что есть инф. в приемном буфере)
Потому-как этот узел для того и предназначен, чтобы не дергать процессор по всякой мелочи (ненужной).
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 12:41
Рейтинг@Mail.ru


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