777777 0 1 сентября, 2011 Опубликовано 1 сентября, 2011 (изменено) · Жалоба Там для чего-то сделали отдельные прерывания приемника и передатчика. Но ведь это одно и то же! Допустим, я принимаю данные с устроства, для этого я сначала должен ему что-то передать. Могу ли я в прерывании передатчика считывать байт из DR? Есть ли гарантия, что он там уже есть? Ведь если байт передан, то это автоматически означает что и байт с устройства принят. И наоборот - если произошло прерывание премника и я считал байт, значит ли это, что SPI готов передавать следующий? Изменено 1 сентября, 2011 пользователем 777777 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба Есть буфер передачи, и есть сдвиговый регистр. Прерывание передатчика возникает при опустошении буфера. Сдвиговый регистр в это время ещё не пуст, и передача ещё идёт. Это обеспечивает непрерывность передачи. Соответственно, считывать принятый байт надо в прерывании от приёмника, в прерывании от передатчика он ещё не готов. Добавлю, что сбрасывать чипселект нужно чуть позже, чем возникнет прерывание от приёмника последнего байта. Потому что в момент этого прерывания клок ещё не дотикал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Flexz 0 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба Чипселект можно снимать при получении последнего RXNE. Еще перед началом передачи стоит вычитывать DR дабы удостовериться, что прерывание RXNE не возникнет сразу после включения SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба Есть буфер передачи, и есть сдвиговый регистр. Прерывание передатчика возникает при опустошении буфера. Сдвиговый регистр в это время ещё не пуст, и передача ещё идёт. Это обеспечивает непрерывность передачи. Значит можно пользоваться только прерыванием приемника? Максимум что от этого будет - промежутки в передаче байтов. Добавлю, что сбрасывать чипселект нужно чуть позже, чем возникнет прерывание от приёмника последнего байта. Потому что в момент этого прерывания клок ещё не дотикал. А почему же прерывание возникло если последний клок не дотикал? Об этом написано в даташите? В любом случае, я полагаю, что пока программа войдет в прерывание, он уже дотикает? Частота SPI 1.25 МГц. Еще перед началом передачи стоит вычитывать DR дабы удостовериться, что прерывание RXNE не возникнет сразу после включения SPI. У меня сложилось впечатление, что если его не вычитывать, то новая передача не начинается вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба Значит можно пользоваться только прерыванием приемника? Максимум что от этого будет - промежутки в передаче байтов. Да. А почему же прерывание возникло если последний клок не дотикал? Об этом написано в даташите? В любом случае, я полагаю, что пока программа войдет в прерывание, он уже дотикает? Частота SPI 1.25 МГц. Потому что прерывание возникает сразу же, как только защёлкнется последний бит байта. То есть, при CHPA=0 - по первому перепаду SCK. Даташит про это явно не говорит. Это - практические грабли:) Успеет или нет дотикать за время входа в прерывание - посмотрите по осциллографу. Думаю, что придётся добавить несколько NOP-ов. Чипселект можно снимать при получении последнего RXNE. Нет. См. выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
777777 0 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба Потому что прерывание возникает сразу же, как только защёлкнется последний бит байта. То есть, при CHPA=0 - по первому перепаду SCK. Даташит про это явно не говорит. Это - практические грабли:) А, понятно, но ведь это уже не страшно - последний бит уже защелкнулся, а что там будет с устройством при убирании чипселекта - нас уже не интересует. Впрочем, зависит от устройства. Успеет или нет дотикать за время входа в прерывание - посмотрите по осциллографу. Думаю, что придётся добавить несколько NOP-ов. Несколько NOP-ов не страшно, у меня же проблема хуже - у меня тут дурная микросхема ADS1282, там даташит требует чтобы между байтами были паузы не меньше 6 мкс. А у меня при синхронизации по RXNE паузы получились 1,5...2 мкс. Вот не знаю как их обеспечить - задержку в обработчике прерывания лепить некрасиво, а заряжать таймер на 6 микросекунд - тоже глупо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 1 сентября, 2011 Опубликовано 1 сентября, 2011 · Жалоба А, понятно, но ведь это уже не страшно - последний бит уже защелкнулся, а что там будет с устройством при убирании чипселекта - нас уже не интересует. Впрочем, зависит от устройства. При чтении действительно не важно. А вот при записи... Что если устройство ещё не успело защёлкнуть последний бит? Или ему непременно нужны все такты клока для того чтобы обработать команду? Не, тут лучше перестраховаться. заряжать таймер на 6 микросекунд - тоже глупо. Почему же глупо? Это очень приличное время по меркам 72МГц, 432 такта. Вполне можно зарядить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться