Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC1768 как очистить TX FIFO SSP слейва?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
GetSmart
Собственно вопрос. По поводу очистки RX FIFO можно вычитать до упора и даже больше регистр данных.
Вопрос интересен для ситуации, когда мастер выключил SS, а в TX FIFO слейва остались старые данные, которые надо обновить для работы с новым фреймом. (фрейм в данном случае - последовательность слов, объединённых неразрывным SS).
swisst
по примеру UARTa бита FIFO Reset я не нашел. предлагаю пойти тем же путем, что и с RX FIFO - писать полный фрейм. если фрейм меньше глубины FIFO - дополнять чем-нибудь.
GetSmart
Хорошая идея.
Жаль SSP в этом проце какой-то недоделанный. Нет прерывания изменения SS, нельзя работать пословно через прерывания, хотя флаги в регистре статуса присутствуют. FIFO не отключается. И ещё много нужного нет. Почему-то.
jcxz
Насколько помню, SSP0 можно использовать как SPI (он на тех же ногах), а в нём FIFO нет.
Ещё можно (я так делал) подогнать размер пересылаемого кадра под кратный половине FIFO, изменяя разрядность данных, и получать в конце него половинное прерывание.
GetSmart
Пороверил работу SSP на LPC1114/301. Вроде бы у них почти одинаковый SSP. Оказывается нельзя забивать FIFO "выше крыши". Лишние данные не принимаются. Даже запись CR1 = 0; CR1 = 6; не помогает для очистки (выключение SSP и включение). Помогло CR1 = 0; затем сброс через PRESETCTRL и далее полная переинициализация SSP. При этом FIFO полностью очистился.

Ещё интересная деталь. При работе в слейве с CPOL = CPHA = 0 обязательно между словами нужно передёргивать SS. Иначе на MISO будет постоянно удерживаться последний (младший) бит первого переданного слова до сброса SS. При CPOL = CPHA = 1 такой фичи нет.

И ещё полубага с FIFO. Слейв, при отсутствии новых TX-данных, должен передавать последнее загруженное слово. В процессорах без FIFO оно так и работает. Например, можно один раз загрузить рег.данных нулём и таким образом сигнализировать мастеру отсутствие готовности слейва, пока он не начнёт загружать в регистр данных что-то реальное. Здесь же слейв после передачи последнего загруженного слова смещает указатель FIFO ещё на один элемент вперёд и на нём останавливается, передавая только его. А там находится заранее непредсказуемое значение из ранее загруженных. Аппаратно глюк заключается в пост-инкременте указателя при записи в FIFO. А догоняющий указатель доходит до впереди идущего и останавливается. Будь там пред-инкремент, было бы всё ОК.
megajohn
Цитата(GetSmart @ Oct 12 2013, 12:20) *
И ещё полубага с FIFO


отпишитесь плз в Support. Чтобы NXP были в курсе.
GetSmart
У меня нет такой возможности.
GetSmart
Кажется ещё одна полубага. Возможно, сброс через PRESETCTRL вводит пины SSP в режим мастера.

При работе SSP в слейве для сброса FIFO приходится (как описано ранее) переинициализировать SSP. При этом пины, сконфигурированные в IOCON как работающие с SSP на короткое время активируются в мастер-режиме. При этом линия SS занимается "перетягиванием каната" с настоящим мастером и там наблюдается логический уровень примерно половина от 3.3 вольт. На SCK то же самое, хотя это уже частично из-за того, что мои мастер и слейв в разных режимах SPI работают, 0 и 3 соответственно.

Переинициализация происходит так
Код
        SSP0CR1 = 0x04;
        PRESETCTRL_bit.SSP0_RST_N = 0;
        PRESETCTRL_bit.SSP0_RST_N = 1;
        SSP0IMSC = 0x05;
        SSP0CR0 = 0x0cf;
        SSP0CPSR = 2;
        SSP0CR1 = 0x06;
        SSP0SR;

При отключении SSP в первой команде бит слейва остаётся включённым, но всё-равно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.