|
Реализация SPI в AVR |
|
|
|
Sep 25 2013, 14:45
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(vladimir_orl @ Sep 25 2013, 17:13)  Здравствуйте. Имеется SPI-slave устройство, которое я пытаюсь сэмулировать с помощью mega128. Единственное отличие между оригиналом и клоном, подключенными к SPI-мастеру - разница в уровнях на линии miso в паузах между посылками. В оригинале в паузах miso всегда выставляется в "1". А в AVR-овском SPI уровень MISO в паузе зависит от последнего бита. Отключать линию - тоже не вариант, т.к. надо быть постоянно "начеку". Т. к. мы не знаем когда начнётся следующая посылка. Режим передачи данных - третий. Кто-нибудь сталкивался с подобными вещами? Тема озвучена в ветке "AVR" а не в ветке "протоколы", т.к. насколько я понимаю это именно такая реализация в данном семействе МК. Классическая ошибка при имплементации I2C. Проблема в том, что вы неправильно передаете высокий логический уровень. Его надо передавать не записывая единицу в соответствующий бит, а настраивая этот бит на вход. Тогда он станет высокоимпедансным и будет притянут резистором вверх. В вашем случае выход вашего слейва дает единицу, а мастера ноль и идет огромный ток. Это довольно опасная ситуация, хотя я не помню чтобы что-нибудь сгорело
|
|
|
|
|
Sep 25 2013, 15:01
|
Гуру
     
Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954

|
Цитата(vladimir_orl @ Sep 25 2013, 20:13)  Здравствуйте. Имеется SPI-slave устройство, которое я пытаюсь сэмулировать с помощью mega128. Единственное отличие между оригиналом и клоном, подключенными к SPI-мастеру - разница в уровнях на линии miso в паузах между посылками. В оригинале в паузах miso всегда выставляется в "1". А в AVR-овском SPI уровень MISO в паузе зависит от последнего бита. Отключать линию - тоже не вариант, т.к. надо быть постоянно "начеку". Т. к. мы не знаем когда начнётся следующая посылка. Режим передачи данных - третий. Кто-нибудь сталкивался с подобными вещами? Тема озвучена в ветке "AVR" а не в ветке "протоколы", т.к. насколько я понимаю это именно такая реализация в данном семействе МК. chipselect если отпустить, то avr тогда и mosi должен отпустить болтаться (автоматически будет переключаться на вход), ну и чтобы в "1" был - подтянуть к питанию. в единицу переключать mosi после последнего клока и с активным чипселектом никто не обязан. Цитата 19.3 SS Pin Functionality 19.3.1 Slave Mode When the SPI is configured as a Slave, the Slave Select (SS) pin is always input. When SS is held low, the SPI is activated, and MISO becomes an output if configured so by the user. All other pins are inputs. When SS is driven high, all pins are inputs, and the SPI is passive, which means that it will not receive incoming data. Note that the SPI logic will be reset once the SS pin is driven high.
|
|
|
|
|
Sep 26 2013, 05:12
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 18-09-12
Из: Орёл
Пользователь №: 73 591

|
Цитата На slave чипселект после каждого байта включается-выключается самим slave-ом. Это я так сделал. Потому как не мог ничего лучше придумать. И линии SS нет.
|
|
|
|
|
Sep 26 2013, 10:59
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 18-09-12
Из: Орёл
Пользователь №: 73 591

|
Да. Это нестандартный SPI. Но в том-то и дело что его надо на AVR mega сделать. Вот сейчас натолкнулся в даташите на SAM4S (раздел про SPI):
Наверное и в мегах то же. Буду дальше думать... - MISO - * Not defined, but normally MSB of previous character received.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|