I2C не хочет отправлять повторный старт

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Аватара пользователя
Roman Solovey
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт фев 05, 2019 17:20:08
Откуда: Днепр, Украина
Контактная информация:

I2C не хочет отправлять повторный старт

Сообщение Roman Solovey »

Приветствую. Столкнулся с проблемой. Имею контролер STM32F103C8T6. Пытаюсь на нем реализовать работу I2C на прерываниях. Проблема заключается в следующем. В момент когда нужно отправить рестарт этого не происходит. Прерывания ITBUFEN выключены, пользуюсь только ITEVFEN.
Последовательность следующая: Старт - отправка адреса - отправка адреса регистра (с которого читать) - отправка повторного старта. (тире это вход в прерывание) Так вот, после отправки второго старта ничего не происходит.
НО, если я перед отправкой повторного старта считаю DR, то повторный старт отправиться.

Код: Выделить всё

(void)I2C2->DR;
I2C2->CR1|=I2C_CR1_START;

Есть и другой вариант, после установки старт отправить в регистр DR какой то мусор то старт произойдет. И мусор не будет отправлен.

Код: Выделить всё

I2C2->CR1|=I2C_CR1_START;
I2C2->DR=0x55;

Есть еще вариант, когда передаю последний байт адреса регистра, сразу записать старт, то когда зайду в прерывание для отправки старта и отправлю его еще раз то старт передается. В чем может быть проблема? Что я делаю не так?
Такое чувство буд то не сбрасывается какой то флаг, и не дает отправить старт. Хотя в этот момент смотрел отладчиком, и ничего такого не увидел.
Так же пробовал делать паузу между отправкой рестарта, это не помогло.
В само прерывание для отправки старта заходит, но он не генерируется.
Вложения
I2C.c
(17.95 КБ) 90 скачиваний
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: I2C не хочет отправлять повторный старт

Сообщение azhel12 »

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

In master mode, setting the START bit causes the interface to generate a ReStart condition at the end of the current byte transfer.

Изображение
Аватара пользователя
Roman Solovey
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт фев 05, 2019 17:20:08
Откуда: Днепр, Украина
Контактная информация:

Re: I2C не хочет отправлять повторный старт

Сообщение Roman Solovey »

Но так не работает. Если я в прерывании когда записывается последний байт регистра адреса в DR устанавливаю старт, то он не формируется. Проверял. А вот если я помимо этого старта напишу еще один старт, который отправлю в прерывание которое появится после отправки последнего байта, то он отправиться...
Одержать сто побед в ста битвах — это не вершина воинского искусства. Повергнуть врага без сражения — вот вершина.
Ответить

Вернуться в «ARM»