Приветствую.
Столкнулся со следующей проблемой: имеется ведомое SPI устройство, работающее в SPI Mode 3 (CPOL=1, CPHA=1). Особенность данного устройство в том, что оно выдаёт последний бит на MISO укороченный, то есть после нарастающего фронта (из 0 в 1) SCK примерно через 250-350 нс данные исчезают. Но, по идее, этого должно быть более чем достаточно, чтобы захватить бит. Если я всё правильно понимаю, то данные на MOSI и MISO должны захватываться по одному фронту тактирующего сигнала: http://upload.wikimedia.org/wikipedia/commons/6/6b/SPI_timing_diagram2.svg
Не похоже, что проблема софтовая, ибо вместо atmel_spi заводил bitbang-драйвер. Эффект тот же самый - теряется последний бит в зависимости от фазы луны, раз на раз не приходится.
Добавлю парочку осциллограм для пояснения.
Итак, на осциллограммах видны следующие кривые:
зелёный (4) - MISO;
пурпурный (3) - SCK;
синий (2) - MOSI;
1. http://img-fotki.yandex.ru/get/5823/34036614.0/0_795f0_cf1cca27_L.jpg
2. http://img-fotki.yandex.ru/get/4423/34036614.0/0_795f1_fc8f4317_L.jpg
На первом графике показано чтение байта 0x55, обратите внимание на продолжительность последего бита.
На втором графике этот самый последний бит.
Интервал между rising edge SCK и falling edge MISO около 300 нс, чего должно быть более чем достаточно, но бит почему то не захватывается.
P.S. почему не получается прикрепить файлы или вставить лин на внешнее изображение?
при написание сообщения для вставки картинки с внешнего ресурса нажимаем самую правую пиктограмму, в тело сообщения попадает конструкция тега: {img=center alt=title}{/img}
где вместо фигурных скобок квадратные. между }{ вставляем полный url для картинки и все должно отобразится (для радикал.ру это первая строка)
эм какбы а что за устройство такое интерресное с укороченным битом? это вообсчето вроде неправильно по протаколу SPI. Чип селект как выглядит? может быть он поднимается слишком рано поэтому устройство и перестает выдавать данные. Так визуально все ок, может контроллер SPI работает не так как хочется, а так как запрограммирован :) ну тобишь конфигурация у него неправильная.
Это SPI-to-I2C мост NXP SC18IS600. Нужен он, потому что требуется гальваническая развязка, а SPI развязать явно проще. Железка вообще весьма бажная.
Хорошо выглядит, поднимается через несколько микросекунд (~5 us). Я даже в spi_transfer.delay_usecs задержку дополнительную ставил.
С софтовым SPI на тех же пинах абсолютно тот же эффект.
подтяжки на линиях есть(внешние или внутренние, выход может быть ОС)? иногда бывает тыкаешься осциллографом и этого уже бывает достаточно чтоб все стало ок. Сними осциллограмму именно той пачки где бит потерялся.
Мост всё рано уже поставили, и переделывать плату желания не много. К тому же драйвер для AT91 TWI помечен как BROKEN, и очень настоятельно рекомендуется использовать битбанговую софтовую реализацию.