|
Работа с IrDA |
|
|
|
 |
Ответов
|
Dec 16 2013, 17:12
|
Местный
  
Группа: Участник
Сообщений: 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. Импульс должен произойти в любом месте отрезка времени передачи бита.
|
|
|
|
|
Dec 16 2013, 19:16
|
Гуру
     
Группа: Свой
Сообщений: 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МГц и кратен битовой частоте передачи/приема.
|
|
|
|
|
Dec 18 2013, 14:48
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

|
Цитата(rezident @ Dec 16 2013, 23:16)  Последний пункт у вас неверный. Импульс должен передаваться не в любом месте битового интервала, а строго посередине его. В указанном документе MSP430C112 IrDA SIR Encoder/Decoder я узнал, что инфракрасный импульс должен передаваться не строго посередине битового интервала, а должен начаться строго посередине этого интервала. Чем больше я думаю о реализации своего "чисто программного" обмена, тем больше понимаю, что не так уж это просто  . Хочу следовать Вашему совету и использовать таймер А. У таймера будут прерывания. Так как я планирую выполнять полную перезапись флешь памяти, то использовать вектора прерываний нельзя. Значит надо делать постоянный опрос флага прерывания таймера. Правильно? Или же можно перенести таблицу прерываний в RAM (где то читал, что так можно сделать на некоторых МК)?
|
|
|
|
|
Dec 18 2013, 16:36
|
Гуру
     
Группа: Свой
Сообщений: 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 есть аппаратная поддержка ремапа векторов прерываний в ОЗУ. У других серий можно реализовать программную эмуляцию ремапа, но опять же в обоих случаях сектор с векторами прерываний переписывать не стоит.
|
|
|
|
|
Dec 18 2013, 17:28
|
Местный
  
Группа: Участник
Сообщений: 442
Регистрация: 26-11-10
Пользователь №: 61 199

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