ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
7 июня
1522987 Топик полностью
Nikolay_Po (Вчера, 15:38, просмотров: 39) ответил IBAH на Разговор о том, что флаг RXNE выставляется, по факту не когда происходит завершение приема, а на несколько десятков тактов проца позже (в моем случае гдето 500нС). В результате стоишь тупо ждешь RXNE!=0, как дебил. С флагом BSY та же история.
Это у вас ошибочка. Вы ждёте лишнего следующего символа. Нет у периферии такой памяти, чтобы задержать сигнал на на кучу тактов. Вы просто промахиваетесь с приёмом. Или пропускаете бит байт (тогда будет поднят флаг оверфлоу, проверьте), или принимаете и упускаете один, а потом ждёте лишнего. 

Попробуйте делать передачу нужного количества байт по TXE, как обычно. А приём в прерываниях с RXNE. И просто передавайте нужное количество байт, а приём пусть разгребает сколько придёт. Затем, после передачи всех нужных байт, ждёте падения BSY и забираете всё, что "упало" в буфер приёма.

Рекомендую так же, перед или после транзакции, сбрасывать ошибки (вдруг шальная залетит) последовательностью: сначала чтение регистра статуса затем чтение регистра данных. Можно даже просто обращением к ним, без анализа:


SPI1->SR;
SPI1->DR;


Всё. Это гарантирует, что даже если произошёл сбой по линии CLK и залетел лишний символ, интерфейс не зависнет в ошибке.


P.S. Если, вдруг, у вас и передача по прерываниям, то проверяйте RXNE и в начале, и в конце обработчика. Чтобы не упустить байт. Такое становится возможным при большой нагрузке на МК.