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

 
 
> Работа с IrDA
d7d1cd
сообщение Dec 15 2013, 13:21
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Привет всем. Возникла у меня задача написать самозагрузчик флешь памяти по инфракрасному порту. Микроконтроллер MSP430F249, однако сам передатчик IrDA подключен к выводам 19 (TX) и 15 (RX), то есть ни к одному из модулей USCI доступа нет.
Подскажите, возможно ли организовать обмен, не используя прерывания и таймер? Планируется написать программу самозагрузки, которая будет выполняться из RAM.

Сообщение отредактировал d7d1cd - Dec 15 2013, 13:23
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
d7d1cd
сообщение Dec 16 2013, 17:12
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Спасибо за подсказки. Изменить схему подключения к сожалению нельзя (хотя очень хочется). Я пишу на ассемблере. Думаю, что выдержать временные циклы будет не так сложно, ведь известно сколько тактов занимает та или иная инструкция, а частота тактирования мне известна. Есть другой камень преткновения: физический принцип работы инфракрасного канала. Мне необходимо организовать обмен на скорости 9600 бит/с, без проверки на четность/нечетность, 1 стоп-бит.
Подскажите, правильно ли я рассуждаю.
1. Чтобы передать байт, надо кроме 8 бит данных передавать старт и стоп биты.
2. Старт бит - это 1, стоп бит - это 0.
3. Передача 1 по инфракрасному каналу - это отсутствие импульса, передача 0 это наличие импульса.
4. Длительность импульса должна быть 3/16 от времени, приходящегося на передачу 1 бита на скорости 9600.
5. Длительность передачи 1 бита: 1 / 9600 = 0,0001 с; длительность импульса: 0,0001 * 3 / 16 = 0,00002 с.
6. Импульс должен произойти в любом месте отрезка времени передачи бита.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 16 2013, 19:16
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Dec 16 2013, 22:12) *
Подскажите, правильно ли я рассуждаю.

Почти правильно.
Уровни UART не просто определяются как лог.1. и лог.0, а именуются MARK (неактивный уровень, лог.1 на выходе UART) и SPACE (активный, лог.0 на выходе UART). SPACE в IrDA передается импульсом, MARK - отсутствием импульса. START-бит передается как SPACE, т.е. наличием импульса. Иначе как вы определите начало символа? STOP-бит передается уровнем MARK (отсутствием импульса).
Последний пункт у вас неверный. Импульс должен передаваться не в любом месте битового интервала, а строго посередине его.
Насчет легкости реализации. Учитывайте, что если вы не будете использовать аппаратные возможности TimerA, то вам придется делать polling (опрос входа) RX как минимум 16*9600=153600 раз/с. Т.е. с учетом циклов и переходов MCLK у вас (навскидку/грубо) должен быть не менее 4МГц и кратен битовой частоте передачи/приема.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Dec 18 2013, 14:48
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(rezident @ Dec 16 2013, 23:16) *
Последний пункт у вас неверный. Импульс должен передаваться не в любом месте битового интервала, а строго посередине его.

В указанном документе MSP430C112 IrDA SIR Encoder/Decoder я узнал, что инфракрасный импульс должен передаваться не строго посередине битового интервала, а должен начаться строго посередине этого интервала.
Чем больше я думаю о реализации своего "чисто программного" обмена, тем больше понимаю, что не так уж это просто rolleyes.gif.

Хочу следовать Вашему совету и использовать таймер А. У таймера будут прерывания. Так как я планирую выполнять полную перезапись флешь памяти, то использовать вектора прерываний нельзя. Значит надо делать постоянный опрос флага прерывания таймера. Правильно? Или же можно перенести таблицу прерываний в RAM (где то читал, что так можно сделать на некоторых МК)?
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 18 2013, 16:36
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Dec 18 2013, 19:48) *
В указанном документе MSP430C112 IrDA SIR Encoder/Decoder я узнал, что инфракрасный импульс должен передаваться не строго посередине битового интервала, а должен начаться строго посередине этого интервала.

Да, это так. Согласен.
Цитата(d7d1cd @ Dec 18 2013, 19:48) *
У таймера будут прерывания. Так как я планирую выполнять полную перезапись флешь памяти, то использовать вектора прерываний нельзя. Значит надо делать постоянный опрос флага прерывания таймера. Правильно?

Не обязательно. Прерывания должы быть запрещены лишь во время записи/стирания Flash. А между циклами записи/стирания - пожалуйста. Приняли по прерываниям в буфер, запретили прерывание, записали буфер во Flash, разрешили прерывание и т.д. Вот только переписывать сектор с векторами прерываний при таком раскладе не рекомендуется. При неудачном стечении обстоятельств можно получить нерабочий кристалл, который только через BSL можно будет стереть.
Цитата(d7d1cd @ Dec 18 2013, 19:48) *
Или же можно перенести таблицу прерываний в RAM (где то читал, что так можно сделать на некоторых МК)?

В сериях MSP430F5xxx/6xxx есть аппаратная поддержка ремапа векторов прерываний в ОЗУ. У других серий можно реализовать программную эмуляцию ремапа, но опять же в обоих случаях сектор с векторами прерываний переписывать не стоит.
Go to the top of the page
 
+Quote Post
d7d1cd
сообщение Dec 18 2013, 17:28
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199



Цитата(rezident @ Dec 18 2013, 20:36) *
Не обязательно. Прерывания должны быть запрещены лишь во время записи/стирания Flash. А между циклами записи/стирания - пожалуйста. Приняли по прерываниям в буфер, запретили прерывание, записали буфер во Flash, разрешили прерывание и т. д. Вот только переписывать сектор с векторами прерываний при таком раскладе не рекомендуется. При неудачном стечении обстоятельств можно получить нерабочий кристалл, который только через BSL можно будет стереть.

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

Скажите, а чем плох метод циклического опроса флага наличия прерывания таймера? И имеет ли он право на существование?
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 20 2013, 20:55
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(d7d1cd @ Dec 18 2013, 22:28) *
Скажите, а чем плох метод циклического опроса флага наличия прерывания таймера? И имеет ли он право на существование?

Не плох. Имеет. Когда основаная задача только одна и состоит она в том, чтобы следить за состоянием флага прерывания sm.gif Хотя в простом загрузчике (без шифрования потока) по сути это так и есть.
Go to the top of the page
 
+Quote Post



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

 


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


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