Принцип работы с периферией на прерываниях.

Фикс, окончательная (Думаю) версия.

Порезал глобальные переменные и допилил все функции, думаю если написать будет работать.

Напрягает, что это решение поддерживает только устройства с емкостью не выше 256 байт. Но это легко допилится путем расширения массива последовательностей и добавления 1й переменной. Мне кажется... lol.

О кстати, она же у меня с гугл диском синхронизируется!

И да, сам вопрос и суть темы потерялся как то...

Стоит ли это использовать или искать более простой способ?

Потому что на этом опыте, я, думаю, буду строить все свои отношения с периферией на прерываниях. И понять как лучше сделать, для меня важнее, чем заставить это работать.

КомментыФункция работает в фоновом режиме и проверяет параметр "состояние шины". Для начала общения по I2C внешней функцией в структуру загружается (адрес микросхемы, адрес ячейки, флаг R/W и кол-во байт для операции), а так же изменяется состояние шины на "Занята I2C" (если шина свободна). Далее функция работает пошагово, интерпретируя номер шага в адрес внутренних функций, согласно массиву последовательности.

1) Проверяется состояние шины, если она занята SPI, функция переходит к обработке по другой ветке (ее еще писать =)), если "шина свободна" или "ожидает прерывания" (идет отправка\прием данных), либо "ожидает изъятия данных" из буфера, действие не требуется. Если шина "занята I2C", функция переходит к обработке.

2) Происходит интерпретация номера шага и тип передачи(R\W) в адрес внутренней функции. (Таблицы прилагаются).

4) Проверяется номер шага, если он меньше 4х то шаг инкрементируется. Иначе нет, дальнейшие операции с шагом выше 4го происходят внутри функций.

5) Переход на внутреннюю функцию по поинтеру.

6) Исполнение функции и выход в ожидание прерывания.

7) Когда функция вышла в готовность принимать\отправлять данные. (Шаг 5 для приема\ шаг 4 для передачи) Управление шагом передается внутренним функциям приема и передачи.

Передача

1) Функция загружает байт согласно счетчику(Кол-во данных) из массива данных в буфер.

2) После чего уменьшает счетчик.

3) Если счетчик становиться равен FF, значит передача окончена и байт отправлять не надо. Через поинтер вызывается функция выхода.

4) Если счетчик не равен FF, в поинтер загружается адрес функции отправки байта.

5) Шаг декрементируется и следующим действием будет проверка ACK. (согласно таблице).

6) Через поинтер вызывается функция отправки байта.

Прием

1) Проверяется флаг Ответ (установлен по умолчанию) если сброшен, значит передача окончена и слейву был отослан NACK. Через поинтер вызывается функция выхода.

2) Проверяется флаг Прием, если он не установлен, через поинтер вызывается функция приема байта.

3) Иначе означает, что в регистре USI находится принятый байт, он запихивается согласно счетчику(Кол-во данных) в массив данных.

4) Счетчик декрементируется.

5) Если счетчик становится равен 0xFF, это означает, что все данные получены и необходимо выслать NACK. Флаг ответ убирается.

6) Иначе надо отправить ACK

7) Через поинтер вызывается функция отправки ACK\NACK.

Сами 4 функции работы с портом и USI очевидны.

Прерывание просто запрещает само себя и изменяет состояние шины на Занято I2C.

[256 Кб]

[66.1 Кб]