У меня недостаточно информации, чтобы сказать наверняка, но я предполагаю, что ваше SPI-соединение установлено неправильно.
В частности, я полагаю, вы забыли установить /SS
в качестве вывода, так же, как эта проблема или это .
В таблице указано:
Режим мастера, когда SPI настроен как мастер (MSTR в SPCR установлено), пользователь может определить направление вывода SS.
Если SS настроен как выход, это вывод общего вывода, который не влияет на систему SPI. , Как правило, этот вывод будет управлять выводом SS ведомого SPI.
Если SS настроен как вход, он должен поддерживаться на высоком уровне, чтобы обеспечить работу главного SPI. Если на вывод SS подается периферийная схема, когда SPI сконфигурирован как ведущий, а вывод SS определен как вход, система SPI интерпретирует его как другой ведущий, выбирающий SPI в качестве ведомого и начинающий отправлять на него данные. Чтобы избежать конфликта шин, система SPI выполняет следующие действия:
- Бит MSTR в SPCR очищается, и система SPI становится подчиненной. В результате того, что SPI становится подчиненным, контакты MOSI и SCK становятся входами.
- Устанавливается флаг SPIF в SPSR, и если прерывание SPI включено, и бит I в SREG установлен, подпрограмма прерывания будет выполнена.
Таким образом, когда SPI-передача, управляемая прерыванием, используется в основном режиме, и существует вероятность того, что SS работает на низком уровне, прерывание всегда должно проверять, что бит MSTR все еще установлен. Если бит MSTR был очищен при выборе ведомого устройства, он должен быть установлен пользователем для повторного включения основного режима SPI.
Итак, вам просто нужно настроить вывод /SS
в качестве выхода и установите высокий в вашем коде инициализации, это должно решить вашу проблему:
DDRB |= (1 << PB0); // Set /SS (PB0) as output
PORTB |= (1 << PB0); // Set /SS (PB0) high