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

 
 
> 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



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

 


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


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