Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Сб фев 25, 2023 10:12:40

Приветствую. Столкнулся с проблемой. Имею контролер 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 KiB) Скачиваний: 53

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

Сб фев 25, 2023 10:21:45

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

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

Изображение

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

Сб фев 25, 2023 10:36:36

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